【发布时间】:2011-11-06 00:59:37
【问题描述】:
如何在 SQL 中使用 XQuery 获取具有排序属性的 XML?
例如对于这个 XML:
<root><book b='' c='' a=''/></root>
必须返回:
<root><book a='' b='' c=''/></root>
【问题讨论】:
-
您使用的是哪个数据库?
标签: sql xml xquery-sql
如何在 SQL 中使用 XQuery 获取具有排序属性的 XML?
例如对于这个 XML:
<root><book b='' c='' a=''/></root>
必须返回:
<root><book a='' b='' c=''/></root>
【问题讨论】:
标签: sql xml xquery-sql
属性在 XML 中是无序的,因此无论打印出属性的顺序如何,文档都被认为是相同的。XQuery 肯定无法更改属性的顺序,我怀疑 SQL XML 也可以。
【讨论】:
来自Limitations of the xml Data Type。
不保留 XML 实例中属性的顺序。当你 查询xml类型列中存储的xml实例,顺序为 生成的 XML 中的属性可能与原始 XML 不同 实例。
因此,即使您能找到一种对属性进行排序的方法,您也不能相信 SQL Server 中的 XML 数据类型会保留您想要的顺序。
【讨论】:
虽然属性的顺序没有语义意义,但XML的设计目标之一是人类可读,因此尝试生成属性顺序一致并反映用户的词法XML并非完全不合理期望:例如<point x="2" y="5" z="7"/> 比<point z="7" x="2" y="5"/> 更容易看。因此,Saxon 序列化程序有一个选项 saxon:attribute-order,它允许控制输出 XML 中属性的顺序:请参阅 http://www.saxonica.com/documentation/index.html#!extensions/output-extras/serialization-parameters
【讨论】:
除了Mikael Eriksson's helpful answer SQL Server 不会保留 XML 属性排序,Michael Kay's special accommodation in Saxon 用于按名称按字母顺序序列化属性之外,未来的读者应该注意XML Recommendation 表示the order of XML attributes is insignificant:
请注意,开始标签中属性规范的顺序或 空元素标签不重要。
因此,XML 工具通常不关心属性排序,除非您关心 XML 规范化/规范化1,否则您也不应该。如果 XML 建议中没有对属性排序的规定,通过利用诸如 saxon:attribute-order 之类的特殊机制来实现排序可能只是暂时的、本地化的成功,因为 XML 生态系统不会保证任何排序,因为您的 XML 通过工具和工具链贯穿其生命周期。
1对于这些罕见的情况,请参阅XML Normalization Recommendation 中的section on attribute processing 或Canonical XML Recommendation。
【讨论】: