XQuery 更新以包装现有节点

XQuery Update to wrap an existing node

我正在尝试使用 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 {...}.

进行这种更新查询的正确方法是什么?

需要修改$x绑定的节点,return$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>