すべての子要素ノード名が同じである親ノードを選択するにはどうすればよいですか。<a id="1">
次の例では、すべての子ノード名が次のようになっているため、親ノードを選択する必要があります。b
<form>
<a id="1">
<b>1</b>
<b>2</b>
<b>3</b>
</a>
<a id="2">
<b>1</b>
<c>2</c>
<b>3</b>
</a>
</form>
次のXPath式を試してください。
//*[./* and not(./*[name() != name(../*[1])])]
子を持つ要素を選択しますが、子の名前は最初の子の名前と異なりません。
form
すべての子に名前が付けられているため、これも返されますa
。
I. XPath 1.0:
使用:
/*/*
[not(*[position() > 1
and
not(name()= name(../*[1]))
]
)
]
これにより、最上位の要素の子要素が選択position()
され、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="/">
<xsl:copy-of select=
"/*/*
[not(*[position() > 1
and
not(name()= name(../*[1]))
]
)
]"/>
</xsl:template>
</xsl:stylesheet>
この変換が提供されたXMLドキュメントに適用される場合:
<form>
<a id="1">
<b>1</b>
<b>2</b>
<b>3</b>
</a>
<a id="2">
<b>1</b>
<c>2</c>
<b>3</b>
</a>
</form>
XPath式が評価され、選択された要素(この場合は1つだけ)が出力にコピーされます。
<a id="1">
<b>1</b>
<b>2</b>
<b>3</b>
</a>
II。XPath 2.0:
/*/*[every $vChild in * satisfies name($vChild) eq $vChild/../*[1]/name()]