XPath比较节点属性
我有一个xml文档,呈现如下内容:XPath比较节点属性,xpath,Xpath,我有一个xml文档,呈现如下内容: <foo> <bar a="first"> <baz b="test" c="x"> </baz> </bar> <bar a="second"> <baz b="test" c="y"> </baz> </bar> <bar a="third">
<foo>
<bar a="first">
<baz b="test" c="x">
</baz>
</bar>
<bar a="second">
<baz b="test" c="y">
</baz>
</bar>
<bar a="third">
<baz b="noTest" c="y">
</baz>
</bar>
</foo>
我想选择所有存在2个不同baz子节点的“bar”节点,其中b的值相同,但c的值不同。
因此,在上面的示例中,我想选择前两个节点,但不选择第三个
以下是我的尝试:
//bar[baz/@b=跟随兄弟姐妹::bar/baz/@b和baz/@c!=跟随兄弟姐妹::bar/baz/@c]
我的问题是,虽然这在示例中起作用,但它并没有达到我想要的效果:如果存在另一个baz节点,且bar/@b具有相同的值,并且如果存在另一个baz节点,且bar/@c具有不同的值,则它会选择该节点;如果存在另一个baz节点,且两个baz节点的bar/@b相同,而bar/@c不同,则情况并非如此
是否可以组合这两个条件,以便它们检查相同的以下同级节点?我认为在XPath 1.0中不可能这样做,除非匹配的
bar
节点相邻?如果是这样,您可以使用//bar[baz[(following::bar[1]/baz/@b=@b和following::bar[1]/baz/@c!=@c)或(previous::bar[1]/baz/@b=@b和previous::bar[1]/baz/@c!=@c)]
我认为这在XPath 1.0中是不可能的,除非匹配的bar
节点相邻?如果是这样,您可以使用//bar[baz[(following::bar[1]/baz/@b=@b和following::bar[1]/baz/@c!=@c)或(preference::bar[1]/baz/@b=@b和preference::bar[1]/baz/@c!=@c)]