给出以下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 它有一个带有值bar的属性foo,除了这些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
答案 0 :(得分:5)
//div[@class='myClass']
[not(count(. | (//div[@class='myClass' and @foo='bar'])[last()]) = 1)]
或者如果您不需要文字not
:
//div[@class='myClass']
[count(. | (//div[@class='myClass' and @foo='bar'])[last()]) > 1]
这些依赖于以下事实:在XPath 1.0中,测试由一个表达式选择的节点是否与另一个表达式选择的节点相同的节点的方式是询问是否
count(A | B) = 1
如果A和B选择相同的节点,那么它们的联合|
只是一个节点。相反,如果联合包含多个节点,则A和B不是同一个节点。