xsl:sort

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

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

 

Die Sub-Instruktion xsl:sort dient zur Deklaration eines Sortierschlüssels, der auf eine Sequenz (einen Nodeset) wirkt, wie sie durch xsl:for-each oder xsl:apply-templates zusammengestellt wird.

Klassifizierung Sub-Instruktion
Funktionsgruppe Sortierung von Sequenzen
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

xsl:sort tritt in Form einer Sub-Instruktion als erstes Child-Element in xsl:for-each oder xsl:apply-templates auf. Mehrere xsl:sort-Instruktionen können dabei aufeinander folgen. Ab XSLT 2.0 kann xsl:sort auch innerhalb der dort neu eingeführten Instruktionen xsl:for-each-group und xsl:perform-sort eingesetzt werden – in beiden Fällen ebenfalls als erstes Child-Element.

Ab XSLT 2.0 darf xsl:sort einen Sequenzkonstruktor enthalten, der alternativ zum select-Attribut des Elements zur Bestimmung des Sortierkriteriums dient. In XSLT 1.0 ist xsl:sort stets leer.

Attribute:

Es gelten die Standardattribute. Dazu besitzt xsl:sort eine Reihe von optionalen Attributen, mit denen die Sortierkriterien festgelegt werden. In XSLT 1.0 sind dies select, order, data-type, case-order und lang. In XSLT 2.0 kommen die optional zu setzenden Attribute collation und stable hinzu.

Abgesehen vom select-Attribut sind alle Attributwerte durch Attributwert-Templates darstellbar. Die AVTs werden in Bezug auf das Kontextitem mit den gleichen Fokus ausgewertet, der für die Auswertung des XPath-Ausdrucks des select-Attributs der umgebenden Instruktion (also xsl:apply-templates, xsl:for-each, xsl:for-each-group) gilt.

case-order

Wert

{"upper-first" | "lower-first"} (auch als AVT)

Verwendung

optional

Einführung

XSLT 1.0

Das case-order-Attribut legt explizit fest, ob bei der alphabetischen Sortierung data-type="text" Großbuchstaben vor Kleinbuchstaben eingeordnet werden oder umgekehrt. Das Attribut kann nur verwendet werden, wenn kein collation-Attribut vorliegt. Default ist upper-first, d.h. Großbuchstaben werden bei Abwesenheit des Attributs automatisch vor Kleinbuchstaben sortiert. Der zu verwendende Wert kann zur Laufzeit über ein Attributwert-Template bestimmt werden.

collation

Wert

{uri-string} (auch als AVT)

Verwendung

optional

Einführung

XSLT 2.0

Das collation-Attribut lädt bei Bedarf eine Datei, die Regeln für Stringvergleiche, für die alphabetische Reihenfolge der Zeichen etc. festlegt.

Ist ein collation-Attribut vorhanden, so werden das lang- und das case-order-Attribut ignoriert. Der als URI-String zu verwendende Wert kann zur Laufzeit über ein Attributwert-Template bestimmt werden.

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

data-type

Wert

{"number" | "text"| qname-but-not-ncname} (auch als AVT)

Verwendung

optional

Einführung

XSLT 1.0

Das data-type-Attribut bestimmt die Behandlung des jeweiligen Sortierstrings, der sich aus der Anwendung des Ausdrucks im select-Attribut für einen der zu sortierenden Knoten ergibt. Defaultwert ist "text". Der Wert des Attributs kann zur Laufzeit mittels eines Attributwert-Templates bestimmt werden.

data-type="text"
Für data-type="text" werden die Strings alphabetisch sortiert. Ob Groß- vor Kleinbuchstaben stehen, ist abhängig von der Sprachumgebung der Applikation, kann aber durch das case-order-Attribut explizit bestimmt werden. In gleicher Weise ist es möglich, über das lang-Attribut die gewünschte Sprache festzulegen, falls diese nicht der Verarbeitungsumgebung entnommen werden kann oder soll.

data-type="number"
Der Wert data-type="number" bewirkt eine Umwandlung der Strings in eine Zahl, mit nachfolgender numerischer Sortierung. Es ist abhängig vom jeweiligen Prozessor, wie dabei mit solchen Knoten verfahren wird, deren Sortierwert nach dieser Umwandlung NaN ergibt.

