如何在 XPath 表达式中对多个子项使用 concat() 函数

How can I use the concat() function on multiple children within an XPath expression

类似这样的东西可以正常工作 "concat('a', 'b')" 但我不能将它作为现有表达式的一部分工作,即

<div class='xyz'>
    <strong>the</strong>
    <sub> one</sub>
</div>

//div[class='xyz']/concat(/strong/text(), /sub/text())

我想 return 'the one'

我希望这是 XPath 2.0?否则,concat() 不能出现在表达式中 / 的右侧(或 | 的任一侧),因为它 returns 是一个原子值,而不是节点.此限制在 XPath 2.0 及更高版本中已被删除。

XPath 2.0

你的表达几乎是正确的,区别在于根节点。您使用 /strong/sub 开始了您的连接表达式,但这些元素并不以文档根为根。表达式 的 rh-side 获得表达式 的 lh-side 的焦点,即它的焦点在 div:

//div[@class='xyz']/concat(strong/text(), sub/text())

此外(感谢 Rubens),您需要属性 class,而不是子元素 class

如果您的元素不包含混合内容,并且您对其中的所有文本数据感兴趣,您可以简化如下:

//div[@class='xyz']/concat(strong, sub)

XPath 1.0

如果您受困于 XPath 1.0,您可以执行以下操作,但它并不(完全)相同:

concat(//div[@class='xyz']/strong, //div[@class='xyz']/sub)

如果您想将此应用到所有 div(如 // 所示),您应该改用 XSLT。

i'd like it to return 'the one'

XPath 1.0 中,您必须执行以下操作:

concat(div[@class='xyz']/strong, div[@class='xyz']/sub)

XSLT 1.0 中,您可以:

<xsl:template match="/">
    <xsl:for-each select="div[@class='xyz']/*">
        <xsl:value-of select="."/>
    </xsl:for-each>
</xsl:template>