跳轉到內容

XQuery/更新和名稱空間

來自華夏公益教科書,開放的書籍,開放的世界

您想更新一個 XML 檔案並瞭解 XQuery 更新過程可能如何影響下次檢視文件時的名稱空間。

我們將使用 XQuery 更新語句更改 XML 文件的值,並注意預設輸出在預設名稱空間和名稱空間字首的呈現方式方面的變化。XQuery 更新可能會影響名稱空間的呈現方式。

假設我們有一個包含預設名稱空間的任務,例如以下 XML 文件。

使用預設名稱空間的示例 XML 文件。

<task xmlns="http://www.example.com/task">
    <id></id>
    <task-name>Task Name</task-name>
    <task-description>Task Description</task-description>
</task>

在下面的示例中,我們將此 XML 文件稱為 $doc。

大多數想要檢視 XML 的人更喜歡使用預設名稱空間,而不是用不必要的名稱空間字首弄亂整個文件。

假設我們剛剛儲存了此檔案,現在我們想向<id>元素新增一個 ID 值。在我們使用以下更新語句更新此 XML 檔案後,我們注意到序列化將發生變化。

  update replace $doc/task:task/task:id with <task:id>123</task:id>

下次我們檢視此文件時,我們會看到以下內容

<task:task xmlns:task="http://www.example.com/task">
    <task:id>123</task:id>
    <task:task-name>Task Name</task:task-name>
    <task:task-description>Task Description</task:task-description>
</task:task>

這被稱為“完全限定”文件,其中每個元素的名稱空間字首都完全顯示出來。從技術上講,它等同於前面的示例。但這可能不是您想要的。

更新元素值,而不是整個元素

[編輯 | 編輯原始碼]

為了解決這個問題,我們可以只更新 id 的 text() 節點,而不是整個 id 元素

  update replace $doc//task:id/text() with 123

或者您可以使用 update/value 語法

  update value $doc//task:id with 123

使用這兩種方法中的任何一種都不會弄亂您的預設名稱空間結構。

Joe Wicentowski 非常樂意提出這些觀察並提供示例。

華夏公益教科書