如果您有两个Xpath,您可以使用|
运算子将它们链接起来,在一个结果集中传回两个结果。这实际上是传回两组元素的并集。下列范例会传回网站上所有的div
和span
:
//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中可以这样说:“这是一组元素,并从其中排除这组元素”。
3条答案
按热度按时间zvms9eto1#
实现这一点的方法是在 predicate 中使用
self::
轴和not()
运算符:例如,使用这样的XML
可以使用以下XPath-1.0表达式:
其可以被缩短为
生成的节点集符合要求
XPath表达式选择第一部分的所有元素,并检查 predicate 中的每个元素本身(
self::*
或.
)是否都在第二部分中。如果是,则将其排除(not(...)
)。您也可以将这种方法应用于属性节点。在这种情况下,您必须使用
.
,因为self::*
更具体,并且只选择元素。因此,您可以将self::*
替换为.
,但不能反过来。(最通用的轴是self::node()
。)2nc8po8w2#
您可以在此处使用逻辑andandnot运算符。
对于您的特定示例,可以使用以下XPath
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)]
。