data-type="qname-but-not-ncname"
Diese Möglichkeit erlaubt unter XSLT 1.0 die Sortierung gemäß einem userdefinierten Datentyp. Dieser muss mit einem QName mit Namensraumpräfix benannt sein (also kein NCName), wobei der Namensraum nicht leer sein darf. Das Verhalten ist applikationsabhängig und nicht klar geregelt.

lang

Wert

{nmtoken} (auch als AVT)

Verwendung

optional

Einführung

XSLT 1.0

Mit Hilfe des lang-Attributs kann der Language-Code der Sprache vorgegeben werden, in der die zu sortierenden Inhalte geschrieben sind. Die Reihenfolge der Sortierung hängt von der Art des in dieser Sprache üblichen Alphabets und den in diesem Zusammenhang verwendeten Ziffern ab.

Ist kein collation-Attribut vorhanden, das explizit eine Regel für Stringvergleiche (collation) vorgibt, so wird das lang-Attribut von der Anwendung als Basis für die Auswahl einer passenden Regel genutzt.

Die Sprache wird (nach RFC 1766) durch einen aus zwei Buchstaben bestehenden Ländercode gemäß ISO 639 repräsentiert. Alternativ kann ein Code gemäß der »Internet Assigned Numbers Authority« (IANA) gewählt werden. Dies entspricht der Vorgabe für das Standardattribut xml:lang.

Die Sprachauswahl kann zur Laufzeit über ein Attributwert-Template vorgenommen werden. Ist kein lang-Attribut angegeben, so wird der Sortierung defaultmäßig die Sprache des Betriebssystems zugrunde gelegt.

order

Wert

{"ascending" | "descending"} (auch als AVT)

Verwendung

optional

Einführung

XSLT 1.0

Das order-Attribut bestimmt, ob die Sortierung in aufsteigender, also vom niedrigen zum höheren Wert, oder in absteigender Richtung erfolgt. Der Defaultwert bei Abwesenheit des Attributs ist "ascending", also aufsteigende Reihenfolge. Der zu verwendende Wert kann zur Laufzeit über ein Attributwert-Template bestimmt werden.

Bei numerischer Sortierung ergibt sich die Reihenfolge entsprechend der gewählten Richtung unmittelbar aus dem numerischen Wert, wobei allerdings die Einordnung von auftretenden NaN-Werten nicht klar geregelt ist.

Bei alphabetischer Sortierung wird nach dem Zeichenwert des ersten Zeichens, dann nach dem des zweiten Zeichens und so fort sortiert. Es ist sprachabhängig, ob hierbei Großbuchstaben vor Kleinbuchstaben eingeordnet werden. Dies kann aber über das case-order-Attribut zusätzlich festgelegt werden.

select

Wert

xpath-expression

Verwendung

Optional

Einführung

XSLT 1.0

Das select-Attribut enthält einen XPath-Ausdruck, dessen Auswertung den Sortierschlüssel bestimmt, auf dem die nachfolgende Sortierung beruhen soll. Ergebnis der Auswertung ist pro untersuchtem Knoten ein String xs:string, der als Schlüsselwert verwendet wird. Der XPath-Ausdruck kann ohne weiteres auch Referenzen auf Variablen bzw. Parameter enthalten, die an dieser Stelle im Gültigkeitsbereich sind.

Der Defaultwert für den Sortierschlüssel, bei Weglassen des select-Attributs, ist der Zeichenkettenwert des aktuellen Knotens, was select="fn:string(.)" entspräche. Dies tritt in Kraft, wenn weder ein select-Attribut noch ein Sequenzkonstruktor im Inneren von xsl:sort vorhanden ist.

Hinweis: Die Art der Sortierung (auf-/absteigend, alphabetisch/numerisch) wird durch das order- bzw. data-type-Attribut bestimmt. Ist weder ein order- noch ein data-type-Attribut vorhanden, so werden die Knoten entsprechend ihrer Schlüsselstrings aufsteigend alphabetisch sortiert.

stable

Wert

{"yes" | "no"} (auch als AVT)

Verwendung

optional

Einführung

XSLT 2.0

