Sortierung von Sequenzen

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 2.)

Die Instruktion xsl:sort kann überall dort eingesetzt werden, wo Sequenzen erzeugt werden. Vornehmlich ist dies die Instruktion xsl:apply-templates. Anwendbar ist xsl:sort aber auch zusammen mit den Schleifen-Instruktionen xsl:for-each und xsl:for-each-group, die im übernächsten Abschnitt beschrieben werden.

Beispielsweise kann die bereits viel strapazierte Buchliste auf einfache Weise sortiert werden, indem xsl:sort in die Zusammenstellung der Buch-Elemente-­Sequenz eingebracht wird:

<xsl:template match="buchhandel">
  <xsl:apply-templates select="buch">
    <xsl:sort/>
  </xsl:apply-templates>
</xsl:template>

Das Ergebnis ist eine Sortierung, die sich scheinbar nach dem Buchtitel richtet:

Aale im Streiflicht von Braun, Bert;
Verlag: Ozean Verlag; Preis: 14.00 Euro
(ISBN: 3-890-77608-5)

Another Dog's Guide von Murr, Kater;
Verlag: Miau Publishing; Preis: 23.95 Dollar
(ISBN liegt nicht vor.)

Another Hitchhiker's Guide to the Galaxy von Adams, Douglas;
Verlag: Spacetrotter Publishing; Preis: 15.00 Dollar
(ISBN: 3-899-77617-4)

Bergwandern in den Alpen von Assmann, Peter;
Verlag: Berg Verlag; Preis: 14.00 Euro
(ISBN: 3-899-77611-7)

Dies ist soweit brauchbar, nur wird in Wirklichkeit nicht nach dem Buchtitel (der das erste Element in <buch> in Dokumentreihenfolge darstellt), sondern nach dem gesamten Stringwert des Elements sortiert.

Interessanter ist es, gezielt nach einem Sortierkriterium zu sortieren. Die Liste soll nach Preis geordnet werden. Um dies anzuordnen, muss das select-Attri­but von xsl:sort bemüht werden:

<xsl:template match="buchhandel">
  <xsl:apply-templates select="buch">
    <xsl:sort select="preis"/>
  </xsl:apply-templates>
</xsl:template>

Hierbei ist zu beachten, dass die Sortiervorschrift für das Sortierkriterium bereits von der zusammengestellten Sequenz ausgeht. Aus diesem Grunde muss, um nach dem Preis, der in einem Kindelement von <buch> steht, nur select="preis" geschrieben werden, nicht aber – wie man hier fälschlich aus dem aktuellen Kno­ten der Template-Regel schließen könnte – select="buch/preis". Letzteres führt zu keinem Ergebnis. So erhalten wir:

Siddhartha von Hesse, Hermann;
Verlag: Suhrkamp; Preis: 11.80 Euro
(ISBN: 3-518-36682-3)

Wenn der Berg ruft von Ass­mann, Peter;
Verlag: Berg Verlag; Preis: 12.00 Euro
(ISBN: 3-899-776129-7)

Dies sieht korrekt aus, ist es aber nicht: Weiter unten, genauer gesagt am Ende der Liste, findet sich ein Buch zu 7.50 Euro. Wie kommt das? Die Lösung ist einfach: Auch hier wurde nach Stringwert sortiert. Dies ist Default-Verhalten von xsl:sort. Soll eine numerische Sortierung erfolgen, so muss dies ange­sagt werden.

Hierzu gibt es ein weiteres Attribut data-type, das den Wert "number" erhal­ten muss. Im gleichen Aufwasch kann auch die Sortier-Richtung mittels order="descending" umgekehrt werden:

<xsl:template match="buchhandel">
  <xsl:apply-templates select="buch">
    <xsl:sort select="preis" data-type="number" order="descending"/>
  </xsl:apply-templates>
</xsl:template>

Die Bücher werden jetzt in absteigender Richtung nach Preis sortiert. Das Buch zu 7.50 Euro landet wieder am Ende der Liste, nur hat das diesmal seine Rich­tigkeit:

Java für Anfänger von Tiger, Theobald;
Verlag: Java Verlag; Preis: 45.00 Euro
(ISBN: 3-899-77618-4)

Java für Praktiker von Jobst, Julius;
Verlag: EDV Verlag; Preis: 42.95 Euro
(ISBN-Nummer liegt nicht vor.)

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn