匹配任何特定元素名称的多个属性的XPath查询
给定以下示例XML:匹配任何特定元素名称的多个属性的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。需要对同
<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)]
]