使用:
/*/tr[2]/td[2]/p/span/text()
当针对以下 XML 文档(通过将提供的格式错误的 HTML 转换为格式正确的 XML 文档获得)评估此 XPath 表达式时:
<table>
<tr>
<td>
<p>
<span>text</span>
</p>
</td>
<td>
<p>
<span>text</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span>Some text</span>
</p>
</td>
<td>
<p>
<span>text to extract</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span>text</span>
</p>
</td>
<td>
<p>
<span>text</span>
</p>
</td>
</tr>
</table>
"text to extract"
根据需要选择具有值的文本节点。
基于 XSLT 的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
"<xsl:copy-of select="/*/tr[2]/td[2]/p/span/text()"/>"
</xsl:template>
</xsl:stylesheet>
当此转换应用于同一个 XML 文档(如上)时,将评估 XPath 表达式并将此评估的结果复制到输出:
"text to extract"
或者,如果您知道文本但想选择包含它的元素(例如td
),则使用:
//text()[. = 'text to extract']/ancestor::td[1]
再次使用基于 XSLT 的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy-of select=
"//text()[. = 'text to extract']/ancestor::td[1]"/>
</xsl:template>
</xsl:stylesheet>
现在的结果是:
<td>
<p>
<span>text to extract</span>
</p>
</td>
还有一个猜测:
如果要查找最近的前面文本节点,请使用:
//text()[. = 'text to extract']/preceding::text()[1]
基于 XSLT 的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
"<xsl:copy-of select=
"//text()[. = 'text to extract']/preceding::text()[1]"/>"
</xsl:template>
</xsl:stylesheet>
结果:
"Some text"
更新:
在 OP 的最新更新和他的新解释之后,他正在寻找的 XPath 表达式是:
//text()[. = 'This text is static and will never change']/following::text()[1]
这将选择具有字符串值的文本节点:
"Bla bla bla .... more bla bla bla"