XPath组合节点集
假设我有两个表达式:XPath组合节点集,xpath,Xpath,假设我有两个表达式://div[@class=“foo”]和//span[@class=“foo”]。是否可以“组合”它们,如: //(div | span)[@class="foo"] 或者我只能取两个完整表达式的并集 //div[@class="foo"] | //span[@class="foo"] 这项工程: (//golfer | //batter)[@ID="2" or @ID="3"] …这让我大吃一惊。获取所有div和span元素具有class=“foo”的更惯用(我敢说可
//div[@class=“foo”]
和//span[@class=“foo”]
。是否可以“组合”它们,如:
//(div | span)[@class="foo"]
或者我只能取两个完整表达式的并集
//div[@class="foo"] | //span[@class="foo"]
这项工程:
(//golfer | //batter)[@ID="2" or @ID="3"]
…这让我大吃一惊。获取所有div
和span
元素具有class=“foo”
的更惯用(我敢说可读)的方法是:
//*[(self::div or self::span) and @class="foo"]
英文:
选择本身是div或span且具有值为“foo”的class属性的所有元素
对于您的原始问题,以下表达式返回相同的结果:
(//div |//span)[@class=“foo”]
//div[@class=“foo”]|//span[@class=“foo”]
div
和span
元素的并集,进一步过滤以仅包括那些具有class=“foo”
的元素,而后一个为您提供1)具有class=“foo”的所有div
元素的并集
和2)具有class=“foo”
的所有span
元素的集合
很明显,这两个集合包含相同的内容。
(//div |//span)[@class=“foo”]
也包含相同的内容。谢谢为什么这令人惊讶?当然,请注意,(//golfer |//batter)[@ID=“2”或@ID=“3”]
并不等同于//golfer[@ID=“2”].//batter[@ID=“3”]
。我之所以提到这个问题,是因为你选择了一个与OP的原始问题不匹配的例子,这样在上下文中可能会与我的答案中显示的等价表达式相混淆。