我使用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)
使用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]]那么您应该得到与原始表格相同的结果.