Sort XMLDocument usando linq

Não consigo entender como fazer isso. Existem vários outros exemplos aqui, mas nada realmente corresponde ao que eu quero fazer:

Considere o seguinte objeto XMLDocument:

<Policy>
    <Covers>
        <MyCover1>
            <properties>
                <sortOrder>1</sortOrder>
            </properties>
        </MyCover1>

        <MyCover3>
            <properties>
                <sortOrder>3</sortOrder>
            </properties>
        </MyCover3>

        <MyCover2>
            <properties>
                <sortOrder>2</sortOrder>
            </properties>
        </MyCover2>
    </Covers>
</Policy>

Como eu classificaria este documento com base no nó "sortOrder" usando linQ ou outro métod

Depois da classificação, o outerxml deve ficar basicamente assim:

<Policy>
    <Covers>
        <MyCover1/>
        <MyCover2/>
        <MyCover3/>
    </Covers>
</Policy>

ATUALIZA

Eu fiz alguns progressos, os dados agora estão classificados, mas como atualizo o XmlDocument original não classificado? Isto é o que eu tenho até agora:

private static void DoSort(XmlDocument policyDocument)
{
    foreach(XmlNode coverGroup in policyDocument.SelectNodes("//CoverGroup"))
    {
        XDocument test = XDocument.Parse(coverGroup.OuterXml);
        var sorted = from xe in test.Element("CoverGroup").Elements()
             let so = xe.Element("properties").Element("displayOrder")
             let num = (int)so
             orderby num
             select xe;     

        var result = new XElement("CoverGroup", sorted);
    }
}

Preciso aplicar as alterações novamente em "policyDocument". Nota: Uma capa pode ter um CoverGroup próprio, que pode novamente ter Covers com CoverGroups próprios. Isso diminui pelo menos 4 níveis: ie

<Policy>
<Covers>
    <MyCover1>
        <properties>
            <sortOrder></sortOrder>
        </properties>
        <CoverGroup>
            <MyCover1Child>
                <properties>
                    <sortOrder></sortOrder>
                </properties>
            </MyCover1Child>
        </CoverGroup>
    </MyCover1>
    ...
</Covers>

O XPATH e o foreach acima dos cateteres para a estrutura acima, então eu estava pensando em substituir o XmlNode coverGroup no primeiro foreach pela nova lista classificada, mas não sei como reconstruir um novo XmlNode. Se pudermos descobrir isso, podemos simplesmente fazer o seguinte:

policyDocument.ReplaceChild(coverGroup, mySortedXmlNode)

questionAnswers(3)

yourAnswerToTheQuestion