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

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

//*[@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>

提前致谢

缺口

最佳答案

除了语法错误-您还需要一个and,即contains(@href,'tags') and not(position()...)-您还要对//的定义方式进行细微的修改。

XPath //a[position() < last()]除了最后一个a不会给您所有的a,它会给您每个不是其父元素内最后一个ali。由于每个a最多包含一个a,因此每个a是其各自父级中的最后一个position,因此此测试将完全不匹配。

您可以通过将大多数表达式包装在括号中并将a检查放在单独的谓词中来实现所需的功能

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

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

技术说明-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]轴-ojit_code。

09-20 21:17