我有这个文件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”。
感谢您的帮助。
答案 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