我的目标XHTML文档(简化)如下所示:
<html>
<head>
</head>
<body>
<span class="boris"> </span>
<span class="boris"> </span>
<span class="johnson"> </span>
</body>
</html>
我正在尝试选择最后一堂课“鲍里斯”。
XPath表达式
//span[@class="boris"]
选择所有类型的boris。如何选择最后一个?
我试过
//span[@class="boris" and last()]
这不起作用,因为last()在这里指的是整个文档中的最后一个跨度。
如何选择类boris的所有跨度...然后选择最后一个?
我已经阅读了5或6个XPath教程并完成了大量的Google搜索,我无法单独在XPath中找到解决方法:(
提前感谢您的帮助:)
答案 0 :(得分:3)
(//span[@class="boris"])[last()]
必须让last()
以你想要的方式工作。这样:
//span[@class="boris"][last()]
是错误的,因为它会选择多个<span class="boris">
,如果它们是他们父母中的最后一个:
<div>
<span class="boris">#1</span><!-- this one -->
</div>
<div>
<span class="boris">#2</span><!-- this one not -->
<span class="boris">#3</span><!-- but this -->
</div>
<div>
<span class="boris">#4</span><!-- and this, too -->
<span class="other">#5</span><!-- this not -->
</div>
第一个表达式只选择一个:#4。这是你需要的。
第二个表达式选择#1,#3和#4,如图所示。
您的尝试(//span[@class="boris" and last()]
)会选择每个 <span class="boris">
,但主要是因为您错了:last()
评估为一个数字。除0
之外的任何数字在布尔上下文中求值为true
。这意味着false
的表达式永远不会是<span class="boris">
。
你必须对布尔值做一个正确的比较:意味着什么是
//span[@class="boris" and position() = last()]但是,这仍然是错误的。它选择#1和#3,因为此处
position()
和last()
都在父元素内计数。
当您使用()
个parens时,您可以创建一个新的临时节点集,last()
可以使用它。
答案 1 :(得分:0)
在这里猜测,但不是//span[@class="boris"][last()]
?
编辑:
我刚看到你也可以嵌套谓词(见here),所以也许你可以这样做: //span[@class="boris"[last()]]
编辑2:
不,这不起作用。跟第一个一起去。顺便说一句,我在网上尝试了你的and last()
,它似乎做了你想要的。咦。