XPath 2.0在节点集中的每个节点上使用函数

时间:2014-02-10 09:00:53

标签: java xml xpath xpath-2.0

我有以下xml:

<root>
    <table>
        <a>a1</a>
        <b>b1</b>
    </table>
    <table>
        <a>a2</a>
        <b>b2</b>
    </table>
    <table>
        <a>a3</a>
        <b>b3</b>
    </table>
    <table>
        .....
</root>

我需要加入“a”和“b”字段(结果:arr [0] =“a1b1”,arr [1] =“a2b2”,arr [2] =“a3b3”... arr [ N] = “aNbN”

使用XPath 1.0我只能在第一项

上做这样的事情
"concat(/root/table/a, /root/table/b)"

我将永远得到S​​TRING结果:“a1b1”,而不是NODESET。

我尝试使用XPath 2.0(我使用net.sf.saxon,Saxon-HE:9.5.1-4)和foreach,但没有成功:

"for $item in /root/table/a return concat($item, 'a')" 

结果是第一项的XPathConstants.STRING:“a1a”

但是当我尝试使用变体时,它的效果很好

"for $item in /root/table/a return $item" 

结果是所有项目的XPathConstants.NODESET:“a1”,“a2”,“a3”

那么,我如何获得“a1b1”,“a2b2”,“a3b3”的列表......?

感谢。

2 个答案:

答案 0 :(得分:3)

您可以简单地使用/root/table/concat(a, b),它会为您提供一系列字符串。但是您需要使用可以处理该返回类型的API,我认为JAXP API仅限于XPath 1.0类型,因此如果您想充分利用XPath 2.0,请确保使用Saxon的http://www.saxonica.com/documentation/index.html#!xpath-api/s9api-xpath。 p>

答案 1 :(得分:1)

请尝试以下代码:

for $item  in /root/table return concat($item/a, $item/b) 

如果简单的concat在你的情况下是不够的,你可以尝试字符串连接:

for $item  in /root/table return string-join(concat($item/a, $item/b),"")

请注意,Unicode规范化不会自动应用于fn:concat的结果。有关详细信息,请查看this link