このXPath式を使用します:
//*[@name = /*/@name]
これにより、属性が最上位要素の属性と同じ文字列値を持つ任意の要素(という名前の最上位要素を含むroot
)が選択されます。このXPath式が提供されたXMLドキュメントに対して評価されると、2つの要素-とが選択されます。name
name
root
subitem
この2つのうち2つ目の要素だけが欲しいと思います。これには、次のXPath式を使用します。
//*/*[@name = /*/@name]
XSLTベースの検証:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="//*/*[@name = /*/@name]"/>
========
<xsl:copy-of select="//*[@name = /*/@name]"/>
</xsl:template>
</xsl:stylesheet>
この変換が提供されたXMLドキュメントに適用される場合:
<root name="xyz">
<anything>
<subitem name="xyz" />
</anything>
</root>
2つのXPath式が評価され、選択したノードが出力にコピーされます。
<subitem name="xyz"/>
========
<root name="xyz">
<anything>
<subitem name="xyz"/>
</anything>
</root>
<subitem name="xyz"/>