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 Verbindung 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 ausgefü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önnen mehrere xsl:when-Anweisungen hintereinander stehen (allerdings stets maximal ein xsl:otherwise am Ende des Blocks), womit Strukturen nachvollziehbar 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 mehreren xsl:when in xsl:otherwise, da deren Tests voneinander unabhängig sind. In diesem Falle würde jedes xsl:if mit erfolgreichem Test einer entsprechenden 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 werden:
<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>
| 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








