跳转到内容

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 非常乐意提出这些观察并提供示例。

华夏公益教科书