Sortowanie XSLT - jak sortować węzły potomne xml wewnątrz węzła nadrzędnego z atrybutem

To, co zaczęło się jako prosta rzecz, okazało się dość kłopotliwe dla XSLT noob.

Próbuję posortować childnodes / descending, ale po dodaniu atrybutu do węzła nadrzędnego otrzymuję błąd podczas debugowania w VS2010:

"Attribute and namespace nodes cannot be added to the parent element after a text, comment, pi, or sub-element node has already been added."

Załóżmy, że mam ten prosty XML:

<posts>
    <year value="2013">
        <post postid="10030" postmonth="1">
            <othernode></othernode>
            <othernode2></othernode2>
        </post>
        <post postid="10040" postmonth="2">
            <othernode></othernode>
            <othernode2></othernode2>
        </post>
        <post postid="10050" postmonth="3">
             <othernode></othernode>
             <othernode2></othernode2>
        </post>
    </year>
    <year value="2012">
        <post postid="10010" postmonth="1">
            <othernode></othernode>
            <othernode2></othernode2>
        </post>
        <post postid="10015" postmonth="2">
            <othernode></othernode>
            <othernode2></othernode2>
        </post>
        <post postid="10020" postmonth="3">
             <othernode></othernode>
             <othernode2></othernode2>
        </post>
    </year>
</posts>

Przekazuję XPATH do xmldatasource, aby pobrać odpowiednie<year> węzeł, np. 2013. Potem muszę posortować swoje dziecko<post> węzły malejące za pomocą postid, więc<year value=2013>, postid = 10050 pojawiłby się jako pierwszy po renderowaniu.

Żeby było jasne: interesuje mnie tylko sortowanie w jednym<year> węzeł.

Zanim podzielę węzły na osobne węzły (tj. Xml był / posts / post) działało następujące XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()">
                <xsl:sort select="@postid" data-type="text" order="descending"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Teraz xmldatasource jest pusty podczas uruchamiania z powodu powyższego błędu. Jeśli przejdę rosnąco do zamówienia, oczywiście zwracany jest ten sam plik xml (bez transformacji)

Pytanie: jak zaktualizować powyższy XSLT (lub nowy), aby uwzględnić atrybut węzła nadrzędnego (<year value="">)? Dzięki badaniom odpowiedź mówi: „Muszę dodać tworzenie atrybutów przed utworzeniem elementu”. Ma to sens, ponieważ oglądanie debuggera powoduje utworzenie potomków w kolejności desc, ale znacznik roku nie zawiera jego atrybutu. Ale nie mam pojęcia o XSLT. Nie widzę tego jako zbyt skomplikowanego, ale po prostu nie znam języka.

Każda pomoc, bardzo mile widziana. Dzięki

questionAnswers(2)

yourAnswerToTheQuestion