Eine Sortieranweisung gilt stets als »stabil« im Sinne der Spezifikation. Mit dem stable-Attribut kann dies jedoch beim ersten xsl:sort-Element einer Sortieranweisung explizit bekräftigt werden (stable="yes" ist gleichzeitig Default), oder mit stable="no" explizit als »nicht stabil« ausgewiesen. In letzterem Fall kann die tatsächliche Sortierung abhängig von der Implementierung verschieden ausfallen.

Wird das Attribut bei mehreren xsl:sort einer Sortieranweisung oder nicht beim ersten davon verwendet, so ist dies ein statischer Fehler (ERR XTSE1017).

Hinweis: Das Attribut existiert nicht in XSLT 1.0.

Verwendungszweck:

Die Anweisung xsl:sort wirkt auf die Elemente einer Eingabesequenz (initial sequence) und sortiert diese entsprechend ihres Sortierkriteriums.

Das Sortierkriterium wird anhand des select-Attributs der Instruktion bestimmt oder alternativ mittels eines in der Instruktion enthaltenen Sequenz­konstruktors. Besitzt ein xsl:sort-Element gleichzeitig ein select-Attribut und einen Sequenzkonstruktor, so ist dies ein statischer Fehler (ERR XTSE1015).

Ein oder mehrere aufeinander folgende Anweisungen xsl:sort ergeben die Gesamtsortierung (sorted sequence). Die erste dieser Anweisungen bestimmt den primären Sortierschlüssel (primary sort key definition). Sie darf in dieser Eigenschaft auch das stable-Attribut tragen. Die zweite Anweisungen bestimmt den sekundären Sortierschlüssel und so fort.

Jede folgende Sortierung wirkt auf diejenigen Ele­mente, die bei der vorangegangenen Sortierung den gleichen Sortierwert besa­ßen und deshalb in der Eingabereihenfolge verblieben sind. Eine Folge von xsl:sort-Definitionen wird in ihrer Gesamtheit als Sortieranweisung (sort specification) bezeichnet.

Ist für einen der Sortierschlüssel xsl:sort kein select-Attribut angegeben und besitzt diese (für XSLT 2.0) auch keinen Sequenzkonstruktor, so wird die Sortierung für diesen anhand der unmittelbaren Stringwerte der zu sortieren­den Items vorgenommen.

In XSLT 1.0 sind die zu sortierenden Items stets Knoten eines Nodesets. In die­sem Fall werden die Stringwerte der einzelnen Knoten als Sortierkriterium her­angezogen.

In XSLT 2.0 muss es sich bei den Items der Eingabesequenz nicht allein um Knoten, sondern um eine Mischung aus beliebigen Werten handeln. Liegt kein select-Attribut vor, so erfolgt die Sortierung anhand des atomaren Wertes des Items oder, falls es ein Knoten ist, anhand seines Datentyps.

Der Verarbeitungskontext während der Sortierung liegt auf dem gerade betrachteten Item der zu sortierenden Folge, dieses bildet also das Kontext­­item (in XSLT 1.0 stets Kontext-Node).

Als Kontextposition wird die Stellung des betrachteten Items in der unsor­tierten Folge (initial sequence) bezeichnet.

Die Kontextgröße (context size) entspricht der Anzahl der zu sortierenden Werte, in XSLT 1.0 also die Knotenzahl des Nodesets, in XSLT 2.0 die Zahl der Items in der Sequenz.

Kategorien von zu sortierenden Werten:
Grundsätzlich erfolgt bei jedem Sortierdurchgang eine Einteilung der zu sortierenden Werte in drei Kategorien: leere Werte (empty values), Ausnahmewerte (exception values) und gewöhnliche Werte (ordinary values).

  • Gewöhnliche Werte (ordinary values):
    Gewöhnliche Werte können anhand des Sortierschlüssels problemlos sortiert werden. Ihr Sortierwert liegt entweder bereits im geforderten Datentyp vor oder konnte erfolgreich in diesen Typ konvertiert werden. Gewöhnliche Werte werden untereinan­der sortiert und insgesamt vor allen Ausnahmewerten und leeren Werten in der sortierten Folge eingeordnet.
  • Ausnahmewerte (exception values):
    Als Ausnahmewerte werden diejeni­gen zu sortierenden Werte bezeichnet, für die ein Konvertierung in den geforderten Datentyp fehlschlägt. Hierzu zählen auch alle Zahlentypen mit Wert NaN. Alle Ausnahmewerte gelten als untereinander gleich, werden in sich also nicht sortiert, gelten aber als »kleiner« als jeder der gewöhnlichen Werte. Sie werden insgesamt in der sortierten Folge nach den gewöhnlichen und vor den leeren Werten eingeordnet.
  • Leere Werte (empty values):
    Leere Werte sind diejenigen, für die das zugrunde gelegte Sortierkriterium eine leere Sequenz (bzw. einen leeren Nodeset, leeren String etc.) ergibt. Auch alle leeren Werte gelten als unter­einander gleich, werden also ebenfalls nicht sortiert. Sie gelten als »kleiner« als die Ausnahmewerte, werden also am Ende der sortierten Gesamtfolge nach den gewöhnlichen Werten und den Ausnahmewerten einsortiert.

