Mehr Entscheidungen in XSLT: xsl:choose

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

Die andere Möglichkeit, innerhalb eines Stylesheets über die Ausführung eines Abschnitts eines Templates zu entscheiden, ist xsl:choose. Genauer gesagt stellt xsl:choose nur einen Container für die eigentliche Abfrage dar, die mit der Instruktion xsl:when vorgenommen wird. Zur Formulierung eines ELSE-Zweigs steht optional die Instruktion xsl:otherwise zur Verfügung.

Verwendet man im Inneren von xsl:choose genau ein xsl:when in Verbin­dung mit xsl:otherwise, so stellt dies ein genaues Äquivalent zu IF-ELSE dar. Das Prinzip sieht wie folgt aus:

<xsl:choose>
  <xsl:when test="falls das hier wahr ist">
    ... tu dies ...
  </xsl:when> 
  <xsl:otherwise>
    ... ansonsten tu dies hier ...
  </xsl:otherwise>
</xsl:choose>

Das außen liegende xsl:choose besitzt keine Attribute, ebensowenig das am Ende des Blocks stehende xsl:otherwise. Letzteres wird automatisch ausge­führt (instanziiert), wenn der vorhergehende when-Test fehlschlägt. Sie können auch auf xsl:otherwise verzichten, wenn Sie keine »Default-Anweisung« wünschen. Die Wirkung entspricht dann vollständig der Instruktion xsl:if:

<xsl:choose>
  <xsl:when test="falls das hier wahr ist">
    ... tu dies ...
  </xsl:when> 
</xsl:choose>

ist also gleichbedeutend mit:

<xsl:if test="falls das hier wahr ist">
  ... tu dies ...
</xsl:if>

Beim Stylesheet-Design sollten Sie berücksichtigen, dass der erste Ausdruck zwar wortreicher als der zweite ist, dafür aber erweiterbar. Es besteht die Möglichkeit, einen ELSE-Zweig nachzurüsten, ohne die Instruktion zu ändern.

Darüber hinaus gibt es weitere Unterschiede. Im xsl:choose-Container kön­nen mehrere xsl:when-Anweisungen hintereinander stehen (allerdings stets maximal ein xsl:otherwise am Ende des Blocks), womit Strukturen nachvoll­ziehbar sind, die einem SELECT bzw. Switch-Statement gleichen:

<xsl:choose>
  <xsl:when test="falls das hier wahr ist">
    ... tu dies ...
  </xsl:when> 
  <xsl:when test="falls aber das hier wahr ist">
    ... tu jenes ...
  </xsl:when> 
  <!-- optionaler Default-Block: -->
  <xsl:otherwise>
    ... ansonsten tu dies hier ...
  </xsl:otherwise>
</xsl:choose>

Hierbei können unbegrenzt viele xsl:when aneinander gereiht werden, von denen nur das erste, dessen Test erfolgreich ist, ausgeführt wird. Nachfolgende xsl:when bleiben unberücksichtigt, auch wenn ihre Bedingung erfüllt wäre.

Mehrere aufeinander folgende xsl:if sind daher nicht äquivalent zu mehre­ren xsl:when in xsl:otherwise, da deren Tests voneinander unabhängig sind. In diesem Falle würde jedes xsl:if mit erfolgreichem Test einer entspre­chenden Reihe ausgeführt.

Mittels xsl:choose lässt sich der ISBN-Hinweis verbessern und ein Hinweis ausgeben, falls keine ISBN-Nummer vorliegt. Die für xsl:if verwendete Bedingung (hier die erweiterte) kann für xsl:when einfach übernommen wer­den:

<xsl:template match="buch">
  <p>
    <xsl:apply-templa¬tes/>
    <xsl:choose>
      <xsl:when test="@isbn != ''">
        <br/>(ISBN: <xsl:value-of select="@isbn"/>)
      </xsl:when>
      <xsl:otherwise>
        <br/>(ISBN-Nummer liegt nicht vor.)
      </xsl:otherwise>
    </xsl:choose>
  </p>
</xsl:template>

Code-Beispiel: kap02/2.02.2/buchhandel-choose1.xsl (Auszug).

  

<< zurück vor >>
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