Just realized that map:merge() takes a *sequence* of maps, so this is wrong:
map:merge($m1, $m2) But this is correct: map:merge(($m1, $m2)) That clear in the spec examples (and of course in the function signature) but it still surprised me because I wasn't paying close attention and assumed the signature was (map1, map2). So my examples below need an addition set of parens around the values with map:merge() calls. Cheers, E. ---- Eliot Kimber, Owner Contrext, LLC http://contrext.com On 7/19/15, 10:40 AM, "Eliot Kimber" <[email protected] on behalf of [email protected]> wrote: >I don't know why I'm having such a hard time figuring out how to operate >on maps but I just can't get my head around it (I suspect procedural brain >damage but it could just be advancing age). I suspect others will or are >having the same challenge. > >My challenge of the day is: > >I have an existing map where each entry is a sequence mapped to a string >key, e.g.: > >let $m1 := map{ 'key1' : (), 'key2' : () } > >I then have a node and a set of key values. For each key I need to find >the entry with that key and add the node to the entry, e.g. > >let $newKeys := ('key1', 'key3') >let $obj := <added/> > >Let $m2 := for $key in $newKeys > (: Find sequence for key, > Add obj to sequence, > Update map entry for new key > :) > >I think the right answer is to use map:merge like so: > >let $m2 := > map:merge( > $m1, > lor $key in $newKeys > Map {$key, ($m1($key), $obj))} > ) > >Is my analysis correct? Is there a better way to do this sort of map >updating? > >Thanks, > >Eliot >---- >Eliot Kimber, Owner >Contrext, LLC >http://contrext.com > > > >_______________________________________________ >[email protected] >http://x-query.com/mailman/listinfo/talk > _______________________________________________ [email protected] http://x-query.com/mailman/listinfo/talk
