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 Bearbeiten

Listing: 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 Bearbeiten

Im 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 Bearbeiten

   Zahlensortierung 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 Bearbeiten

  Zahlensortierung mit data-type 'number'
  
    
      - 1
      - 6
      - 10
      - 954
      - 1234

Zusammenfassung Bearbeiten

Wenn 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.