Websiteentwicklung: XSLT: Sortieren

Aus Wikibooks

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.