Websiteentwicklung: XSLT: Sortieren
Wenn Sie XML-Daten mit Stylesheets aufbereiten wollen, möchten Sie sicherlich auch Daten nach bestimmten Kriterien sortieren. Zu Beginn also ein kleines Beispiel, bei dem eine Adressenliste sortiert werden soll.
Beispiel: Adressenliste
BearbeitenListing: adressen.xml
Bearbeiten <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="adressen.xsl"?>
<adressen>
<person vorname="Anna" nachname="Mueller" strasse="Blumenweg 42" plz="12345" ort="Musterhausen" />
<person vorname="Bert" nachname="Schmidt" strasse="Rosenstrasse 65" plz="12344" ort="Musterhausen" />
<person vorname="Christian" nachname="Klein" strasse="Veilchengasse 5" plz="12345" ort="Musterhausen" />
<person vorname="Denise" nachname="Neumann" strasse="Orchideenring 16" plz="12449" ort="Musterdorf" />
<person vorname="Emil" nachname="Mueller" strasse="Blumenweg 41" plz="12345" ort="Musterhausen" />
</adressen>
Mit dem nachfolgendem Stylesheet können Sie Ihre Adressenliste also nach den Nachnamen sortieren:
Listing: adressen.xsl
Bearbeiten<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/adressen">
<html><head><title>Adressenliste</title></head>
<body>
<table>
<tr>
<th>Vorname</th>
<th>Nachname</th>
<th>Strasse</th>
<th>Postleitzahl</th>
<th>Ort</th>
</tr>
<xsl:for-each select="person">
<xsl:sort select="@nachname" order="ascending" data-type="text" />
<tr>
<td><xsl:value-of select="@vorname" /></td>
<td><xsl:value-of select="@nachname" /></td>
<td><xsl:value-of select="@strasse" /></td>
<td><xsl:value-of select="@plz" /></td>
<td><xsl:value-of select="@ort" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Die Ausgabe des XSLT-Prozessors ist dann der folgende HTML-Code:
Listing: Ausgabe adressen.xml
Bearbeiten<html><head><title>Adressenliste</title></head>
<body>
<table>
<tr>
<th>Vorname</th>
<th>Nachname</th>
<th>Strasse</th>
<th>Postleitzahl</th>
<th>Ort</th>
</tr>
<tr>
<td>Christian</td>
<td>Klein</td>
<td>Veilchengasse 5</td>
<td>12345</td>
<td>Musterhausen</td>
</tr>
<tr>
<td>Anna</td>
<td>Mueller</td>
<td>Blumenweg 42</td>
<td>12345</td>
<td>Musterhausen</td>
</tr>
<tr>
<td>Emil</td>
<td>Mueller</td>
<td>Blumenweg 41</td>
<td>12345</td>
<td>Musterhausen</td>
</tr>
<tr>
<td>Denise</td>
<td>Neumann</td>
<td>Orchideenring 16</td>
<td>12449</td>
<td>Musterdorf</td>
</tr>
<tr>
<td>Bert</td>
<td>Schmidt</td>
<td>Rosenstrasse 65</td>
<td>12344</td>
<td>Musterhausen</td>
</tr>
</table>
</body>
</html>
In Tabellenform sieht das dann folgendermaßen aus:
HTML: Ausgabe adressen.xml
Bearbeiten <table>
<tr>
<th>Vorname</th>
<th>Nachname</th>
<th>Strasse</th>
<th>Postleitzahl</th>
<th>Ort</th>
</tr>
<tr>
<td>Christian</td>
<td>Klein</td>
<td>Veilchengasse 5</td>
<td>12345</td>
<td>Musterhausen</td>
</tr>
<tr>
<td>Anna</td>
<td>Mueller</td>
<td>Blumenweg 42</td>
<td>12345</td>
<td>Musterhausen</td>
</tr>
<tr>
<td>Emil</td>
<td>Mueller</td>
<td>Blumenweg 41</td>
<td>12345</td>
<td>Musterhausen</td>
</tr>
<tr>
<td>Denise</td>
<td>Neumann</td>
<td>Orchideenring 16</td>
<td>12449</td>
<td>Musterdorf</td>
</tr>
<tr>
<td>Bert</td>
<td>Schmidt</td>
<td>Rosenstrasse 65</td>
<td>12344</td>
<td>Musterhausen</td>
</tr>
</table>
Attribute zur Beeinflussung der Sortierung
BearbeitenIm Einführungsbeispiel haben Sie gesehen, dass Sie mit dem Attribut select das Sortierkriterium festlegen können. Im nächsten Kapitel erfahren Sie, wie der Wert dieses Attributs aufgebaut ist.
Manchmal ist es auch nötig, die Sortierreihenfolge umzukehren. Dies geschieht mit dem Attribut order. Mögliche Werte sind ascending oder descending, was für aufsteigend bzw. absteigend steht. Wenn wir unser Stylesheet aus dem Einführungsbeispiel so variieren:
Listing: adressen.xsl
Bearbeiten<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/adressen">
<html><head><title>Adressenliste</title></head>
<body>
<table>
<tr>
<th>Vorname</th>
<th>Nachname</th>
<th>Strasse</th>
<th>Postleitzahl</th>
<th>Ort</th>
</tr>
<xsl:for-each select="person">
<xsl:sort select="@nachname" order="descending" data-type="text" />
<tr>
<td><xsl:value-of select="@vorname" /></td>
<td><xsl:value-of select="@nachname" /></td>
<td><xsl:value-of select="@strasse" /></td>
<td><xsl:value-of select="@plz" /></td>
<td><xsl:value-of select="@ort" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Generiert der XSLT-Prozessor erwartungsgemäß die folgende HTML-Tabelle:
HTML: Ausgabe adressen.xml
Bearbeiten <table>
<tr>
<th>Vorname</th>
<th>Nachname</th>
<th>Strasse</th>
<th>Postleitzahl</th>
<th>Ort</th>
</tr>
<tr>
<td>Bert</td>
<td>Schmidt</td>
<td>Rosenstrasse 65</td>
<td>12344</td>
<td>Musterhausen</td>
</tr>
<tr>
<td>Denise</td>
<td>Neumann</td>
<td>Orchideenring 16</td>
<td>12449</td>
<td>Musterdorf</td>
</tr>
<tr>
<td>Emil</td>
<td>Mueller</td>
<td>Blumenweg 41</td>
<td>12345</td>
<td>Musterhausen</td>
</tr>
<tr>
<td>Anna</td>
<td>Mueller</td>
<td>Blumenweg 42</td>
<td>12345</td>
<td>Musterhausen</td>
</tr>
<tr>
<td>Christian</td>
<td>Klein</td>
<td>Veilchengasse 5</td>
<td>12345</td>
<td>Musterhausen</td>
</tr>
</table>
Mit dem Attribut data-type kann festgelegt werden, wie die Sortierung von Zahlen erfolgt. Es kann die Werte number oder text annehmen. Dazu ein weiteres Beispiel mit einer XML-Datei und dem zugehörigen Stylesheet.
Listing: data-type.xml
Bearbeiten <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="data-type.xsl"?>
<zahlen>
<zahl>6</zahl>
<zahl>10</zahl>
<zahl>1</zahl>
<zahl>954</zahl>
<zahl>1234</zahl>
</zahlen>
Listing: data-type.xsl
Bearbeiten<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output method="text" encoding="ISO-8859-1"/>
<xsl:template match="/zahlen">
Zahlensortierung mit data-type 'text'
<xsl:for-each select="zahl">
<xsl:sort select="." order="ascending" data-type="text" />
- <xsl:value-of select="." />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Der XSLT-Prozessor erzeugt dann die folgende Ausgabe:
Text: Ausgabe data-type.xml
BearbeitenZahlensortierung mit data-type 'text' - 1 - 10 - 1234 - 6 - 954
Wenn Sie beispielsweise eine Adressenliste sortieren wollen, mag dies zwar praktisch sein, es ist aber nicht dazu geeignet, um zum Beispiel eine Mitarbeiterliste nach dem monatlichen Einkommen zu sortieren. Dazu ändern wir das Stylesheet ein wenig ab:
Listing: data-type.xsl
Bearbeiten<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output method="text" encoding="ISO-8859-1"/>
<xsl:template match="/zahlen">
Zahlensortierung mit data-type 'number'
<xsl:for-each select="zahl">
<xsl:sort select="." order="ascending" data-type="number" />
- <xsl:value-of select="." />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Der XSLT-Prozessor liefert dann die korrekt sortierte Liste mit unseren Zahlen:
Text: Ausgabe data-type.xml
BearbeitenZahlensortierung mit data-type 'number' - 1 - 6 - 10 - 954 - 1234
Zusammenfassung
BearbeitenWenn Sie öfters mit unsortierten Datenmengen arbeiten, leisten Ihnen die Stylesheets hier eine große Hilfe. Mit wenigen Zeilen ist es möglich, Daten nach beliebigen Kriterien zu sortieren. Im nächsten Kapitel erfahren Sie, wie Sie bestimmte Elemente zur Sortierung oder auch zur Ausgabe auswählen.