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

dir*_*ory 8 html xpath dom

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

要选择我的所有关注代码正在运行:

//*[@id="video-tags"]//a[contains(@href,'tags')]
Run Code Online (Sandbox Code Playgroud)

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

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

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>
Run Code Online (Sandbox Code Playgroud)

提前致谢

缺口

Ian*_*rts 16

除了语法错误之外 - 你需要一个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()]
Run Code Online (Sandbox Code Playgroud)

括号使得最终谓词应用于由表达式作为整体选择的节点集,而不仅仅是a位置步骤,即它将首先找到包含"tags"的所有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].