我正在使用Java和Selenium编写测试。我需要将最后一个元素放在另一个元素中,所以我使用了last()
函数,但问题是它在我申请时并不总是带给我最后一个:
//a//b[last()]
到
<a>
<l>
<b>asas</b>
</l>
<b>as</b>
</a>
获取<b>as</b>
,它带给我:
<b>asas</b>
<b>as</b>
但是当我将它应用于:
<a>
<b>asas</b>
<b>as</b>
</a>
它带给我的是:
<b>as</b>
答案 0 :(得分:8)
这是XPath混淆的常见原因。首先是直截了当的部分:
//a
选择文档中的所有a
元素。//a//b
选择文档中的所有b
元素
a
元素的后代。到目前为止正常的东西。 接下来是棘手的部分:
要选择 兄弟 中的最后b
元素(a
元素下方):
//a//b[last()]
此处,过滤是b
选择标准的一部分,因为[]
的优先级高于//
。
要选择文档中的最后一个b
元素 (a
元素下方):
(//a//b)[last()]
此处,last()
是所有选定b
元素列表中的索引,因为()
用于覆盖默认优先级。
答案 1 :(得分:2)
我认为,如果你记得这个行为,最容易理解这个行为&#34; //&#34;是&#34; / descendant-or-self :: node()/&#34;的缩写,并且步骤&#34; b&#34;是&#34; child :: b&#34;的缩写。所以
//b[last()]
是
的缩写/descendant-or-self::node()/child::b[position()=last()]
这意味着&#34;选择文档中的每个节点(属性和名称空间除外)。对于每个节点,形成一个名为&#34; b&#34;的子元素列表,并选择此列表中的最后一个元素&#34;。
您要求提供信息来源。 @kjhughes建议阅读XPath 1.0推荐,事实上,它比许多规范更具可读性。但它有时可能有点简洁;它偶尔会像解决填字游戏一样。我的&#34; XSLT 2.0程序员参考&#34; (其中还包括许多关于XPath的材料)是为那些希望深入理解语言运作方式的人而编写的,但用简洁的英语解释。这个特定的主题在第627页,如果您想了解它是如何被覆盖的,那么在网上找到盗版的副本就很容易了。但我建议购买合法副本,因为滚动浏览1300页的扫描PDF并不是很有趣。