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