XPath 3.1表达式,用于收集属性作为每个选定节点的名称/值映射

时间:2017-05-22 21:24:45

标签: xml xpath saxon xpath-3.1

XPath 3.1支持新的 map 功能,该功能允许在结果序列中使用地图。 https://www.w3.org/TR/xpath-31/#id-maps

例如,这是有效的XPath 3.1表达式,它返回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}]

1 个答案:

答案 0 :(得分:2)

使用元素作为上下文项,您可以形成如下属性的映射:

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()。但是如果有非数字属性,你还没有说出你想做什么。