我正在尝试使用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 {...}.
进行此类更新查询的正确方法是什么?
答案 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>
}
如果您想更新数据库节点本身,则无需使用copy
或update
:
let $title := db:open('testdb')/a[@id eq 'test']/title
return replace node $title with <b>{ $title }</b>