Verwendung in xsl:apply-templates:
Innerhalb von xsl:apply-templates sind nur die Instruktionen xsl:with-param und xsl:sort zugelassen. Die Reihenfolge, in der die Instruktionen auftreten dürfen, ist nicht weiter festge­legt und spielt in funktionaler Hinsicht auch keine Rolle (sieht man ab von der Reihenfolge der xsl:sort untereinander, die ihren Rang bei der Sortierung betrifft). Aus Gründen der Übersichtlichkeit sollte man sie jedoch möglichst gruppieren.

Verwendung in xsl:for-each und xsl:for-each-group:
Sowohl in xsl:for-each als auch in xsl:for-each-group (XSLT 2.0) müssen alle auftretenden xsl:sort-Instruktionen vor allen anderen Inhalten des Templateblocks ste­hen, also sowohl vor XSLT-Instruktionen als auch vor Literal Result Elements oder Text. Die Reihenfolge der xsl:sort-Instruktionen untereinander legt die Rangordnung ihrer Sortierkriterien fest.

Verwendung in xsl:perform-sort (XSLT 2.0):
In xsl:perform-sort ist eine Abfolge von xsl:sort-Instruktionen als erste Child-Elemente zugelassen. Ihre Reihenfolge bestimmt den jeweiligen Rang ihrer Sortierkriterien. In ihrer Gesamtheit bilden sie eine Sortieranweisung (sort specification), die mittels des select-Attributs der Instruktion oder alternativ über einen in ihr enthaltenen Sequenzenkonstruktor bestimmt wird. Die Instruktion gibt die sortierte Sequenz zurück.

Beispiele:

Beispiel 1 – Kopieren eines sortierten Nodesets:

Quelldokument:

<beispiele thema="xsl:sort">
  <beispiel nr="4">Beispiel 4</beispiel>
  <beispiel nr="12">Bespiel 12</beispiel>
  <beispiel nr="1">Beispiel 1</beispiel>
  <beispiel nr="2">Beispiel 2</beispiel>
  ...
</beispiele>

Stylesheet (Ausschnitt):

...
<xsl:for-each select="//beispiel"> 
  <xsl:sort select="@nr" data-type="number"/>
  <xsl:copy-of select="."/> 
</xsl:for-each>
...

Dieser Anweisungsblock stellt einen Nodeset aus den <beispiel>-Elementen eines Dokuments zusammen und sortiert diese numerisch anhand des Wertes ihres nr-Attributs. Wird das data-type-Attribut nicht auf "number" gesetzt, so würde die defaultmäßig alphabetische Sortierung »Beispiel 12« zwischen »Bei­spiel 1« und »Beispiel 4« einordnen. Die Anweisung xsl:copy-of kopiert jeweils den aktuellen Knoten in Reihenfolge der Sortierung ins Ergebnisdoku­ment.

Beispiel 2 – Sortierung in alphabetischer Reihenfolge:

Quelldokument (Ausschnitt):

<buchliste>
  <buch>
    <autor>
      <vorname>Hermann</vorname>
      <nachname>Hesse</nachname>
    </autor>
    <titel>Glasperlenspiel, Das</titel>
  </buch>
  ...
</buchliste>

Stylesheet (Ausschnitt):

...
<xsl:template match="buchliste">
  <h3>Titelliste aller Bücher</h3>
  <ol>
    <xsl:for-each select="buch">
      <xsl:sort select="titel" data-type="text"/>
      <li><xsl:value-of select="titel" /></li>
    </xsl:for-each>
  </ol>
