Xpath,为什么两者都匹配?

Xpath, why does it matches both?

<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']

这 returns 两个 'a' 节点。但我只想要 ca='S'

我可以通过使用 .//ca/text() = 'S' 来实现。但我不知道为什么。有人可以解释吗? xpath 是否丢失了 'and' 之后的上下文?

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

//ca/text() = 'S' 从文档的根部开始,因此它总是 select 一个内容为 'S' 的文本节点,无论哪个 a 元素是上下文.

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

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

因为像 element[//anotherElement] - returns element 这样的定位器,但确保存在某个地方 anotherElement

和定位器 element[.//anotherElement] - returns 元素 element 有后代 anotherElement.

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