Vorige Seite     Hauptseite     Nächste Seite


Informationsstrukturierung: Mo, 04.06.2012. Sortieren.

Innerhalb von xsl:apply-templates und xsl:for-each ist es möglich, die Liste der Knoten zu sortieren. Dazu ist es nötig, unmittelbar nach dem Aufruf die Sortierordnung festzulegen. Hier ist ein Beispiel. Es sollen die Kunden aufgelistet werden, und zwar mit dem Vornamen zuerst und dann dem Nachnamen. Dabei sollen sie so sortiert werden, dass logisch gesehen erst die Nachnamen sortiert werden, und erst wenn zwei Personen den gleichen Nachnamen haben, wird nach dem Vornamen sortiert. (Es werden Personen mit dem gleichen Namen übrigens zweimal ausgegeben.)
<ul>
  <xsl:for-each select="./kunde">
    <xsl:sort lang="de" select="./name/nach"/>
    <xsl:sort lang="de" select="./name/vor"/>
    <li>
      <xsl:value-of select="./name/vor"/>
      <xsl:text>&npsb;</xsl:text>
      <xsl:value-of select="./name/nach"/>
    </li>
  </xsl:for-each>
</ul>
Es ist möglich, aufsteigend wie absteigend zu sortieren, sowie die Sortierung der Sprache anzupassen (davon später mehr). Falls wir die Kunden jedoch nach der Kundennummer sortieren wollen, so sieht die Transformationsdatei wie folgt aus.
<ul>
  <xsl:for-each select="./kunde">
    <xsl:sort select="./kundennumer"/>
    <li>
      <xsl:value-of select="./name/vor"/>
      <xsl:text>&npsb;</xsl:text>
      <xsl:value-of select="./name/nach"/>
    </li>
  </xsl:for-each>
</ul>
Spannend wird es, wenn wir eine Liste erstellen wollen, die auf eine gewisse Weise geordnet ist, ohne sie gleich zu verarbeiten. In diesem Fall gibt es das Element xsl:perform-sort.
<xsl:variable name="vergeben">
  <xsl:perform-sort select="./kunde/kundennummer">
    <xsl:sort select="."/>
  </xsl:perform-sort>
</xsl:variable>
Wen es stört, dass Zahlen doppelt auftreten, der kann die Funktion distinct-values() aufrufen. Diese braucht ein einziges Argument, welches eine Liste ist, und eliminiert mehrfache Vorkommen. Diese kann eine Liste von Knoten bekommen, sie liefert allerdings lediglich eine Liste von Werten ab, weswegen der Gebrauch etwas trickreich sein kann. Ich biete hier die folgende Variante an: $vergeben ist bereits eine Liste, wir müssen nur noch die Funktion darauf loslassen und einer Variable übergeben, die dann, wohlgemerkt, eine Liste von Werten ist.
<xsl:variable name="vergeben2"> select="distinct-values($vergeben)">

Vorige Seite     Hauptseite     Nächste Seite