xquery - 查询recover parents节点

时间:2013-11-28 15:22:18

标签: xml xpath xquery

我有这个文件xml:

<EV id="000" age="10">
   <specie cod="e00"/> 
   <acc child="002"/>
</EV>
<EV id="001" age="12">
   <specie cod="e01"/> 
   <acc child="002"/>
</EV>
<EV id="002" age="2">
   <specie cod="e00"/> 
   <acc/>
</EV>
<EV id="003" age="30">
   <specie cod="e00"/> 
   <acc child="005"/>
</EV>
<EV id="004" age="20">
   <specie cod="e00"/> 
   <acc child="005"/>
</EV>
<EV id="005" age="5">
   <specie cod="e00"/> 
   <acc/>
</EV>

现在我必须打印标签的其他两个标签(父母)中出现的标签属性@id(我的项目的子节点)的结果,但是两个标签(父节点)必须具有属性@cod在标签不同。另一个问题是,与父母双方不同的年龄是轻微的。 5年(10和12是好的,20和30没有)。

上面的xml示例:xquery必须只打印id =“002”。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这是一个使用谓词的版本:

for $e in /EV
return $e[count(distinct-values(../EV[acc/@child = $e/@id]/specie/@cod)) = 2][abs(../EV[acc/@child = $e/@id][1]/@age - ../EV[acc/@child = $e/@id][2]/@age) < 5]

但是,我可能更喜欢更易阅读的版本:

for $parent in /EV
let $childs := $parent/../EV[acc/@child = $parent/@id]
where
  count(distinct-values($childs/specie/@cod)) = 2
  and
  abs($childs[1]/@age - $childs[2]/@age) < 5
return $parent