我正在从SQL Server查询生成XML文件。
我对元素排序有一些疑问。
例如,有下面的简单代码。
<test> <tree abc="123"/> <tree abc="789"/> <tree-order abc="456"/> </test>
如您所见,树和树顺序是不同的元素,我想按属性排序
<test> <tree abc="123"/> <tree-order abc="456"/> <tree abc="789"/> </test>
像这样。
任何人都有解决这个问题的好主意吗?
谢谢你。
对不起,我有以下详细问题
AS是
<Main> <test> <tree abc="123"/> <tree abc="789"/> <tree-order abc="456"/> </test> <test> <tree abc="123"/> <tree abc="789"/> <tree-order abc="456"/> </test> </Main>
成为 :
<Main> <test> <tree abc="123"/> <tree abc="456"/> <tree-order abc="789/> </test> <test> <tree abc="123"/> <tree abc="456"/> <tree-order abc="789/> </test> </Main>
如果要重新排序现有的xml,可以使用XQuery:
XQuery
declare @data xml = ' <test> <tree abc="123"/> <tree abc="789"/> <tree-order abc="456"/> </test> ' select @data.query('<test>{for $i in test/* order by $i/@abc return $i}</test>')
结果:
<test> <tree abc="123" /> <tree-order abc="456" /> <tree abc="789" /> </test>
[sql fiddle demo](http://sqlfiddle.com/#!3/d41d8/26941)
更新:
要对多个节点重新排序,可以使用XQuery,如下所示:
select @data.query(' element Main { for $j in Main/test return element test { for $i in $j/* order by $i/@abc return $i } } ')
[sql fiddle demo](http://sqlfiddle.com/#!3/d41d8/26968)
更新2
要按属性的整数值排序,请使用cast as <type>:
cast as <type>
select @data.query(' element Main { for $j in Main/test return element test { for $i in $j/* order by $i/@abc cast as xs:integer? return $i } } ')
[sql fiddle demo](http://sqlfiddle.com/#!3/d41d8/26982)