使用:
/*/tr[2]/td[2]/p/span/text()
この XPath 式が次の XML ドキュメントに対して評価される場合 (提供された不正な HTML を整形式の XML ドキュメントに変換することによって取得されます):
<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"