2017-08-11 64 views
0

我试图使用XQuery更新包装与另一个新节点的节点,我被困在几个不同的错误,让我给你一个简单的例子: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:开启功能。

我想要得到的到底是

<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 {...}. 

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

回答

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> 
+0

第一个查询会引发错误“[XUDY0009] Target没有父母:元素。“第二个查询在“替换”标记中引发语法错误表达式:(但第三个查询正常工作) – IgnacioHR

+0

我已更新前两个查询。要了解更新表达式和非更新表达式之间的区别,请查看语义:http://docs.basex.org/wiki/Update。 –

+0

好!谢谢!现在所有查询都可以使用! – IgnacioHR