XPath:仅当所有子节点都具有特定值时才获取父节点的属性

时间:2018-03-08 15:46:51

标签: xml xpath xquery

我有以下XML文档:

<root>
  <description name="testing1">
    <descriptionextension name="unda">
      <type>test</type>
    </descriptionextension>
    <descriptionextension name="koppu">
      <type>test</type>
    </descriptionextension>
    <descriptionextension name="valid">
      <type>test</type>
    </descriptionextension>
  </description>
  <description name="testing2">
    <descriptionextension name="valid">
      <type>test</type>
    </descriptionextension>
    <descriptionextension name="valid">
      <type>test</type>
    </descriptionextension>
    <descriptionextension name="valid">
      <type>test</type>
    </descriptionextension>
  </description>
</root>

这是XPath查询:

//description/descriptionextension[contains(@name,'valid')]/../@name

仅当所有子说明扩展名都有效时,是否可以获取说明名称&#39;。在这里,我只想获取&#34; testing2&#34;。

4 个答案:

答案 0 :(得分:4)

一个解决方案:

//description[empty(descriptionextension[@name != 'valid'])]/@name/string()

这是另一个(还有其他各种):

//description[not(descriptionextension/@name != 'valid')]/@name/string()

使用XQuery,您可以写:

for $d in //description
where every $de in $d/descriptionextension satisfies $de/@name = 'valid'
return $d/@name/string()

正如您可能已经看到的那样,如果description没有descriptionextension子元素,也会被接受。

答案 1 :(得分:1)

您可以尝试查找所有元素,不任何出现其他而不是“有效”:

/root/description[count(descriptionextension[@name!="valid"])=0]/@name

如果根本没有扩展,可能需要检查会发生什么......

答案 2 :(得分:1)

试试这个:

string(//description[count(descriptionextension[@name="valid"]) = count(descriptionextension)]/@name)

输出:

testing2

答案 3 :(得分:-2)

这应该可以解决问题

//description[descriptionextention/@name='valid']/@name