</xsl:template>
...

Die Büchertitel werden alphabetisch sortiert als HTML-Liste ausgegeben. Hier ist explizit Sortierung als Text angegeben.

Beispiel 3 – Sortierung mit zwei kaskadierten Kriterien:

Quelldokument: siehe Beispiel 2

Stylesheet (Ausschnitt):

...
<xsl:for-each select="//buch">
  <xsl:sort select="autor/nachname"/>
  <xsl:sort select="autor/vorname"/>
  <xsl:copy-of select="."/>
</xsl:for-each>
...

Die zusammengestellte Liste der Bücher wird zunächst nach den Nachnamen der Autoren sortiert und anschließend – für identische Nachnamen – nach den Vornamen.

Beispiel 4 – Umkehrung der Reihenfolge eines Nodesets

...
<xsl:apply-templates>
  <xsl:sort select="position()" data-type="number" order="descending"/>
</xsl:apply-templates>
...

Der Sortierschlüssel ist die Position in der Eingabesequenz, die als Zahl von der Funktion position() im select-Attribut zurückgegeben wird. Es wird nume­risch (data-type="number") und absteigend (order="descending") sortiert, d.h., die Knoten mit niedrigerem Positionswert werden nach hinten ans Ende der Sequenz sortiert.

Beispiel 5 – Sortierung nach berechnetem Wert:

Quelldokument:

<buchliste>
  <buch preis="39.50">
    <autor>Hesse, Hermann</autor>
    <titel>Glasperlenspiel, Das</titel>
    <!-- Bestellungen pro Monat -->
    <bestellung monat="04">13750</bestellung>
    <bestellung monat="05">12000</bestellung>
    ...
  </buch>
  ...
</buchliste>

Stylesheet (Ausschnitt):

...
<xsl:for-each select="//buch">
  <xsl:sort select="@preis * bestellung[@monat='05']" data-type="number"/>
  <li><xsl:value-of select="titel"/></li>
  ...
</xsl:for-each>
...
  

Die Bücher werden nach Umsatz pro Monat sortiert, wober hier nur der Wert des fünften Monats berücksichtigt werden soll. Hierfür wird das Sortierkrite­rium einfach als das Produkt aus Preis und Verkäufen des Monats definiert. Die Buchtitel mit dem höchsten Umsatz in diesem Monat erscheinen am Anfang der Liste.

Beispiel 6 – Sortieren mit Parametervorgabe (Version 1):

Quelldokument:

<buchliste>
  <buch>
    <autor>Hesse, Hermann</autor>
    <titel>Glasperlenspiel, Das</titel>
    <verlag>Suhrkamp </verlag>
    <seiten>616</seiten>
  </buch>
  ...
</buchliste>

Stylesheet (Auszug):

<xsl:param name="sortieren" select="'autor'"/>
...
<xsl:for-each select="//buch">
  <xsl:sort select="*[name() = $sortieren]"/>
  <xsl:copy-of select="."/>
</xsl:for-each>
...

Die Buchliste kann je nach übergebenem Parameterwert wahlweise nach jedem Child-Element von <buch> sortiert werden. Wird ein Wert übergeben, der kei­nem Elementnamen entspricht, so erfolgt keine Sortierung.

Beispiel 7 – Sortierung nach Parametervorgabe (Version 2):

Quelldokument:

<medien>
  <media typ="cd">
    <kuenstler>Springsteen, Bruce</kuenstler>
    <titel>Darkness On The Edge Of Town</titel>
  </media>
  <media typ="buch">
    <autor>Hesse, Hermann</autor>
    <titel>Steppenwolf, Der</titel>
  </media>
  <media typ="cd">
    <kuenstler>Smith, Patti</kuenstler>
    <titel>Easter</titel>
  </media>
  <media typ="buch">
    <autor>Smith, Patti</autor>
    <titel>Babel</titel>
  </media>
  <media typ="buch">
    <autor>Hesse, Hermann</autor>
    <titel>Glasperlenspiel, Das</titel>
  </media>
  <media typ="cd">
    <kuenstler>Beatles</kuenstler>
    <titel>A Hard Day's Night</titel>
  </media>
  <!-- mehr Bücher und CDs -->
</medien>

