XSLT-Sortierung - zum Sortieren von xml-childnodes innerhalb einer übergeordneten Knoten mit einem Attribut
Was begann als eine einfache Sache wurde ziemlich unangenehm für XSLT-noob.
Versucht zu Sortieren childnodes - /absteigen, aber nach dem hinzufügen eines Attributs zu Ihren übergeordneten Knoten, ich erhalte eine Fehlermeldung beim Debuggen in 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."
Nehme an, dass ich mit diesem einfachen 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 gebe einen XPATH-Ausdruck zu einer xmldatasource zum abrufen der relevanten <year>
Knoten, z.B. 2013.
Dann muss ich Sortieren, Ihr Kind <post>
Knoten absteigend mit postid, also für <year value=2013>
, postid=10050 würde zeigen, bis erste gerendert.
So, um klar zu sein: ich bin nur daran interessiert, die Sortierung innerhalb einer <year>
Knoten.
Bevor ich aufteilen der Knoten in einem separaten Knoten (d.h. xml /posts/post) durch das folgende XSLT gearbeitet:
<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>
Nun die xmldatasource ist leer, wenn es läuft wegen dem oben genannten Fehler. Wenn ich den pass aufsteigend in der Reihenfolge der gleichen xml zurückgegeben offensichtlich (keine transformation)
Frage: wie zum aktualisieren der XSLT-oben (oder neuer), um Platz für den übergeordneten Knoten-Attribut (<year value="">
)? Durch Forschung einer Antwort sagte: "ich muss Hinzugefügt Attribut Schöpfung vor der Erstellung des Elements". Dies ist sinnvoll, da gerade die debugger, die childnodes gebildet, desc Ordnung, aber das Jahr-tag fehlt seinem Attribut. Aber ich habe nicht wirklich eine Ahnung über XSLT. Kann nicht sehen, dass es zu kompliziert, aber einfach nicht wissen, die Sprache.
Jede Hilfe, sehr dankbar. Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
So werden Sie sagen, dass Sie nur am Rande Teil Ihrer XML-Dokument (eine
<year>
Knoten) an den XSLT-Prozessor?Sollte man eine eigene Vorlage für Jahr, so dass das ist die einzige Vorlage, die verwendet Sortieren. Wie ist die folgende:
Ich denke, die oben ist ein besserer Ansatz, aber ich denke, dass die Ursache deiner Fehler ist, dass es die Verbindung der Attribute mit den Elementen, wenn es die Sortierung. Ihre original-XSLT-wahrscheinlich würde laufen ohne Fehler, wenn Sie einfach Tat dies:
data-type="text"
in diesem Fall? dies erzeugt falsche Ergebnisse, wennpostid
Werte können unterschiedliche Längen haben.data-type="numeric"
vorzuziehen wäre.data-type="number"
data-type="number"
(ich weiß, ich versehendlich "numeric" in meinem Kommentar). Da kann ich nicht sagen, mit völliger Gewissheit, dass Jim die IDs werden immer numerisch, lasse ich meine Antwort, wie es denn nun bis zur Klärung von ihm.Diese transformation:
, wenn angewandt auf das XML-Dokument:
erzeugt die gewünschte, richtige Ergebnis:
post
mit*
könnte effizienter sein, als dies vermeidet eine überprüfung durch den XSLT-Prozessor, ob ein Kind einepost
oder nicht. Auch der code ist kürzer dieser Weg, und das schreiben ist schneller und einfacher.