XPath查询匹配任何特定元素名称的多个属性

时间:2017-09-21 01:55:32

标签: xpath

给出以下示例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;元件。

我希望这是有道理的。

1 个答案:

答案 0 :(得分:1)

此XPath 2.0表达式:

//*[
    let $a := . 
    return 
     following-sibling::*[@x eq $a/@z and not(@w eq $a/@y)] 
    ]

将匹配的元素绑定到谓词中的变量,然后在谓词中将其用于该context元素的follow-sibling元素,以查看它们的属性是否满足规定的要求。