XPath - 选择后代 - 使用//和* /之间的区别

时间:2014-07-04 08:56:33

标签: html xml xpath

有人可以帮我理解以下两个XPath查询之间的区别:

答://table[@id="xyz"]//tr[//a[contains(text(), "Alice")]]

B://table[@id="xyz"]//tr[*/a[contains(text(), "Alice")]]

(A)似乎选择了表格中的所有tr,无论它是否具有带文字“Alice”的a后代。

(B)同时做了我所期望的只选择tr s的a后代包含文本“Alice”。

作为一个旁白的问题,是否有一种更优雅的方式来编写上述内容?

2 个答案:

答案 0 :(得分:1)

您需要使用//table[@id="xyz"]//tr[.//a[contains(text(), "Alice")]]//table[@id="xyz"]//tr[descendant::a[contains(text(), "Alice")]]来确保在第一个表达式中方括号中的路径相对于tr。使用谓词中的当前//tr[//a],选择//a从文档节点(根节点)开始,而不是相对于tr

答案 1 :(得分:0)

//a选择文档中任何位置的所有元素。

*/a选择所有元素作为上下文节点的孙子。

.//a选择任何深度为

的上下文节点后代的所有元素

./a(或只是a)选择所有元素作为上下文节点的子元素。

了解背景概念至关重要。在诸如tr [XXXX]的谓词中,用于评估XXXX的上下文节点是您正在测试的tr元素。