XPath选择仅包含特定类型子项的父项?

时间:2020-06-18 15:10:57

标签: xml xpath

我有这个简单的DOM:

<r>
  <a1>
    <foo>...</foo>
    <foo>...</foo>
    <foo>...</foo>
  </a1>
  <a2>
    <faa>...</faa>
    <faa>...</faa>
    <foo>...</foo>
  </a2>
  <a3>
    <fii>...</fii>
    <fii>...</fii>
    <fii>...</fii>
  </a3>
</r>

是否只有XPath可以选择仅包含aX个子元素的元素a1(在此示例中为元素foo)?

3 个答案:

答案 0 :(得分:2)

此XPath,

//*[foo][not(*[not(self::foo)])]

选择所有具有foo个子元素 而没有其他子元素 的元素。

说明

  • //*选择文档中的所有元素
  • //*[foo] ...至少具有一个foo子元素
  • //*[foo][not(*[not(self::foo)])] ...并且 not 的子元素不是 not foo。由于我们已经确定必须存在一个foo子元素,因此通过添加不存在不是foo子元素的其他元素,我们保证存在foo <按要求,strong> 并且仅 foo个子元素。

答案 1 :(得分:1)

使用此XPath获取所有具有“ foo”元素作为子元素的元素

//*[foo]

答案 2 :(得分:0)

要完成@kjhughes的回答,请使用两个有效的XPath:

//foo[count(preceding-sibling::*)=count(preceding-sibling::foo)]/..
//*[starts-with(name(),"a")][count(.//*)=count(.//foo)]

输出:

<a1>
    <foo>...</foo>
    <foo>...</foo>
    <foo>...</foo>
</a1>
相关问题