Das XML-Dokument soll kopiert und die Medienliste dabei wahlweise entwe­der nach »Autor/Künstler und Titel« (Default) oder nach »Medientyp und Titel« sortiert werden. Für alle anderen bei der Transformation von außen übergebe­nen Parameterwerte soll nur nach Titel sortiert werden.

Stylesheet:

<xsl:stylesheet version="2.0" encoding="ISO-8859-1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output encoding="ISO-8859-1"/>
  <!-- globaler Parameter mit Defaultwert -->
  <xsl:param name="sortierung" select="'von'"/>
  <xsl:template match="/">
    <medienliste>
      <!-- Ausgabe des gewählten Sortierkriteriums -->
      <xsl:choose>
        <xsl:when test="$sortierung='von'">
          <message>Sortierung nach Autor/Künstler</message>
        </xsl:when>
        <xsl:when test="$sortierung='typ'">
          <message>Sortierung nach Medientyp</message>
        </xsl:when>
        <xsl:otherwise>
          <message>Sortierung nach Titel</message>
        </xsl:otherwise>
      </xsl:choose>
      <!-- Sortierung und Ausgabe -->
      <xsl:for-each select="//media">
        <xsl:sort select="*[1][$sortierung='von'] | @typ[$sortsortierung='typ'] | titel[$sortierung!='von' and $sortierung!='typ']"/>
        <xsl:sort select="titel"/>
        <xsl:copy-of select="."/>
      </xsl:for-each>
    </medienliste>
  </xsl:template>
 </xsl:stylesheet>
  

Der Defaultwert des Parameters $sortieren ist 'von'. Der mit xsl:for-each zusammengestellte Nodeset wird also defaultmäßig nach Autor/Künstler und nachfolgend nach Titel sortiert.

Das primäre Sortierkriterium ergibt sich aus dem select-Attribut des ersten xsl:sort. Es werden drei alternative, durch inklusives Oder verknüpfte XPath-Pattern verwendet. Die Kandidatenknoten für das Sortierkriterium werden jeweils durch ein Predicate gefiltert, das den Wert des Parameters beinhaltet:

select="*[1][$sortierung='von'] | @typ[$sortsortierung='typ'] | titel[$sortierung!='von' and $sortierung!='typ']"
  
  • Der erste Ausdruck
    *[1][$sortierung='von']
    wird verwendet, wenn der Wert 'von' oder kein Wert übergeben wird. In diesem Fall ist das Predicate true und es wird nach dem Inhalt des ersten Kindknotens des Kontextknotens sortiert, entweder nach einem <autor> oder einem <kuenstler>-Element. Hat der Parameter einen anderen Wert, so ist das Predicate false und das Pattern wird nicht berücksichtigt.
  • Der zweite Ausdruck
    @typ[$sortsortierung='typ']
    wird ver­wendet, wenn der Wert 'typ' übergeben wurde, und nennt das Attribut @typ als Sortierkriterium. Für andere Parameterwerte ist auch hier das Predi­cate false und das Pattern bleibt unberücksichtigt.
  • Der dritte Ausdruck
    titel[$sortierung!='von' and $sortierung!='typ']
    kann weg­gelassen werden, wenn ausgeschlossen werden kann, dass andere Werte als die beiden vorgesehenen übergeben werden können. Ist dies nicht der Fall, so wird dieser Ausdruck verwendet, um gegebenenfalls das Sortierkri­terium auf das Child-Element <titel> zu legen.

Ist das Gesamtergebnis des Ausdrucks des select-Attributs false (also jeder der Teilausdrücke), so wird die Liste gemäß der Vorgehensweise für »leere Werte« sortiert (siehe oben), sie verbleibt also in Dokumentreihenfolge. Eine nachfolgende Sortierung durch weitere, folgende xsl:sort-Instruktionen ist dennoch nicht mehr möglich, da alle Werte bereits als »sortiert« gelten. Die zweite xsl:sort-Instruktion, die nach Titel sortiert, wäre wirkungslos. Dieser Fall wird hier mit dem dritten Teilausdruck abgefangen, dessen Predicate stets true bleibt.

Das Ergebnis ohne Wertübergabe:

