たとえば、次のような XML サンプルがあります。
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
a
XPathを使用してノードのみを選択するにはどうすればよいですか
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
これがあなたにとって十分な柔軟性があるかどうかはわかりませんが、開始する必要があります
/a/a1 | a/text() | /a/*[not(starts-with(name(), 'a'))]
ここで簡単に試すことができます: http://www.xpathtester.com/test
XPath は、XML ドキュメントのクエリ言語です。これは、XPath 式が一連のノードを選択したり、データを抽出したりすることしかできないことを意味します。
注意: XPath 式によって、XML ドキュメントの構造が変更されることはありません (ノードの削除など)。
答えは、必要なノードを選択する XPath 式がないということです。そのようなノードは XML ドキュメントに存在しないからです。
あなたが望むことは、XSLT と (それほど簡単ではありませんが) XQuery を使用して簡単に実現できます。
<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>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(), 'a1')]"/>
</xsl:stylesheet>
この変換が提供された XML ドキュメントに適用されると、次のようになります。
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2> Text
<strong>text</strong> text...
</a>
必要な正しい結果が生成されます。
<a>
<a2>A2</a2> Text
<strong>text</strong> text...
</a>
この xpath:
//a[normalize-space(.)='A2 Text text text...']
のみを選択します:
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
XSLT の例...
XML 入力
<doc>
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
</doc>
XSLT1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select="//a[normalize-space(.)='A2 Text text text...']"/>
</xsl:template>
</xsl:stylesheet>
XML 出力
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>