Bedingungen
Mit xsl:if können Sie überprfen, ob Variablen, Funktionen, Tags
oder Attribute einen bestimmten Wert haben.
Siehe auch when
Ein definiertes Tag oder Attribut hat z.B. immer den Wert true, so gibt
<xsl:if test="@name">
Name des Bildes: <xsl:value-of select="@name"/>
</xsl:if>
Name des Bildes: auch wirklich nur dann aus, wenn auch ein solcher
Name definiert wurde.
<xsl:if test="position()!=last()">
<a href="#top"><img src="nachunten.gif"/></a>
</xsl:if>
gibt nur bis zum vorletzen Vorkommen des Tags nachunten-Bilder aus.
das fehlende xsl:else
Es gibt in XSLT ein else, nur heißt es xsl:otherwise und funktioniert
nur in xsl:choose-tags.
case
xsl:choose ist in etwa mit einem case einer normalen Programmiersprache vergleichbar.
Alle when-und otherwise Tags müssen in einem xsl:choose Tag gekapselt sein.
<xsl:choose>
<xsl:when test="state='AZ'">Arizona</xsl:when>
<xsl:when test="state='CA'">Kalifornien</xsl:when>
<xsl:when test="state='DC'">Washington DC</xsl:when>
<xsl:otherwise><xsl:value-of select="state"/></xsl:otherwise>
</xsl:choose>
xsl:when
Änlich if, darf aber nur in einem choose-Tag vorkommen und ein otherwise (entspricht else) ist möglich.
Beispiel siehe xsl:choose
xsl:otherwise
Entspricht in etwa else einer Programmiersprache oder einer Default-Einstellung.
xsl:for-each
select
xsl:for-each ist ein sehr praktisches Tag, weil es erlaubt, alle Tags eines
bestimmten Types im aktiven Template auszugeben und zu bearbeiten.
Daher ist es z.B. fr Inhaltsverzeichnisse und Stichwortlisten pr�estiniert.
<xsl:for-each select="//cue">
<a href="{.}"/><xsl:value-of select="@name"/></a>
</xsl:for-each>
findet alle (// entspricht an jeder Position des Dokuments) cues des Dokuments und gibt sie mit Namen aus.
Ein interessanter Nebeneffekt ist, dass es das Element (sofern eins angegeben) in select
zum aktiven Knoten macht, im Beispiel wird also jeder //cue nacheinander zum aktiven Element,
sodass "." und "@name" die entsprechenden Inhalte haben und nicht wie
<xsl:for-each select="//cue">
<a href="{//cue}"/><xsl:value-of select="//cue/@name"/></a>
</xsl:for-each>
geschrieben werden mssen - das auch eine ganz andere Bedeutung hätte (select="//cue/@name" würde z.B.
wieder den alle Namen-Attribute aller cues ausgeben).
Weil es den aktiven Knoten wechselt, verwenden einige sogar ein xsl:for-each auf ein Statement,
das nur ein einziges Element erzeugt, eben um relativ adressieren zu können.
Sortieren
select, *order, *case-order, *lang, *data-type
xsl:sort ist als Kindelement zu for-each und apply-templates zugelassen. Es sortiert die Ausgabe
nach dem in select angegebenem Attribut
<xsl:for-each select="document(@fname)//cue">
<xsl:sort select="@name"/>
<xsl:value-of select="@name"/>-<xsl:apply-templates/><br/>
</xsl:for-each>
order kann "ascending" oder "descending" sein, case-order "lower-first" oder
"upper-first".
lang setze ich gewohnheitsmäßig auf "de", was die
deutsche Sortierreihenfolge anwenden sollte, bei Saxon aber nichts
ädert. Laut Michael Kay ist die Sortierreihenfolge für
modernes deutsch übrigens aäbcdefghijklmnoöpqrstuüvwxyz
anstelle - wie zumindest noch in meinem Telefonbuch - ä bei
ae einzuordnen. Nebenbei sei die Reihenfolge im Schwedischen ä�nach z.
data-type kann "text", "number" oder ein QName sein was bestimmt ob die
Werte dem Alphabet oder Nummern oder einem selbstdefinierten Datentyp
zugeordnet werden.
Sortiert xsl:sort nicht die Ausgabe, sondern die Eingabe, also die
Reihenfolge in der die Elemente verarbeitet werden.
<xsl:sort select="position()" data-type="number" order="descending"/>
wendet die Templates in entgegengesetzter Reihenfolge zu der, in der
sie im Dokument definiert sind, an.
Eine Sortierung z.B. nach Alter und Name kann durch zwei sorts hintereinander
erreicht werden.
<xsl:for-each select="//person">
<xsl:sort select="@alter"/>
<xsl:sort select="@name"/>
<xsl:value-of select="@alter"/>, <xsl:value-of select="@name"/><br/>
</xsl:for-each>
das fehlende xsl:while
Da es in XSLT nicht m�lich ist, Variablen zu modifizieren, gibt es auch kein while, weil sich keine
Bedingung jemals ändern könnte. Es ist allerdings möglich, templates rekursiv so aufzurufen, dass sich de
facto ein while realisieren lässt.
xsl:variable
name *select
Die Auswertung von select oder der Inhalt wird in der Variable gespeichert.
Variablen werden mit $ angesprochen.
<xsl:variable name="lastnode" select="last()"/>
<xsl:if test="position()=$lastnode">
Last node for the turn...
</xsl:if>
<xsl:variable name="decision">
<xsl:if test="position()=1">
First node for the turn...
</xsl:if>
<xsl:if test="position()=last()">
Last node for the turn...
</xsl:if>
</xsl:variable>
Diese Variable hat entweder den Inhalt First node for the turn oder Last node for the turn.
Geltungsbereich:
Werden Variablen innerhalb eines Elements wie template, if, for-each o.ä. definiert,
gelten Sie nur innerhalb des Elements und dessen Unterelemente;
<xsl:if test="position()=1">
<xsl:variable name="decision" select="First node for the turn..."/>
</xsl:if>
<xsl:if test="position()=last()">
<xsl:variable name="decision" select="Last node for the turn..."/>
</xsl:if>
erzeugt keine Variable, die ich nach dem letzten </xsl:if> noch ansprechen könnte.