如何选择所有子元素节点名称都相同的父节点。在下面的示例中,<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
。
一、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 表达式求值,并将所选元素(在本例中只有一个)复制到输出:
<a id="1">
<b>1</b>
<b>2</b>
<b>3</b>
</a>
二、XPath 2.0:
/*/*[every $vChild in * satisfies name($vChild) eq $vChild/../*[1]/name()]