选择具有祖先条件的节点

时间:2018-05-17 08:03:28

标签: xml xpath

我的问题:我需要检查属性" attributeToBeTested" " testElement"。 " testElement"是" test"的唯一孩子。一个条件:这个"测试"元素必须是" toto"的孩子。而不是" tata"或" titi"。

所以我把我的测试写成:

//toto/descendant::test/descendant::testElement[attribute::attributeToBeTested != "Z"] and //test[not(ancestor::tata)] and //test[not(ancestor::titi)]

我想我写的是:给我所有"测试"元素," toto"的子项,其中"属性ToBeTested" " testElement"元素未设置为" Z"并且没有" tata"或" titi"作为祖先。

但显然,这个测试是错误的,这让我发疯了!

以下是XML示例:

<tata>
  ....
  <test>
      <testElement attributeTobeTested="Z"/>
  </test>
</tata>
<toto>
  ....
  <test>
      <testElement attributeTobeTested="H"/>
  </test>
  ....
  <test>
      <testElement attributeTobeTested="Z"/>  <---- This one should pop up
  </test>
</toto>    
<toto>
  ....
  <titi>
      <test>
          <testElement attributeTobeTested="Z"/>
      </test>
  </titi>
</toto>    

只会弹出一个:&#34; toto&#34;不在&#34; tata&#34;而不是&#34; titi&#34;并使用&#34; Z&#34;

的属性

1 个答案:

答案 0 :(得分:1)

尝试以下XPath:

//toto//test[not(ancestor::*[name()=("titi", "tata")])]/testElement[@attributeTobeTested="Z"]

它应该返回您所需的testElement节点