[xquery-talk] From map entry pairs to a pair of arrays

Michael Kay mike at saxonica.com
Sat Jul 15 13:44:51 PDT 2017


Another possibility:

declare namespace map = "http://www.w3.org/2005/xpath-functions/map";
let $map := map { "a": 1, "b": 2, "c": 3 }
let $entries := map:for-each($map, function($k, $v){ [$k, $v] })
return (array{$entries!?1}, array{$entries!?2})

> 
> Here is yet another alternative that can be efficient (but it’s not
> the most compact one):
> 
>  let $map := map { "a": 1, "b": 2, "c": 3 }
>  return (
>    array { map:keys($map) },
>    array { map:for-each($map, function($key, $value) { $value }) }
>  )
> 

A disadvantage with this, and some other proposed solutions, is that the spec offers no guarantee that map:keys() and map:for-each() will iterate the entries of the map in the same order.

Note also that map:for-each($map, function($key, $value) { $value }) can be written $map?*

Michael Kay
Saxonica




More information about the talk mailing list