如何在XQuery中迭代地图?

时间:2015-12-07 21:57:32

标签: xpath xquery saxon xquery-3.0

让我们说我在XQuery中定义了这样的地图:

/!NAME:\s+\".*?(Slot(?:\w|\s|\d+)+)\"/

如何在不知道密钥的情况下迭代declare namespace map="http://www.w3.org/2005/xpath-functions/map"; let $x := map{'a':1, 'b':2}

例如:

$x

2 个答案:

答案 0 :(得分:2)

来自the BaseX wiki on XQuery 3.1 features

  

map是一个函数项的事实允许它作为参数传递给期望函数项作为其参数之一的高阶函数。例如,以下查询使用高阶函数fn:map($f, $seq)从地图中提取所有绑定值:

let $map := map { 'foo': 42, 'bar': 'baz', 123: 456 }
return fn:for-each(map:keys($map), $map)

所以,假设你想用每个键和值调用do-some-processing()

declare namespace map="http://www.w3.org/2005/xpath-functions/map";
declare variable $map := map{'a':1, 'b':2};

declare function local:do-some-processing($key, $value) {
  (: deciding what to put here is your problem, not mine :)
  <key id="{$key}">{$value}</key>
};

fn:for-each(
  map:keys($map),
  function($k) { local:do-some-processing($k, $map($k)) }
)

答案 1 :(得分:1)

我的两个示例都返回了密钥,其值增加了1

更多&#34;命令式&#34;方法是获取所有键的列表,循环遍历它们并查找每个键的值:

declare namespace map="http://www.w3.org/2005/xpath-functions/map";
let $x := map{'a':1, 'b':2}
for $key in map:keys($x)
return $key || $x($key) + 1

更优雅,更实用的方法是使用map:for-each来映射&#34;映射&#34;一个(可能是匿名的)函数到地图上(这是函数编程中将函数应用于列表或序列的每个值时的术语):

declare namespace map="http://www.w3.org/2005/xpath-functions/map";
let $x := map{'a':1, 'b':2}
return map:for-each($x, function($key, $value) { $key || $value + 1 })

与大多数其他XQuery特性和功能不同,BaseX文档(通常限制于特定于BaseX的内容)提供了一个相当容易阅读和理解XQuery map feature的参考和教程。