Упорядочить 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 не должен иметь значения. Я никогда не видел, чтобы кто-то хотел просто переупорядочить узлы, обычно это было бы сделано для того же значения узла (например, переупорядочить элементы, чтобы самые дорогие были первыми).

Другие вопросы по тегам