子元素都属于同一类型的元素

时间:2013-11-17 16:37:33

标签: xml xpath

我正在尝试找出一个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,因为它有几个子节点,但它们的类型不同。

2 个答案:

答案 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]