如何在 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>
类似这样的东西可以正常工作 "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>