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>
}
如果要更新数据库节点本身,则不需要使用copy
或update
:
let $title := db:open('testdb')/a[@id eq 'test']/title
return replace node $title with <b>{ $title }</b>
我正在尝试使用 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>
}
如果要更新数据库节点本身,则不需要使用copy
或update
:
let $title := db:open('testdb')/a[@id eq 'test']/title
return replace node $title with <b>{ $title }</b>