使用:
//table//td//text()[normalize-space()]
これにより、XML ドキュメントtd
の要素の子孫である の子孫であるすべてが空白ではないテキスト ノードが選択されます。table
XSLT ベースの検証:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:for-each select="//table//td//text()[normalize-space()]">
<xsl:copy-of select="."/>
=============
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
この変換が提供された XML ドキュメントに適用されると、次のようになります。
<table>
<tr>
<td>
<div id="somediv1">
<span>blablabla</span>
</div>
</td>
<td>
<div id="somediv2">
<span>text2</span>
</div>
<div id="somediv3">
<span>text3</span>
</div>
<span>text4</span>
</td>
</tr>
</table>
XPath 式が評価され、視覚的に特徴的な区切り文字列を使用して、選択されたすべてのテキスト ノードが出力にコピーされます。
blablabla
=============
text2
=============
text3
=============
text4
=============
更新:
ソース XML ドキュメントがデフォルトの名前空間にある場合、上記の XPath 式は、この事実を考慮して変更する必要があります。
//x:table//x:td//text()[normalize-space()
ここで、プレフィックス"x"
はソース XML ドキュメントのデフォルトの名前空間にバインドされます。
XSLT ベースの完全な例を次に示します。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/1999/xhtml">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:for-each select="//x:table//x:td//text()[normalize-space()]">
<xsl:copy-of select="."/>
=============
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
この変換が次の XML ドキュメント(提供されたものですが、既定の (XHTML) 名前空間に配置されている) に適用される場合:
<table xmlns="http://www.w3.org/1999/xhtml">
<tr>
<td>
<div id="somediv1">
<span>blablabla</span>
</div>
</td>
<td>
<div id="somediv2">
<span>text2</span>
</div>
<div id="somediv3">
<span>text3</span>
</div>
<span>text4</span>
</td>
</tr>
</table>
再び同じ正しい結果が生成されます。
blablabla
=============
text2
=============
text3
=============
text4
=============