Упорядочить xml по элементу local-name на среднем уровне xquery
Я хотел бы переупорядочить все элементы некоторого xml на определенном уровне по имени элемента, но у меня возникли некоторые проблемы. Вот пример вывода xml, с которым я работаю (я использую его в переменной @XML в SQL Server 2008 R2:
<Data>
<Uns>
<Orgs>
<Prods>
<Prod>
<Something>1</Something>
<Cars>
<Car>
<Number>2013213</Number>
<BasicInfo>
<FirstName>Bob</FirstName>
<LastName>Monkhouse</LastName>
</BasicInfo>
<Anything>654</Anything>
</Car>
<Car>
<Number>2013213</Number>
<BasicInfo>
<FirstName>Bob</FirstName>
<LastName>Monkhouse</LastName>
</BasicInfo>
<Anything>654</Anything>
</Car>
</Cars>
</Prod>
<Prod>
<Cars>
<Car>
<Number>2013213</Number>
<BasicInfo>
<FirstName>Bob</FirstName>
<LastName>Monkhouse</LastName>
</BasicInfo>
<Anything>654</Anything>
</Car>
</Cars>
</Prod>
</Prods>
</Orgs>
</Uns>
</Data>
Я хотел бы изменить порядок (в приведенном выше примере) всех дочерних элементов <Cars>
в алфавитном порядке, оставляя их содержимое нетронутым. Исходя из некоторой помощи по другому вопросу, где ответ дал идеи, но ошибка, я полностью погрузился в попытки пробовать различные варианты этого:
select @XML.query('element Cars {
for $anything in //Car
order by local-name($anything/*[1])
return $anything
}')
но ничего не работает. Я обнаружил, что постоянно сталкиваюсь с комбинацией этих трех проблем: ошибка, которая говорит: "Синтаксис XQuery '/function()' не поддерживается", теряя все родительские элементы (как в примере выше) или ничего при все происходит в порядке (опять же, как указано выше). Я беспокоюсь, что я должен использовать SET @XML.modify()
вместо SELECT @XML.query()
, но это приводит к еще меньшим результатам.
Я проделал большую часть траления в Интернете, но ни один из найденных сайтов не дает полного понимания синтаксиса xquery FLWOR - приведены только конкретные и часто простые примеры, которые не помогли мне найти Решение о том, почему это не ведет себя, как я надеялся.
Вот как в идеале должен выглядеть приведенный выше xml после преобразования (порядок Number,BasicInfo и Anything изменяется на алфавитный):
<Data>
<Uns>
<Orgs>
<Prods>
<Prod>
<Something>1</Something>
<Cars>
<Car>
<Anything>654</Anything>
<BasicInfo>
<Name>Bob</Name>
</BasicInfo>
<Number>2013213</Number>
</Car>
<Car>
<Anything>654</Anything>
<BasicInfo>
<Name>Bob</Name>
</BasicInfo>
<Number>2013213</Number>
</Car>
</Cars>
</Prod>
<Prod>
<Cars>
<Car>
<Anything>654</Anything>
<BasicInfo>
<Name>Bob</Name>
</BasicInfo>
<Number>2013213</Number>
</Car>
</Cars>
</Prod>
</Prods>
</Orgs>
</Uns>
</Data>
Любая помощь и советы высоко ценится; Я буду продолжать поиск в Интернете для более полного понимания синтаксиса и того, что именно он делает, но получение какого-то результата было бы настоящим стимулом на данном этапе!
Спасибо!
1 ответ
Вы хотите изменить порядок элементов в каждом <Car/>
элемент, поэтому понадобится два for
петли. Следующее должно работать:
for $car in //Car
return <Car>{
for $el in $car/*
order by local-name($el)
return $el
}</Car>
Вам придется реконструировать родительские элементы, так как XQuery не может изменять существующие узлы (для этого вам понадобится XQuery Update, и я очень сомневаюсь, что SQL Server 2008 поддерживает это).
Тем не менее, учтите, что я с трудом представляю, для чего может быть использован ваш повторный заказ. Он представляет ту же информацию, что и раньше, и каждый анализатор XML не должен иметь значения. Я никогда не видел, чтобы кто-то хотел просто переупорядочить узлы, обычно это было бы сделано для того же значения узла (например, переупорядочить элементы, чтобы самые дорогие были первыми).