copyright (c)2003-2005   useGroup
XSLT

66151@usegroup.de

Einführung in XML/XSLT

XSLT für Fortgeschrittene

nach untenBedingungen

nach untendas fehlende xsl:else

nach untencase

nach untenxsl:when

nach untenxsl:otherwise

nach untenxsl:for-each

nach untenSortieren

nach untendas fehlende xsl:while

nach untenxsl:variable

Bedingungen

nach obenBedingungen 

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

nach obendas fehlende xsl:else 

Es gibt in XSLT ein else, nur heißt es xsl:otherwise und funktioniert nur in xsl:choose-tags.



case

nach obencase 

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

nach obenxsl: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

nach obenxsl:otherwise 

Entspricht in etwa else einer Programmiersprache oder einer Default-Einstellung.



xsl:for-each
select

nach obenxsl:for-each 

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

nach obenSortieren 

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

nach obendas 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

nach obenxsl:variable 

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.



copyright (c)2003-2005   useGroup