给定一个节点具有未定义的子节点数量的节点,我想知道所有这些子节点是否存在某个属性值对的“完全缺失”。我可以查询单个子节点的缺席条件,如下所示:
//node[@some_attribute='some_value' and //node[@some_other_attribute!='value_of_interest']]
但是这将与“任何”子节点的缺失相匹配,而不一定都是。有没有办法为他们所有人这样做?如果有必要,我也可以在Xpath之外实现这一目标,但这可能会削弱性能
EDIT1: XML就是一个例子:
<xml>
<node id='1' attr1='value'>
<child id='1' attr2='foo' />
<child id='2' attr2='bar' />
<child id='3' attr2='bar' />
</node>
<node id='2' attr1='value'>
<child id='4' attr2='bar' />
<child id='5' attr2='bar' />
<child id='6' attr2='bar' />
</node>
</xml>
使用此查询:
//node[@attr1 and //child[@attr2!='foo']]
我可以提取一个节点,其中任何一个子节点都有 attr2 的值,这个值不等于'foo',但我需要 all 节点的子节点不等于该值。
因此,所需查询将使用 id = 2 检索 node ,而 id = 1
我希望这能澄清事情。
提前致谢!
干杯
答案 0 :(得分:1)
可以认为它不是满足条件的所有子元素,而是因为没有子元素不满足条件。
//node[not(child/@attr2 = 'foo')]
表示
//node Select `node` elements anywhere in the document
[not(child/@attr2 = 'foo')] but only if there is no child element called
`child`, which has an attribute `attr2` whose
value is "foo".
,输出
<node id="2" attr1="value">
<child id="4" attr2="bar"/>
<child id="5" attr2="bar"/>
<child id="6" attr2="bar"/>
</node>
如果这是您的实际文档结构,请使用
/xml/node[not(child/@attr2 = 'foo')]
如果node
的子元素名称无关紧要,请使用
//node[not(*/@attr2 = 'foo')]
答案 1 :(得分:0)
也许你应该这样试试:
//node[@attr1 and count(.//child[@attr2='foo'])=0]
希望这会有所帮助......