XPath select 文本,部分除外

XPath select text except some parts

如果我想提取 "TEXT 1" 但 而不是 "TEXT 2" 和 "TEXT 3",我该如何编写 XPath 表达式?

<div class="content">
    <div>
        <p>
TEXT 1 <span class="author"> TEXT 2</span>
     <a href="http://www.example.com" class="more" name="_chf_A_xxlformat_">TEXT 3</a>
    </p>
</div>
</div>

试试这个:

<xsl:value-of select="text()"/>

您可能做过 <xsl:value-of select="."/>,它获取当前节点并将其递归地转换为文本。 text() 仅选择文本节点,不包括子元素和属性。

这是上下文的完整 XSLT:

<?xml version="1.0"?>
<xsl:stylesheet
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
        <xsl:template match="p">
                <out>
                        <xsl:value-of select='text()'/>
                </out>
        </xsl:template>

</xsl:stylesheet>

试试这个 XPath:

$x("(//div[@class='content']/div/p/text())[1]");

也许它不是很有效,但它似乎在起作用 :) 请注意,[1] 将获得文本的第一次出现,如果更改文本位置,它将无法正常工作。

此致, 安德莉亚

此 XPath 将 select 作为 p

的直接子节点的文本节点
//div[@class='content']/div/p/text()

,因此将排除 "TEXT 2" 和 "TEXT 3"。

您可能更愿意消除前导和尾随空格(并替换重复的内部空格,但不管这里如何):

//div[@class='content']/div/p/text()[normalize-space()]

在 XPath 1.0 和 XPath 2.0 中计算为 "TEXT 1"。