[英]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.