Als Entwickler findet man die Möglichkeiten von Variablen sehr zu schätzen. Auch wenn es dem Gedanken einer Auszeichnungssprache wiederspricht, so hat man dennoch zwei Möglichkeiten: xsl:variable und xsl:param. Einige Möglichkeiten von xsl:variable habe ich beireits in dem Artikel beschreiben http://www.devtrain.de/news.asp?artnr=461. Den originalen Charakter einer Variablen haben aber beide nicht, sondern eher den einer Konstanten oder besser gesagt einer Entität.
Wenn man von xsl:param spricht muss man auch von xsl:with-param sprechen, da beide sehr eng miteinander arbeiten. Bei der Benutztung von beiden kommt man schon eher an den Gedanken einer Variablen heran. Die Werte die xsl:param zugewiesen werden, können z.B in einem Template verwendet werden, das mit xsl:call-template wieder aufgerufen werden kann.
Der Wert des xsl:param ist ein Standard Wert, der auch wieder überschrieben werden kann.
Zunächst einmal...wie verwendet man die xsl:param. Genauso wie xsl:variable!
<xsl:param name="NamedesParameters"> <xsl:value-of select="ReferenzierterWert"/> ' --> XPATH </xsl:param> |
xsl:param kann nur unter folgenden Knoten, dafür aber beliebig oft, eingefügt werden:
xsl:stylesheet, xsl:template, xsl:transform.
Sehen wir uns bei der Gelegeheit auch gleich mal xsl:with-param an:
xsl:with-param wird innerhalb von xsl:call-template oder xsl:apply-templates verwendet. Der Wert im Attribut name ist der Verweis auf die das xsl:param und übergibt dem Template neue Werte.
<xsl:call-template name="templatename"> <xsl:with-param name="namedesxsl:param">neuerWert</xsl:with-param> </xsl:call-template> |
Auch hier gilt: Parent Knoten müssen sein:
xsl:apply-templates, xsl:call-template
So kommen wir nun zu einem Beispiel:
Hier unsere XML Daten:
<?xml version='1.0'?> <?xml-stylesheet type="text/xsl" href="xslparam.xsl"?> <xslparam> <Kongress> <datum>ASP-net Konferenz</datum> <datum>findet</datum> <Kongress> <datum>vom 20.Juni</datum> <datum>bis</datum> <datum>21. Juni</datum> </Kongress> <datum>statt</datum> </Kongress> </xslparam> |
und hier unser xsl File:
<?xml version='1.0'?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Kongress/datum"> <br/> <xsl:call-template name="Nummerierung"/> </xsl:template> <xsl:template match="Kongress/Kongress/datum"> <br/>    <xsl:call-template name="Nummerierung"> ' ruft Template Nummerierung auf <xsl:with-param name="format">a. </xsl:with-param> </xsl:call-template> </xsl:template> <xsl:template name="Nummerierung"> <xsl:param name="format">1.</xsl:param> <xsl:number format="{$format}"/> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet> |
Wie funktionierts?
Im letzten Template "Nummerierung" sehen wir wie das Element xsl:param mit dem Namen "format" erstellt wird. Das Template selbst ist für die spätere Auflistung zuständig.
Das haben wir ja schon im Artikel http://www.devtrain.de/news.asp?artnr=523 besprochen.
So und nun der Reihe nach. Das erste Template matched unsere Knoten "Kongress/datum" und ruft das Template Nummerierung für jedes gefunden Element auf also:
<datum>ASP-net Konferenz</datum> <datum>findet</datum> ... <datum>statt</datum>
|
Dort findet eine Formatierung zu einer Auflistung statt. Das Element xsl:number bezieht seinen Wert aus dem xsl:param.
<xsl:param name="format">1.</xsl:param> <xsl:number format="{$format}"/>
|
Anschließend werden weitere Templates ("Kongress/Kongress/datum") aufgerufen, die eine die Knoten weiter unterhalb noch finden. Auch dort findet wieder der Aufruf auf das Template Nummerierung statt. Hier wird jedoch dem xsl:param ein anderer Wert hinzugewiesen:
<xsl:with-param name="format">a. </xsl:with-param>
|
Daher werden Konten unterhalb mit Kleinbuchstaben aufgelistet.
Das Ergebnis sieht so aus:
1.ASP-net Konferenz 2.findet a. vom 20.Juni b. bis c. 21. Juni 3.statt |
Resumee:
Das Verhalten der Variablen oder Parameter in xsl haben eher den Charakter einer Konstanten oder einer Entität, da sich deren Werte eigentlich nie ändern. Dennoch ist es möglich z.B. xsl:param mit Hilfe von xsl:with-param die Werte auszutauschen. Wir haben also nicht die Eigenschaft der Variable xsl:param geändert, wie in anderen Programmiersprachen, sondern eine neue Referenz gebildet.
Viel Spaß damit!