[xquery-talk] Manipulating Maps In Non-Trivial Ways

Eliot Kimber ekimber at contrext.com
Sun Jul 19 09:08:16 PDT 2015

Just realized that map:merge() takes a *sequence* of maps, so this is

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.



Eliot Kimber, Owner
Contrext, LLC

On 7/19/15, 10:40 AM, "Eliot Kimber" <talk-bounces at x-query.com on behalf
of ekimber at contrext.com> 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
>Eliot Kimber, Owner
>Contrext, LLC
>talk at x-query.com

More information about the talk mailing list