XQuery/更新和命名空间
外观
< 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 非常乐意提出这些观察并提供示例。