节点

时间:2015-05-06 12:25:07

标签: xml xpath

给定一个节点具有未定义的子节点数量的节点,我想知道所有这些子节点是否存在某个属性值对的“完全缺失”。我可以查询单个子节点的缺席条件,如下所示:

//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

我希望这能澄清事情。

提前致谢!

干杯

2 个答案:

答案 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]

希望这会有所帮助......