我想建立簡單的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'替換'命令)。
首先,很奇怪XQuery引擎不是在抱怨使用上下文節點**的**表達式。其次,如果出於某種原因需要'xs:boolean'的true和false實例,則應該使用'true()'和'false()'函數而不是'child :: true'縮寫形式... * *但我不認爲你需要這個。只要使用'exists()'結果這是一個布爾值。 – 2011-03-17 19:33:06
重新標記爲@ 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