XPath 3.1 表达式为每个选定节点收集属性作为 name/value 映射

XPath 3.1 expression to collect attributes as name/value maps for each selected node

XPath 3.1 支持新的 map 特性,允许在结果序列中映射。 https://www.w3.org/TR/xpath-31/#id-maps

例如,这里是有效的 XPath 3.1 表达式,returns 2 个映射的硬编码序列:

(map {'a':1,'b':2,'c':3}, map {'x':-3,'y':-2,'z':-1})

我正在尝试使用此功能将节点属性收集为地图列表。

例如,对于给定的 xml:

<root>
  <node a="1" b="2" c="3"/>
  <node x="-3" y="-2" z="-1"/>
</root>

我如何制作一个简单的 XPath 表达式来获得以下结果:

[{'a':1,'b':2,'c':3}, {'x':-3,'y':-2,'z':-1}]

将一个元素作为上下文项,您可以像这样形成一个属性映射:

map:merge(@* ! map{local-name(): string()})

要获取元素序列 $in 的映射序列,您可以这样做

$in ! map:merge(@* ! map{local-name(): string()})

要获取元素序列 $in 的映射数组,您可以这样做

array { $in ! map:merge(@* ! map{local-name(): string()}) }

在您的示例中,您还将属性值转换为数字,因此您将使用 xs:integer(.) 代替 string()。但是你还没有说如果有非数字属性你想做什么