XPath函数将多个文本节点转换为单个节点

时间:2012-04-12 07:01:33

标签: java xpath substring saxon

我正在使用SAXON Java来评估使用substring-after()的XPath表达式。这个函数在针对某些DOM执行时给出了以下错误:

A sequence of more than one item is not allowed as the first argument of substring-after().

是否有任何XPath函数可以将多个文本节点转换为单个节点?以下是我测试的不同XPath:

1. substring-after(normalize-space(//*[@id='PrintArea']//div/p[1]//span/font), ':')

2. substring-after(normalize-space(//*[@id='PrintArea']//div/p[1]//span/font[1]), ':')

3. substring-after(//*[@id='PrintArea']//div/p[1]//span/font/text(), ':')

4. substring-after(//*[@id='PrintArea']//div/p[1]//span/font[1]/text(), ':')

5. substring-after(//*[@id='PrintArea']//div/p[1]//span/font/text()[position()=1], ':')

5. substring-after(//*[@id='PrintArea']//div/p[1]//span/font[1]/text()[position()=1], ':')

我还应该补充一点,Firebug的FirePath会成功评估以上所有内容。

2 个答案:

答案 0 :(得分:4)

如果第一个参数(我称之为ARG)到substring-after包含多个节点,XPath 1.0将忽略除第一个之外的所有节点。如果这是您想要的效果,请将ARG更改为(ARG)[1]以使其明确。请注意括号:/a/b/c/text()[1]不具备所需效果,必须为(/a/b/c/text())[1]

还有两种可能的解释。您可能想说:对于第一个参数返回的每个文本节点,返回第一个冒号后的子字符串。那将是

ARG/substring-after(., ':')

或者你可能想说:将第一个参数返回的文本节点连接成一个字符串,并在第一个冒号后找到该字符串的一部分。那将是

substring-after(string-join(ARG, ''), ':')

因此,根据您想要的这三种行为中的哪一种,选择要匹配的语法。 XPath 2.0使它成为一个错误,因为猜测你的意图是危险的。

答案 1 :(得分:1)

您应该可以使用string-join functionspec)将它们转换为单个字符串。这将获取一个字符串列表,并给出一个字符串作为结果。使用空字符串作为分隔符。