我想选择以下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
,它会给您每个不是其父元素内最后一个a
的li
。由于每个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。