如何选择其所有子元素节点名称相同的父节点。在下面的示例中,应选择父节点<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>
答案 0 :(得分:3)
尝试以下XPath表达式:
//*[./* and not(./*[name() != name(../*[1])])]
它选择任何具有子元素的元素,但它们的名称与第一个孩子的名字不同。
它也返回form
,因为它的所有子节点都被命名为a
。
答案 1 :(得分:1)
<强>予。 XPath 1.0 :
使用强>:
/*/*
[not(*[position() > 1
and
not(name()= name(../*[1]))
]
)
]
这将选择top元素的任何子元素,以使position()
大于1的任何子元素的名称等于该元素的第一个子元素的名称。
<强>解释强>:
正确使用 Double-Negation law 。
基于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>
<强> II。 XPath 2.0 :
/*/*[every $vChild in * satisfies name($vChild) eq $vChild/../*[1]/name()]