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

匹配任何特定元素名称的多个属性的XPath查询,xpath,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> 然而,在我上面的示例中,这不会返回“a”,因为@z匹配“c”元素的@x,而@y匹配不同的“c”元素的@w。需要对同

给定以下示例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>
然而,在我上面的示例中,这不会返回“a”,因为@z匹配“c”元素的@x,而@y匹配不同的“c”元素的@w。需要对同一个“c”元素进行第二次属性检查


我希望这是有道理的

此XPath 2.0表达式:

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

将匹配的元素绑定到谓词中的变量,然后在该上下文元素的以下同级元素的谓词中使用它,以查看它们的属性是否满足所述要求。

Nice(+1),但使用
避免同级元素之间的顺序依赖,而不是
follow sibling::*
,或
/*
检查文档中的任何位置是否存在。另外,可能需要注意的是,在XPath 1.0中,如果不使用调用语言的构造,则无法进行此选择。不幸的是,我使用的程序似乎不支持此选择,我怀疑它只支持XPath 1.0。它在第一个$s中抱怨说“节点名后只允许谓词开始、轴、空格、连词和运算符”。听起来它认为“let”是一个节点名,而不是一个变量声明。
//*[
    let $a := . 
    return 
     following-sibling::*[@x eq $a/@z and not(@w eq $a/@y)] 
    ]