XQuery节点和子节点中的属性相等

时间:2014-03-01 10:12:52

标签: xquery

我有这段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

但我没有得到任何结果。你能帮我吗?

1 个答案:

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