html 从其他Xpath中排除Xpath

brccelvz  于 2022-12-02  发布在  其他
关注(0)|答案(3)|浏览(155)

如果您有两个Xpath,您可以使用|运算子将它们链接起来,在一个结果集中传回两个结果。这实际上是传回两组元素的并集。下列范例会传回网站上所有的divspan

//div | //span

我需要的是差异(子部分)。我需要第一个Xpath组中不属于第二个Xpath组的所有元素。到目前为止,我已经看到有一个except运算符,但它只在Xpath2中有效。我需要一个Xpath1解决方案。我已经看到not函数可能会有帮助,但我无法使其有效。
例如,设想以下情况:

<tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
</tr>

在这个例子中,我有一个Xpath组//tr/td。我想排除<td>1</td><td>4</td>。虽然有很多方法可以解决这个问题,但我特别寻找一个解决方案,在Xpath中可以这样说:“这是一组元素,并从其中排除这组元素”。

zvms9eto

zvms9eto1#

实现这一点的方法是在 predicate 中使用self::轴和not()运算符:
例如,使用这样的XML

<root>
    <tr>
        <td>1</td>
        <td>2</td>
        <td>3</td>
        <td>4</td>
        <td>5</td>
    </tr>    
    <dr>
        <td>1</td>
        <td>4</td>
    </dr>    
</root>

可以使用以下XPath-1.0表达式:

//tr/td[not(self::*=//dr/td)]

其可以被缩短为

//tr/td[not(.=//dr/td)]

生成的节点集符合要求

<td>2</td>
<td>3</td>
<td>5</td>

XPath表达式选择第一部分的所有元素,并检查 predicate 中的每个元素本身(self::*.)是否都在第二部分中。如果是,则将其排除(not(...))。
您也可以将这种方法应用于属性节点。在这种情况下,您必须使用.,因为self::*更具体,并且只选择元素。因此,您可以将self::*替换为.,但不能反过来。(最通用的轴是self::node()。)

2nc8po8w

2nc8po8w2#

您可以在此处使用逻辑andandnot运算符。
对于您的特定示例,可以使用以下XPath

"//tr/td[not(text()=`1`)][not(text()=`4`)]"
wbrvyc0a

wbrvyc0a3#

在XPath 2.0+中,有一个运算符用于执行以下操作:except。如果E和F是返回节点集的通用表达式,则E except F返回由E选择但未由F选择的所有节点。
在XPath 1.0中没有方便的方法来完成同样的事情,但是相当麻烦(而且可能很昂贵)的表达式E[count(.|F) != count(F)]是等价的(尽管需要注意计算F的上下文)。
在许多实际情况下,您可以使用筛选 predicate 来达到所需的效果,例如//td[not(ancestor::tr)]

相关问题