Xpath,为什么它们兼容?

时间:2017-09-20 10:33:49

标签: xml xpath nodes limit predicate

<root>
  <a>
    <b>
      <ba>
        <baa>RM</baa>
        <bab>*DB:ZA:4</bab>
      </ba>
    </b>
    <c>
      <ca>M</ca>
      <cb>1</cb>
    </c>
  </a>
  <a>
    <b>
      <ba>
        <baa>RM</baa>
        <bab>*DB:ZA:4</bab>
      </ba>
    </b>
    <c>
      <ca>S</ca>
      <cb>1</cb>
    </c>
  </a>
</root>

以下xPath: //a[//bab/text() = '*DB:ZA:4' and //ca/text() = 'S']

这将返回两个'a'节点。但我只想要一个ca ='S'

的那个

我可以使用.//ca/text() = 'S'来实现这一目标。但我不知道为什么。 epxlain可以吗? xpath是否会丢失'和'之后的上下文?

我使用了这个XPath-Tester:http://videlibri.sourceforge.net/cgi-bin/xidelcgi

3 个答案:

答案 0 :(得分:2)

因为element[//anotherElement]之类的定位器会返回element,但会确保某处anotherElement存在。

定位器element[.//anotherElement] - 返回元素element,其中有后代anotherElement

在这种情况下,添加点会将搜索从绝对路径更改为相对路径。

答案 1 :(得分:1)

//ca/text() = 'S'从文档的根开始,因此无论哪个a元素是上下文,它总是会选择内容为“S”的文本节点。

使用.//ca/text()代替,因为这会在当前节点的上下文中进行搜索。

答案 2 :(得分:1)

//将从root开始返回位于文档中任何位置的元素。 .//将相对于当前节点进行搜索。这可能会产生误导,因为您可能认为在[]中使用它已经是相对的。绝对表达式/./也是如此。