1

我正在使用 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 成功地评估了上述所有内容。

4

2 回答 2

4

如果 substring-after 的第一个参数(我称之为 ARG)包含多个节点,则 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 使它成为一个错误,因为猜测您的意图是危险的。

于 2012-04-12T08:56:02.907 回答
1

您应该能够使用string-join函数( spec ) 将它们转换为单个字符串。这将获取一个字符串列表并为您提供一个字符串作为结果。使用空字符串作为分隔符。

于 2012-04-12T08:51:56.920 回答