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

Eliot Kimber ekimber at contrext.com
Sun Jul 19 08:40:22 PDT 2015


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





More information about the talk mailing list