有人可以帮我理解以下两个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”。
作为一个旁白的问题,是否有一种更优雅的方式来编写上述内容?
答案 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元素。