xpath:是否可以排除not函数中的最后一个元素

lin*_*ing 2 jquery xpath

鉴于以下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>
Run Code Online (Sandbox Code Playgroud)

使用jquery(在1.11.1和可能的其他版本中),我们可以使用以下表达式:

div.myClass:not([foo=bar]:last)
Run Code Online (Sandbox Code Playgroud)

它将返回t1,t2,t3,t5,t6.换句话说,它选择所有具有class = myClass的div,并删除具有值为bar的属性foo的所有div,除了这些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
Run Code Online (Sandbox Code Playgroud)

Lar*_*rsH 5

//div[@class='myClass']
  [not(count(. | (//div[@class='myClass' and @foo='bar'])[last()]) = 1)]
Run Code Online (Sandbox Code Playgroud)

或者如果你不需要字面意思,换句话说not:

//div[@class='myClass']
  [count(. | (//div[@class='myClass' and @foo='bar'])[last()]) > 1]
Run Code Online (Sandbox Code Playgroud)

这些依赖于以下事实:在XPath 1.0中,要测试的方式通过一个表达所选择的节点是否同一节点通过另一个表达式中选择的一个是询问是否

count(A | B) = 1
Run Code Online (Sandbox Code Playgroud)

如果A和B选择相同的节点,那么|它们的并集只是一个节点.相反,如果联合包含多个节点,则A和B不是同一个节点.