用于包装现有节点的XQuery Update

时间:2017-08-11 11:45:46

标签: xquery basex

我正在尝试使用XQuery更新用另一个新节点包装一个节点,我陷入了几个不同的错误让我给你一个简短的例子:

初始XML

<a id="test">
  <title>title</title>
</a>

XQuery代码是:

copy $x := db:open('testdb')/a[@id eq 'test']/title 
modify replace node $x 
with <b>{$x}</b> 
return <ok/>

我使用basex作为周围的数据库,这就是我使用db:open函数的原因。

我最终想要获得的是

<a id="test">
  <b>
    <title>title</title>
  </b>
</a>

但我收到错误:

[XUDY0009] Target has no parent: element title {...}.

注意:查询结果:

db:open('testdb')/a[@id eq 'test']/title

<title>title</title>

如果我按如下方式修改查询

copy $x := db:open('testdb')/a[@id eq 'test']/title 
modify replace node db:open('testdb')/a[@id eq 'test']/title
with <b>{$x}</b> 
return <ok/>

然后错误是

[XUDY0014] Node was not created by copy clause: element title {...}.

进行此类更新查询的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您需要修改绑定到$ x的节点,并返回$ x:

copy $a := db:open('testdb')/a[@id eq 'test']
modify replace node $a/title with <b>{ $a/title }</b> 
return $a

在BaseX中,可以使用update关键字作为替代。它允许更紧凑的表示:

db:open('testdb')/a[@id eq 'test'] update {
  replace node title with <b>{ title }</b> 
}

如果您想更新数据库节点本身,则无需使用copyupdate

let $title := db:open('testdb')/a[@id eq 'test']/title 
return replace node $title with <b>{ $title }</b>