一部の XML を並べ替えていますが、特定の一意でない属性に基づいて要素を並べ替えたいと考えています。これにより、同様の要素をグループ化できます。これらのグループ内では、元の順序を維持する必要があります。問題は、ソート時にこれらのグループ内の順序が変更され、再ソートすると順序が再び変更されることです。XML のコンテンツが変更されていない場合に変更しない並べ替えが必要です (そうしないと、SVN の差分が見苦しくなります)。簡単な例を次に示します。
$xml = [xml]@"
<root>
<element name="a" number="1" />
<element name="b" number="1" />
<element name="c" number="1" />
<element name="d" number="2" />
<element name="e" number="2" />
<element name="f" number="2" />
<element name="g" number="3" />
<element name="h" number="3" />
</root>
"@
Write-Host "`nFirst Sort produces this:"
$result1 = $xml.SelectNodes('//element') | Sort-Object -Property 'number'
Write-Host (($result1 | select -ExpandProperty 'number') + " <---Sorted on")
Write-Host (($result1 | select -ExpandProperty 'name') + " <---Order not maintained")
Write-Host "`nSorting the (already sorted) results of First Sort produces this:"
$result2 = $result1 | Sort-Object -Property 'number'
Write-Host (($result2 | select -ExpandProperty 'number') + " <---Sorted on")
Write-Host (($result2 | select -ExpandProperty 'name') + " <---Order changed again")
出力は次のとおりです。
First Sort produces this:
1 1 1 2 2 2 3 3 <---Sorted on
c b a f e d h g <---Order not maintained
Sorting the (already sorted) results of First Sort produces this:
1 1 1 2 2 2 3 3 <---Sorted on
a b c d e f g h <---Order changed again
この例では、「番号グループ」内で元の「名前」の順序を維持する必要があります。
これを元の順序に維持し、複数回並べ替えたときに同じ結果になる簡単な方法を考えられる人はいますか?
元の順序を表すダミー属性を追加しないようにしています。より決定論的な別の .NET ソート関数があるのではないでしょうか? 私は検索しましたが、同等のグループ内での順序付けに関心がある人は誰もいなかったようです。
ありがとう。