簡體   English   中英

修改XML以按名稱對中級復雜類型元素進行排序

[英]Modify XML to Order Mid-level Complextype Elements by Name

編輯: 請參閱此鏈接以了解后續問題

我在SQL Server 2008 R2中有一個大型的FOR XML EXPLICIT查詢,該查詢創建了一個xml文件,但是由於某些中級元素的顯示順序不正確,因此無法針對我的XSD架構進行驗證。 這是一個示例XML文件,顯示了我的意思:

<Things>
  <Thing>
    <Racecars>
      <Racecar>
        <Colour>Red</Colour>
        <Rockets>Y</Rockets>
      </Racecar>
      <Racecar>
        <Colour>Blue</Colour>
        <Rockets>N</Rockets>
      </Racecar>
    </Racecars>
  </Thing>
  <Thing>
    <Numbers>
      <Number>
        <NumericName>1</NumericName>
        <WrittenName>One</WrittenName>
      </Number>
      <Number>
        <NumericName>2</NumericName>
        <WrittenName>Two</WrittenName>
      </Number>
    </Numbers>
  </Thing>
  <Thing>
    <Letters>
      <Letter>
        <AlphaName>A</AlphaName>
        <PhoneticName>Ay</PhoneticName>
      </Letter>
      <Letter>
        <AlphaName>B</AlphaName>
        <PhoneticName>Bee</PhoneticName>
      </Letter>
    </Letters>
  </Thing>
</Things>

XML EXPLICIT命令的工作方式意味着包含某些屬性的每個組都是按順序排列的(在這種情況下是最底層),但是我不知道如何在(在這種情況下)“級別。 當沒有SQL到ORDER BY的屬性數據時,如何指定“事物”的子元素按名稱的字母順序顯示?

正如我所提到的,這是XML的一大部分,具有許多不同的元素,這些元素並不總是全部出現,因此,如果有某種方法可以在一定級別上對所有子元素進行排序,而又不影響孫子元素的排序無需對每個元素名稱進行硬編碼,那真是太好了。

我到處搜尋都無濟於事。 我既查看了XML輸出上的事后xquery修改(在我看來,這是最實用的解決方案,因為要排序的某些元素的minOccurs = 0),或者作為FOR XML EXPLICIT命令設計的一部分(這似乎是防止錯誤而不是消除錯誤的最有效方法),但是據我所知,似乎沒有任何效果。

當然,我可以從模式文件中刪除約束,但如果可能的話,寧願避免這種情況,因為屈服於不靈活性似乎是錯誤的前進方向。

使用以上文件,這是我認為理想的結果:

<Things>
  <Thing>
    <Letters>
      <Letter>
        <AlphaName>A</AlphaName>
        <PhoneticName>Ay</PhoneticName>
      </Letter>
      <Letter>
        <AlphaName>B</AlphaName>
        <PhoneticName>Bee</PhoneticName>
      </Letter>
    </Letters>
  </Thing>
  <Thing>
    <Numbers>
      <Number>
        <NumericName>1</NumericName>
        <WrittenName>One</WrittenName>
      </Number>
      <Number>
        <NumericName>2</NumericName>
        <WrittenName>Two</WrittenName>
      </Number>
    </Numbers>
  </Thing>
  <Thing>
    <Racecars>
      <Racecar>
        <Colour>Red</Colour>
        <Rockets>Y</Rockets>
      </Racecar>
      <Racecar>
        <Colour>Blue</Colour>
        <Rockets>N</Rockets>
      </Racecar>
    </Racecars>
  </Thing>
</Things>

如您所見,“事物”下面的三個元素現在按字母順序排序(字母,數字,賽車),但是每個元素中的所有元素的順序都保持不變。

如果您希望我寫出SELECT ... FOR XML EXPLICIT來生成上面的示例XML,請告訴我。 我會很樂意這樣做-我只是希望答案會直接在上述XML上以xquery的形式出現,因此認為不太可能需要!

您必須重構<Things/>元素,並按<Thing/>的名稱排序。 該代碼段按第一個孩子的名字排序,因為我們需要一個單獨的值來排序。 關於給定的輸入,似乎沒有必要在<Thing/> 內部進行排序(甚至可能是錯誤的)。

element Things {
  for $thing in /Things/Thing
  let $name := local-name(($thing/*)[1])
  order by $name
  return $thing
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM