【发布时间】:2015-09-13 09:51:06
【问题描述】:
给定以下 html:
<div>
<div id="t1" foo="bar" class="myClass">cello</div>
<div id="t2" class="myClass">melo there</div>
<div id="t3" class="myClass">quello</div>
</div>
<div>
<div id="t4" foo="bar" class="myClass">cello</div>
<div id="t5" class="myClass">melo there</div>
<div id="t6" class="myClass">quello</div>
</div>
使用 jquery(在 1.11.1 和可能的其他版本中),我们可以使用以下表达式:
div.myClass:not([foo=bar]:last)
它将返回 t1、t2、t3、t5、t6。 换句话说,它选择所有具有 class=myClass 的 div,并删除所有这些 div 它的属性 foo 的值为 bar,除了最后一个 div。
现在,我正在尝试使用 xpath 1.0 找到等效的 xpath 表达式。 有谁知道 xpath 等效表达式是否可能, 如果是这样,那个 xpath 表达式会是什么?
到目前为止,这是我尝试过的 xpath 表达式(使用 php),它们都没有返回应有的 1、2、3、5、6:
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'])]"; // 2,3,5,6
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'][position()=last()])]"; // 2,3,5,6
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'] and position()=last() )]"; // 1,2,3,4,5,6
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'] and position()=1 )]"; // 2,3,5,6
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'])[position()=last()]]"; // DOMXPath::query(): Invalid type
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'])][position()=last()]"; // 3,6
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'])][position()<last()]"; // 2,5
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'])][position()=1]"; // 2,5
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'][4])]"; // 1,2,3,4,5,6
$x = "//div[@class='myClass'][not(self::node()[@foo='bar'][1])]"; // 2,3,5,6
【问题讨论】:
-
我认为问题在于将 jQuery 的(或者更确切地说是 Sizzle 的)
:last伪转换为 XPath - 我在这里可能错了 - 只处理 DOM 中的位置,而不是返回的位置堆栈(这是:last所做的。如果不使用不同的逻辑或使用多个节点集来处理它,就看不到明显的解决方案。 -
能否请您发布您的预期输出
-
@raghavendra:他说t1,t2,t3,t5,t6