2017-08-11 63 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