我有这段XML代码:
<player name="John" points="50">
<game points="5">Beans</game>
<game points="40">Cucumbers</game>
<game points="50">Tomatos</game>
</player>
我想要做的是获得这一块,但仅限于那些点数(“游戏”的属性)等于“玩家”属性的点数的游戏。 因此,考虑到上面的例子,我应该得到下一个XML-piece:
<player name="John" points="50">
<game points="50">Tomatos</game>
</player>
我写下XQuery:
for $a in doc("ex.xml")
where $a/xs:int(@points)=$a/game/xs:int(@points)
return $a
但我没有得到任何结果。你能帮我吗?
答案 0 :(得分:2)
您不能通过选择子树的一部分来修改/过滤子树(如果不使用XQuery更新)。您将不得不重新构建XML。
element player {
/player/@*,
/player/game[@points=/player/@points]
}
第一行创建一个新元素,第二行再次添加属性,第三行创建满足点条件的所有游戏。
如果你有文件中的多个玩家,你需要循环,代码看起来像这样:
for $player in /player
return element player {
$player/@*,
$player/game[@points=$player/@points]
}
现在,我们不会在根级别启动所有查询,而是使用$player
作为上下文。
使用 XQuery Update (如果您的XQuery处理器支持),您也可以执行以下操作(实际上不会更改原始文档,只能复制一份):
copy $result := .
modify delete node $result//game[../@points != @points]
return $result