Как получить XML с отсортированными атрибутами, используя XQuery в SQL?
например для этого XML:
<root><book b='' c='' a=''/></root>
должен вернуться:
<root><book a='' b='' c=''/></root>
Как получить XML с отсортированными атрибутами, используя XQuery в SQL?
например для этого XML:
<root><book b='' c='' a=''/></root>
должен вернуться:
<root><book a='' b='' c=''/></root>
Из Ограничения типа данных xml .
Порядок атрибутов в экземпляре XML не сохраняется. Когда вы запрашиваете экземпляр XML, хранящийся в столбце типа xml, порядок атрибутов в результирующем XML может отличаться от исходного экземпляра XML.
Таким образом, даже если бы вы смогли найти способ сортировки атрибутов, вы не можете быть уверены, что тип данных XML в SQL Server сохранит нужный вам порядок.
Атрибуты в XML неупорядочены, поэтому документ считается одним и тем же в любом порядке, в котором атрибуты распечатаны. XQuery, конечно же, не имеет возможности изменить порядок атрибутов, и я сомневаюсь, что SQL 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
Помимо полезного ответа Микаэля Эрикссона, SQL Server не будет сохранять порядок атрибутов XML и специальное приспособление Майкла Кея на саксонском языке для атрибутов сериализации в алфавитном порядке по имени, будущие читатели должны быть предупреждены, что Рекомендация XML говорит, что порядок XML-атрибутов не имеет значения:
Обратите внимание, что порядок спецификаций атрибутов в начальном теге или теге пустого элемента не имеет значения.
Поэтому XML-инструменты, как правило, не заботятся об упорядочении атрибутов, и если вы не занимаетесь нормализацией/канонизацией XML1, вы не должны этого делать. Без упорядочивания атрибутов в Рекомендации по XML достижение упорядочения с использованием специальных механизмов, таких как saxon:attribute-order
, скорее всего, окажется лишь временным, локализованным успехом, поскольку экосистема XML не гарантирует никакого упорядочения, когда ваш XML проходит через инструменты и цепочки инструментов через его жизненный цикл.
1Для тех редких случаев см. раздел об обработке атрибутов в Рекомендация по нормализации XML или Каноническая рекомендация XML.