1

假设我在 XQuery 中定义了这样的地图:

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

如何在$x不知道密钥的情况下进行迭代?

例如:

for $key, $value in $x
(: Some processing and output :)
4

2 回答 2

4

来自XQuery 3.1 特性的 BaseX wiki

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)) }
)
于 2015-12-07T22:09:17.287 回答
2

我的两个示例都返回值增加1.

更“必要”的方法是获取所有键的列表,遍历它们并查找每个键的值:

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将(可能是匿名的)函数“映射”到映射上(这是函数式编程中将函数应用于列表或序列的每个值时的术语):

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 映射特性参考和教程。

于 2015-12-07T22:40:58.987 回答