2011-03-17 63 views
3

我想建立簡單的XML數據庫(內部BaseX或存在,但分貝),但我有麻煩搞清楚如何修改文檔值:XQuery更新:插入或替換取決於節點是否存在不可能?

內容很簡單,因爲這對於測試:

<p> 
    <pl> 
     <id>6></id> 
    </pl> 
</p> 

我正在嘗試構建一些功能,如果該元素不存在,則將元素插入<pl>;如果該元素存在,則將其替換。但是XQuery的是給我麻煩尚未:

當我嘗試它正面與IF-THEN-ELSE邏輯:

if (exists(/p/pl[id=6]/name)=false) 
then insert node <name>thenname</name> into /p/pl[id=6] 
else replace value of node /p/pl[id=6]/name with 'elsename' 

我得到錯誤Error: [XUDY0027] Replace target must not be empty。顯然我很困惑,爲什麼在這兩種情況下評估其他部分,從而出現錯誤。 當我空出else部分:

if (exists(/p/pl[id=6]/name)=true) 
    then insert node <name>thenname</name> into /p/pl[id=6] 
    else <dummy/> 

然後我得到Error: [XUST0001] If expression: no updating expression allowed

當我試圖通過聲明更新功能,即使如此,它報告錯誤:

declare namespace testa='test'; 

declare updating function testa:bid($a, $b) 
{ 
if (exists(/p/pl[id=6]/name)=true) 
    then insert node <name>thenname</name> into /p/pl[id=6] 
    else <dummy/> 
}; 

testa:bid(0,0) 

Error: [XUST0001] If expression: no updating expression allowed.

我得從BaseX 6.5.1包裝這些錯誤。

那麼,如果可能的話,如何以簡單的方式修改值呢? 如果我直接調用插入,則可能有多個具有相同值的元素。 如果我打電話替換當節點不存在時它會失敗。 如果我刪除插入/替換之前的節點,然後我可以銷燬我不想要的子節點。

在大多數SQL數據庫中,這些任務非常簡單(如MYSQL'替換'命令)。

+0

首先,很奇怪XQuery引擎不是在抱怨使用上下文節點**的**表達式。其次,如果出於某種原因需要'xs:boolean'的true和false實例,則應該使用'true()'和'false()'函數而不是'child :: true'縮寫形式... * *但我不認爲你需要這個。只要使用'exists()'結果這是一個布爾值。 – 2011-03-17 19:33:06

+0

重新標記爲@ joewiz的[answer](http://stackoverflow.com/questions/5335046/xquery-update-insert-or-replace-depending-if-node-exists-not-possible/5346939#5346939)existDB是不是XQuery更新工具標準抱怨XQuery引擎。 – 2011-03-22 03:14:00

回答

5

@Qiqi:@Alejandro是對的。你如果表達式是不正確XQuery的語法:

​​

注意存在-DB的XQuery更新功能是目前的具體存在,但實現,所以在存在(目前)的1.4.x和1.5dev,你會想:

if (exists(/p/pl[id=6]/name)) 
then update insert <name>thenname</name> into /p/pl[id=6] 
else update value /p/pl[id=6]/name with 'elsename' 

此特定於eXist的XQuery更新語法記錄在http://exist-db.org/update_ext.html上。此語法是在W3C XQuery Update規範達到其當前狀態之前開發的。 eXist團隊計劃儘快使eXist完全符合W3C規範,但與此同時,如果您使用eXist,上述文檔應該可以幫助您實現您需要的內容。

還要注意,您的示例代碼在pl和id元素中包含一個錯字。有效的XML版本將是:

<p> 
    <pl> 
    <id>6</id> 
    </pl> 
</p> 
相關問題