像这样的东西可以正常工作“concat('a','b')”,但我不能将它作为现有表达式的一部分,即
<div class='xyz'>
<strong>the</strong>
<sub> one</sub>
</div>
//div[class='xyz']/concat(/strong/text(), /sub/text())
我希望它返回“那个”
我希望它返回“那个”
在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>
我希望这是 XPath 2.0?否则,concat()
不能出现在表达式中/
( 或) 的 rh 侧,因为它返回一个原子值,而不是一个节点。|
XPath 2.0 及更高版本中删除了此限制。
您的表达几乎是正确的,不同之处在于根节点。/strong
你用and开始了你的 concat-expressions /sub
,但是这些元素并不植根于文档根目录。表达式的 rh 端取表达式的 lh 端的焦点,即它的焦点在 上div
:
//div[@class='xyz']/concat(strong/text(), sub/text())
此外(感谢鲁本斯),您需要属性class
,而不是子元素class
。
如果您的元素不包含混合内容,并且您对其中的所有文本数据感兴趣,则可以简化如下:
//div[@class='xyz']/concat(strong, sub)
如果您被 XPath 1.0 卡住,您可以执行以下操作,但它(完全)不一样:
concat(//div[@class='xyz']/strong, //div[@class='xyz']/sub)
如果您想将此应用于所有 div(如 所示//
),您应该改用 XSLT。