我正在尝试找出一个xPath,它将返回文档中仅包含相同类型子项(标记名称)的所有元素。
例如:
<doc>
<el id="1">
<xxx>...</xxx>
<xxx>...</xxx>
<xxx>...</xxx>
</el>
<abc id="2">
<yyy>...</yyy>
<yyy>...</yyy>
<yyy>...</yyy>
<yyy>...</yyy>
</abc>
<el id="3">
<zzz>...</zzz>
</el>
<el id="4">
<xxx>...</xxx>
<yyy>...</yyy>
<zzz>...</zzz>
<def id="5">
<zzz>...</zzz>
<zzz>...</zzz>
<zzz>...</zzz>
</def>
</el>
</doc>
将返回id为1,2和5但不是3的元素,因为它只有一个子节点而不是4,因为它有几个子节点,但它们的类型不同。
答案 0 :(得分:1)
//*[*[2]][not(*[name() != name(../*[1])])]
将其分解,首先我们在树中的任何位置找到至少有两个子元素的所有元素,然后对于每个元素,以下内容:
*[name() != name(../*[1])]
选择所有元素的子列表,其名称与相关元素的 first 子元素的名称不同。你最感兴趣的元素是那个表达式没有选择的元素,即 all 子元素与第一个元素名称相同的元素。
您可以使用
//*[@id][*[2]][not(*[name() != name(../*[1])])]
如果您希望将搜索范围限制为仅具有id
属性的元素。
答案 1 :(得分:1)
您没有指定XPath 1.0或XPath 2.0。在XPath 2.0中它将是
//*[count(*) gt 1 and count(distinct-values(*/node-name())) eq 1]