2013-02-20 39 views
1

我試圖更新節點的屬性值並返回其先前的值全部在一個查詢中,我找不到一種方法來執行此操作。我使用BaseX作爲我的XML/XQuery數據庫。XQuery更改屬性值並返回上一個

現在我試着這樣做:

/Root/Elem/properties/property[@id='17']/@format, 
replace value of node /Root/Elem/properties/property[@id='17']/@format with 'URL' 

而且這樣的:

for $prop in /Root/Elem/properties/property[@id='17'] 
    let $format := $prop/@format 
    return (replace value of node $prop/@format with 'URL', $format) 

和多個其他的測試,但他們都導致以下錯誤:

List expression: no updating expression allowed. 

是BaseX的限制還是XQuery不可能?

回答

3

XQuery更新不允許從更新查詢返回結果。但是,您可以使用BaseX專有db:output($seq)功能來做到這一點:

for $prop in /Root/Elem/properties/property[@id='17'] 
let $format := $prop/@format 
return (replace value of node $format with 'URL', db:output($format)) 
+0

是我見過BaseX文檔中的專有功能,但希望的是更通用的方法。所以在Xquery中,你將不得不執行兩個連續的查詢來獲得一個值,然後改變它?沒有其他方法?那麼轉換方法呢? – koopajah 2013-02-20 11:20:52

+2

BaseX/XQuery更新中沒有其他方法。轉換不具有持久性,所以您只能更改臨時副本。也許可以使用[XQuery Scripting Extension](http://www.w3.org/TR/xquery-sx-10/),但我不知道它,BaseX也不支持它。 – 2013-02-20 11:25:34

+2

關於官方XQuery更新工具,您可能很幸運得知有一些計劃支持XQUF 3.1中的更新和結果。 – 2013-02-20 11:26:08