XSLT-Sortierung - So sortieren Sie untergeordnete XML-Knoten in einem übergeordneten Knoten mit einem Attribut

Was als einfache Sache begann, hat sich für XSLT noob als ziemlich problematisch herausgestellt.

Beim Versuch, untergeordnete Knoten / absteigende Knoten zu sortieren, wird nach dem Hinzufügen eines Attributs zum übergeordneten Knoten beim Debuggen in VS2010 eine Fehlermeldung angezeigt:

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

Angenommen, ich habe dieses einfache 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>

Ich übergebe eine XPATH an eine xmldatasource, um die relevanten abzurufen<year> Knoten, z.B. 2013. Dann muss ich sein Kind sortieren<post> Knoten absteigend mit postid, also z<year value=2013>, postid = 10050 wird beim Rendern zuerst angezeigt.

Um es klar zu sagen: Ich bin nur daran interessiert, in einem zu sortieren<year> Knoten.

Bevor ich die Knoten in separate Knoten aufteilte (d. H. Xml war / posts / post), funktionierte das folgende 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>

Aufgrund des obigen Fehlers ist die xmldatasource jetzt leer, wenn sie ausgeführt wird. Wenn ich aufsteigend in die Reihenfolge übergebe, wird dieselbe XML offensichtlich zurückgegeben (keine Transformation)

Frage: Wie aktualisiere ich das obige (oder das neue) XSLT, um das übergeordnete Knotenattribut aufzunehmen?<year value="">)? Nachforschungen haben ergeben, dass vor der Elementerstellung die Attributerstellung hinzugefügt werden muss. Dies ist sinnvoll, wenn Sie den Debugger beobachten. Die untergeordneten Knoten werden in absteigender Reihenfolge gebildet, aber dem Jahr-Tag fehlt sein Attribut. Aber ich habe keine wirkliche Ahnung von XSLT. Kann nicht sehen, dass es zu kompliziert ist, aber kenne die Sprache einfach nicht.

Jede Hilfe, sehr geschätzt. Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage