2017-05-22 36 views
1

XPath 3.1支持新的映射功能,該功能允許映射結果序列。 https://www.w3.org/TR/xpath-31/#id-mapsXPath 3.1表達式爲每個選定節點收集屬性作爲名稱/值映射

例如,下面是有效的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}] 

回答

2

與元素作爲上下文項可以形成這樣的屬性的地圖:

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

要得到一系列要素的地圖序列NTS $,你可以做

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

獲取地圖的數組,美元元素的序列,你可以做

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

在你的榜樣,你也轉換屬性值號碼,所以你會使用xs:integer(.)來代替string()。但是如果有非數字屬性,你還沒有說過你想做什麼。

+0

我得到net.sf.saxon.s9api.SaxonApiException:命名空間前綴'map'尚未聲明。我是否缺少一些配置?我正在使用s9api java API,我打電話給xpathCompiler.setLanguageVersion(「3.1」); – yurgis

+0

沒想到我必須調用:xpathCompiler.declareNamespace(「map」,「http://www.w3.org/2005/xpath-functions/map」);現在檢查解決方案的其餘部分 – yurgis

+0

對於我的需要,以下表達式已足夠:'''/ root/node/map:merge(@ */map {local-name():xs:integer(。)})''' ' 不知道是否有任何使用'/'vs'!'的性能命中。 – yurgis

相關問題