2016-02-19 87 views
0

我想刪除我的XML所有空<paragraph>節點的空節點。下面是我有:的XQuery - 刪除使用存在,但DB

<root> 
    <text> 
     <paragraph>This is some text</paragraph> 
     <paragraph></paragraph> 
     <paragraph>More text</paragraph> 
    </text> 
    <text> 
     <paragraph>Another paragraph</paragraph> 
     <paragraph></paragraph> 
    </text> 
</root> 

這裏是我的XQuery:

let $root-ele as element() := doc("text.xml")/* 
return 
    update delete $root-ele/text[paragraph = ''] 

它似乎並沒有被更新文件,但我不知道爲什麼?

回答

5

你的代碼,寫的,應該同時刪除<text>元素 - 而不是空<paragraph>元素。現在讓我們來設置這個問題放在一邊並弄清楚爲什麼你的代碼是不是有任何對源文件效果。

首先,你確定它是不是有什麼影響?根據您的編輯環境,您可能需要先關閉並重新打開text.xml文檔,然後才能看到更改。

確定文檔確實沒有被修改後,我猜想你的doc()函數沒有正確選擇文檔。要解決問題,儘量提供完整,絕對路徑到您的文檔,例如,doc('/db/text.xml')doc('/db/apps/my-app/text.xml')

確認您正確地處理文件後,使用XPath確認是否選擇了所需的節點,例如doc('/db/test.xml')/root/text/paragraph[. = '']以選擇空的段落。

一旦你能夠看到預期的節點,我會建議使用FLWOR刪除有問題的每個實例:

for $p in doc('/db/test.xml')/root/text/paragraph[. = ''] 
return 
    update delete $p 

隨着對eXist的XQuery更新語法文件明確 - 見http://exist-db.org/exist/apps/doc/update_ext.xml#syntax第3款 - 您應該儘可能使更新儘可能靠近更新的目標節點。

...在刪除或替換封閉代碼仍在使用的節點時要小心謹慎。這是因爲刪除或替換,將會立即處理,並刪除或替換節點將不再提供給查詢......然而,就像一個表達式如下[見鏈接樣例代碼]是安全的,因爲它只修改當前迭代變量...

+0

感謝您的幫助,結果證明文件路徑很好,但大部分問題是我使用eXide,而且我的瀏覽器正在緩存響應...而另一個問題在於我按照您的建議選擇了錯誤的節點進行刪除。謝謝你的幫助! – Stormdamage

+0

很高興聽到您標識了關鍵阻止程序 - 瀏覽器緩存。我從來沒有使用過eXide,所以如果你能夠重現導致eXide響應被緩存的條件,請將它們與現有的開放郵件列表共享:https://lists.sourceforge.net/lists/列表信息/存在開放。無論如何,如果你還沒有訂閱,我歡迎你訂閱。這是一個提問和查看其他人使用eXist的好地方。 – joewiz