特定のケースでは、XML ドキュメントはデフォルトの名前空間にないため、次のような XPath 式になります。
/stock/item/name
どのノードも選択しません。
使用:
/*/*/*[name()='name' and @xml:format = 'long']/text()
または使用:
string(/*/*/*[name()='name' and @xml:format = 'long'])
name
最初の式は、名前が(名前空間に関係なく) であり、XML ドキュメントの最上位要素の孫であるすべての要素のすべてのテキスト子ノードを選択します。
2 番目の式は、XML ドキュメントの最初の要素の文字列値を生成します。その名前はname
(名前空間に関係なく)、XML ドキュメントの最上位の要素の孫です。
XSLT ベースの検証:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:copy-of select="/*/*/*[name()='name' and @xml:format = 'long']/text()"/>
===========
<xsl:copy-of select="string(/*/*/*[name()='name' and @xml:format = 'long'])"/>
</xsl:template>
</xsl:stylesheet>
この変換が提供された XML ドキュメントに適用されると、次のようになります。
<stock xmlns="http://localhost/aaabbb">
<item item-id="1">
<name xml:format="short">This is a short name</name>
<name xml:format="long">This is a LONG name</name>
</item>
</stock>
2 つの Xpath 式が評価され、選択された要素 (最初のもの) と生成された文字列の結果 (2 番目のもの) が出力にコピーされます。
This is a LONG name
===========
This is a LONG name