Xpath 如何在XQuery中迭代映射?

Xpath 如何在XQuery中迭代映射?,xpath,xquery,saxon,xquery-3.0,Xpath,Xquery,Saxon,Xquery 3.0,假设我在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 :) 发件人: 映射是函数项这一事实允许它作为参数传递给期望函数项作为其参数之一的高阶函数。例如,以下查询使用高阶函

假设我在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 :)
发件人:

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

let $map := map { 'foo': 42, 'bar': 'baz', 123: 456 }
return fn:for-each(map:keys($map), $map)
那么,假设您想调用对每个键和值进行一些处理:

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)) }
)
发件人:

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

let $map := map { 'foo': 42, 'bar': 'baz', 123: 456 }
return fn:for-each(map:keys($map), $map)
那么,假设您想调用对每个键和值进行一些处理:

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的键

更重要的方法是获取所有键的列表,循环它们并查找每个键的值:

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

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特定的内容,它提供了一个非常容易阅读和理解的参考和教程。

我的两个示例都返回值递增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:对于每个映射,将一个可能匿名的函数映射到map上,这是函数式编程中的术语,当将函数应用于列表或序列的每个值时:

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的内容,提供了一个相当容易阅读和理解的参考和教程。

BTW,这是作为尚未发布的XQuery 3.1而不是3.0的一部分指定的功能;假设您正在使用一个运行spec.BTW的引擎,这是作为尚未发布的XQuery 3.1而不是3.0的一部分指定的功能;假设你正在使用一个引擎来运行规范。如果我想对键做一些更复杂的操作怎么办。查看更新的问题,而不仅仅是输出它的值,然后将$map作为函数调用map本身,并将键作为参数替换为一个函数,该函数不。。。不管你想要什么更复杂的东西。如果你想要一个更好的答案,你需要提供一个更好的问题。如果我想做一些更复杂的钥匙怎么办。查看更新的问题,而不仅仅是输出它的值,然后将$map作为函数调用map本身,并将键作为参数替换为一个函数,该函数不。。。不管你想要什么更复杂的东西。如果你想要一个更好的答案,你需要提供一个更好的问题。