【问题标题】:Xpath, why does it matches both? [duplicate]Xpath,为什么两者都匹配? [复制]
【发布时间】:2018-03-01 09:05:38
【问题描述】:
<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' 来实现。但我不知道为什么。有人可以解释吗? xpath 是否会丢失它在“and”之后的上下文?

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

【问题讨论】:

    标签: xml xpath nodes limit predicate


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        因为像element[//anotherElement] 这样的定位器 - 返回element,但确保在某处存在anotherElement

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-13
          • 2020-01-16
          • 2012-11-24
          • 2011-11-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多