XPath谓词中的双斜杠与路径本身相同

Mak*_*see 7 xpath

我使用XPather使用不同的XPath查询(仅适用于较旧的firefox版本)并注意以下查询的结果之间的差异

这个显示了一些结果

//div[descendant::table/descendant::td[4]] 
Run Code Online (Sandbox Code Playgroud)

这个列出了空列表

//div[//table//td[4]]
Run Code Online (Sandbox Code Playgroud)

它们是否因某些规则而不同,或者只是XPath解释器的特定实现的不当行为?(看起来像从FF引擎中使用,XPather只是一个非常简单的查询GUI)

Mar*_*nen 9

使用XPath 1.0 //是缩写,/descendant-or-self::node()/因此您的第一条路径是/descendant-or-self::node()/div[descendant::table/descendant::td[4]]第二条路径,而第二条路径则相当不同/descendant-or-self::node()/div[/descendant-or-self::node()/table/descendant-or-self::node()/td[4]].因此,主要区别在于,在第一个谓词中,您要查看相对于div元素的后代,而在第二个谓词中,您要查看来自根节点/(也称为文档节点)的后代.您可能希望//div[.//table//td[4]]第二个路径表达式更接近第一个路径表达式.

[edit]以下是一个示例:

<html>
  <body>
    <div>
      <table>
        <tbody>
          <tr>
            <td>1</td>
          </tr>
          <tr>
            <td>2</td>
          </tr>
          <tr>
            <td>3</td>
          </tr>
          <tr>
            <td>4</td>
          </tr>
        </tbody>
      </table>
    </div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

使用该样本,路径//div[descendant::table/descendant::td[4]]选择div元素,因为它具有table具有第四个td后代的子元素.

然而,//div[.//table//td[4]]我们寻找//div[./descendant-or-self::node()/table/descendant-or-self::node()/td[4]]哪个是短的,//div[./descendant-or-self::node()/table/descendant-or-self::node()/child::td[4]]并且没有元素具有第四td个子元素.

我希望这能解释不同之处,如果您使用,//div[.//table/descendant::td[4]]那么您应该得到与原始表格相同的结果.