2

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

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

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

我希望它返回“那个”

4

2 回答 2

3

我希望它返回“那个”

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>
于 2015-09-22T21:45:00.223 回答
0

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

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

如果您被 XPath 1.0 卡住,您可以执行以下操作,但它(完全)不一样:

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

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

于 2015-09-22T21:23:01.727 回答