If you want to reorder existing xml, you can use 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>')
Result:
<test>
<tree abc="123" />
<tree-order abc="456" />
<tree abc="789" />
</test>
update:
To reorder multiple nodes, you can use XQuery like this:
select @data.query('
element Main {
for $j in Main/test
return element test {
for $i in $j/* order by $i/@abc return $i
}
}
')
update 2
To order by integer values of attributes, use 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
}
}
')