<?xml version="1.0" encoding="ISO-8859-1"?>
<medienliste>
  <message>Sortierung nach Autor/Künstler</message>
  <media typ="cd">
    <kuenstler>Beatles</kuenstler>
    <titel>A Hard Day's Night</titel>
  </media>
  <media typ="buch">
    <autor>Hesse, Hermann</autor>
    <titel>Glasperlenspiel, Das</titel>
  </media>
  <media typ="buch">
    <autor>Hesse, Hermann</autor>
    <titel>Steppenwolf, Der</titel>
  </media>
  <media typ="buch">
    <autor>Smith, Patti</autor>
    <titel>Babel</titel>
  </media>
  <media typ="cd">
    <kuenstler>Smith, Patti</kuenstler>
    <titel>Easter</titel>
  </media>
  <media typ="cd">
    <kuenstler>Springsteen, Bruce</kuenstler>
    <titel>Darkness On The Edge Of Town</titel>
  </media>
</medienliste>

Wird kein Wert übergeben, so werden die Medien nach dem Urheber geord­net und anschließend im zweiten Schritt nach Titel.

Das Ergebnis mit Übergabe des Parameters 'typ':

<?xml version="1.0" encoding="ISO-8859-1"?>
<medienliste>
  <message>Sortierung nach Medientyp</message>
  <media typ="buch">
    <autor>Smith, Patti</autor>
    <titel>Babel</titel>
  </media>
  <media typ="buch">
    <autor>Hesse, Hermann</autor>
    <titel>Glasperlenspiel, Das</titel>
  </media>
  <media typ="buch">
    <autor>Hesse, Hermann</autor>
    <titel>Steppenwolf, Der</titel>
  </media>
  <media typ="cd">
    <kuenstler>Beatles</kuenstler>
    <titel>A Hard Day's Night</titel>
  </media>
  <media typ="cd">
    <kuenstler>Springsteen, Bruce</kuenstler>
    <titel>Darkness On The Edge Of Town</titel>
  </media>
  <media typ="cd">
    <kuenstler>Smith, Patti</kuenstler>
    <titel>Easter</titel>
  </media>
</medienliste>

Wird der Medientyp als Sortierkriterium übergeben, so wird alphabetisch nach Wert des typ-Attributs sortiert. Bücher kommen daher vor CDs. Anschließend wird nach Titel sortiert.

Das Ergebnis mit beliebigem anderen Parameterwert:

<?xml version="1.0" encoding="ISO-8859-1"?>
<medienliste>
  <message>Sortierung nach Titel</message>
  <media typ="cd">
    <kuenstler>Beatles</kuenstler>
    <titel>A Hard Day's Night</titel>
  </media>
  <media typ="buch">
    <autor>Smith, Patti</autor>
    <titel>Babel</titel>
  </media>
  <media typ="cd">
    <kuenstler>Springsteen, Bruce</kuenstler>
    <titel>Darkness On The Edge Of Town</titel>
  </media>
  <media typ="cd">
    <kuenstler>Smith, Patti</kuenstler>
    <titel>Easter</titel>
  </media>
  <media typ="buch">
    <autor>Hesse, Hermann</autor>
    <titel>Glasperlenspiel, Das</titel>
  </media>
  <media typ="buch">
    <autor>Hesse, Hermann</autor>
    <titel>Steppenwolf, Der</titel>
  </media>
</medienliste>

Die Übergabe eines beliebigen anderen Wertes schaltet bereits das erste Sor­tierkriterium auf Sortierung nach Titel um. Es spielt keine Rolle, dass die gleiche Sortierung im Anschluss ein zweites Mal angewendet wird.

Elementdefinition:

XSLT 1.0:

<!-- Category: sub-instruction -->
<xsl:sort 
     select = string-expression 
     lang = { nmtoken }
     order = { "ascending" | "descending" }
     case-order = { "upper-first" | "lower-first" }
     data-type = { "text" | "number" | qname-but-not-ncname }
/>

XSLT 2.0:

<!-- Category: sub-instruction -->
<xsl:sort
  select? = expression
  lang? = { nmtoken }
  order? = { "ascending" | "descending" }
  collation? = { uri }
  stable? = { "yes" | "no" }
  case-order? = { "upper-first" | "lower-first" }
  data-type? ={ "text" | "number" | qname-but-not-ncname } >

  <!-- Content: sequence-constructor -->
</xsl:sort>
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