给出以下示例XML:
<a z="123" y="321"></a>
<b z="456" y="654"></b>
<c x="456" w="654"></c>
<c x="123" w="111"></c>
<c x="789" w="321"></c>
我需要一个xpath查询,它将返回元素&#39; a&#39;,因为有一个&#39; c&#39; @x等于a的@z的元素,其@w不等于a的@y。
请注意&#39; b&#39;因为有一个&c;而且不会被退回。元素,其中@ x = @ z和@ w = @ y。
此外,返回的元素可以是任何元素(*)。重要的是有一个匹配的&#39; c&#39; element,第二个属性不匹配。
我最接近的是:
//*[@z=//c/@x and .[@y != //c/@w]]
然而,在上面的示例中,这不会返回&#39; a&#39;因为@z匹配了&#39; c&#39;元素,@ y匹配不同&#39; c&#39;元件。第二个属性检查需要针对相同的&#39; c&#39;元件。
我希望这是有道理的。
答案 0 :(得分:1)
此XPath 2.0表达式:
//*[
let $a := .
return
following-sibling::*[@x eq $a/@z and not(@w eq $a/@y)]
]
将匹配的元素绑定到谓词中的变量,然后在谓词中将其用于该context元素的follow-sibling元素,以查看它们的属性是否满足规定的要求。