【问题标题】:xpath: is it possible to exclude the last element inside a not functionxpath:是否可以排除非函数内的最后一个元素
【发布时间】: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

标签: jquery xpath


【解决方案1】:
//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 不是同一个节点。

【讨论】:

  • 谢谢,但我得到:// DOMXPath::query(): Invalid expression
  • @ling,我相信我在编辑之前遇到了括号问题。再试一次。
猜你喜欢
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多