除最后一项之外的Xpath选择项包含语法

时间:2013-09-10 09:54:21

标签: html dom xpath

我想选择以下html项目(动作,喜剧),但最后一项(标签)除外。

要选择我的所有关注代码,请执行以下操作:

//*[@id="video-tags"]//a[contains(@href,'tags')]

但要选择除最后一个(标签)之外的选项,它将无法使用我的关注代码:

//*[@id="video-tags"]//a[contains(@href,'tags') not(position() > last() -1)]

html

<ul id="video-tags">
        <li>Uploader: </li>
        <li class="profile_name"><a href="/profiles/wilco">wilco</a></li>
        <li><em>Tagged: </em></li>
        <li><a href="/tags/action">action</a>, </li>
        <li><a href="/tags/comedy">comedy</a>, </li>
        <li>more <a href="/tags/"><strong>tags</strong></a></li>
</ul>

提前致谢

尼克

2 个答案:

答案 0 :(得分:15)

除了语法错误之外 - 您需要一个and,即contains(@href,'tags') and not(position()...) - 您正在嘲笑//的定义方式。

XPath //a[position() < last()]为您提供除最后一个a以外的每个a,它将为您提供不是最后一个a li在其各自的父元素内。由于每个a最多包含一个a每个 a都是其各自父级中的最后一个position,因此此测试不会在所有

您可以通过将大部分表达式包装在括号中并将(//*[@id="video-tags"]//a[contains(@href,'tags')])[position() < last()] 检查放在单独的谓词中来实现您想要的效果

a

括号使最终谓词应用于表达式选择的节点集作为一个整体,而不仅仅是a位置步骤,即它将首先找到所有href个元素//包含“tags”,然后按文档顺序返回除最后一个选定元素之外的所有元素。


技术说明 - XPath中/descendant-or-self::node()/的定义是它是//a(包括斜杠)的简写,这是一个位置步骤,为您提供此节点及其所有后代节点。因此/descendant-or-self::node()/child::a表示//a[something]/descendant-or-self::node()/child::a[something]表示child:: - 谓词适用于descendant-or-self::步骤,而不是descendant::步骤。如果要将谓词应用于后代搜索,则应明确使用/descendant::a[something]轴 - {{1}}。

答案 1 :(得分:0)

试试这个

(//ul[@id="video-tags"]//a[contains(@href,'tags')]/text())