xsl:param

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 6.)

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

 

Mit der Anweisung xsl:param wird ein benannter Parameter definiert, der von außen mit einem Wert belegt werden kann. Der Parameter kann einen Defaultwert besitzen, der in diesem Fall überschrieben wird. Anschließend kann der Wert für die Dauer der Gültigkeit des Parameters nicht mehr geändert werden. Ein Parameter kann global für das gesamte Stylesheet oder lokal in einer Template-Regel deklariert werden.

Klassifizierung Deklaration/Instruktion
Funktionsgruppe Parameterdefinition
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

xsl:param tritt sowohl als Toplevel-Element als auch als Instruktion auf. Wird es als Toplevel-Element, also als Kindelement von xsl:stylesheet oder xsl:transform, eingesetzt, so erzeugt es einen globalen Parameter. Innerhalb einer Template-Regel xsl:template als Instruktion verwendet, erzeugt es einen für diese Template-Regel gültigen lokalen Parameter.

Das Element muss leer sein, wenn sein select-Attribut verwendet wird. Liegt kein select-Attribut vor, so enthält es einen Templatebody in Form eines Sequenzkonstruktors, der aus XSLT-Instruktionen, Text und literalen Ergebniselementen in beliebiger Zusammensetzung bestehen kann. Der Sequenzkonstruktor zielt in diesem Fall nicht auf das Ergebnisdokument, sondern erzeugt einen temporären Baum, auf den bei Referenzierung des Parameters zugegriffen werden kann.

Attribute:

Es gelten die Standardattribute. Dazu besitzt xsl:param ein obligatorisches name-Attribut und ein optionales select-Attribut. Ab XSLT 2.0 kommen die optionalen Attribute as, required und tunnel hinzu.

as

Wert

sequence-type

Verwendung

optional

Einführung

XSLT 2.0

Das as-Attribut legt den Datentyp des Parameterwertes fest. Der Attributwert muss einen Sequence-Typ nach XPath 2.0 bezeichnen – ist das as-Attribut gesetzt, so muss der Wert des Parameters dem vorgegebenen Typ entsprechen.

Ist dies nicht der Fall, so wird eine Typkonvertierung vorgenommen. Ein Fehlschlagen der Konvertierung wird entsprechend als Typfehler gewertet (ERR XTTE0590). Ist kein as-Attribut vorhanden, so wird der Wert des Parameters entsprechend dem ausgewerteten select-Ausdruck bzw. dem enthaltenen Sequenzkonstruktor unverändert übernommen.

Ist ein as-Attribut vorhanden, aber kein Defaultwert mittels eines select-Attributs oder eines Sequenzkonstruktors festgelegt, so gilt die leere Sequenz als Defaultwert (Achtung – nicht wie sonst der leere String!). In diesem Fall wird der Parameter, sofern die leere Sequenz durch den mittels as festgelegten Datentyp nicht gestattet ist, als obligatorisch erachtet. Das bedeutet, dass ein Laufzeitfehler ERR XTDE0610 gemeldet wird, der zum Abbruch führt, wenn keine Wertübergabe erfolgt, also der Defaultwert in Kraft tritt. Wird stets ein Wert übergeben, so braucht der Prozessor auch dann nicht einen Fehler zu melden, wenn ein existierender Defaultwert nicht dem Typ entspricht.

Hinweis: Das as-Attribut für xsl:param existiert nicht in XSLT 1.0.

name

Wert

qname

Verwendung

obligatorisch

Einführung

XSLT 1.0

Das obligatorische name-Attribut bestimmt den Namen des Parameters, mit dem dieser im Stylesheet referenziert wird. Es handelt sich um einen QName. Es dürfen niemals mehrere namensgleiche Parameter derselben Importpräzedenz oder desselben Gültigkeitsbereichs (Scope) auftreten, d.h. keine namensgleichen globalen Parameter oder namensgleichen lokalen Parameter innerhalb ein und derselben Template-Regel. Ist das der Fall, so wird ein statischer Fehler gemeldet (ERR XTSE0580). Dasselbe gilt für namensgleiche Parameter innerhalb einer Funktionsdeklaration mit xsl:function.

Namensgleichheit ist gestattet für folgende Fälle:
Zwei oder mehr gleich benannte globale Parameter besitzen unterschiedliche Importpräzedenz. Treten Namensdopplungen durch Import eines externen Stylesheetmoduls auf, so gilt der Wert des Parameters mit der höchsten Importpräzedenz, normalerweise also der des Hauptmoduls. Der Wert des Parameters mit der geringeren Präzedenz ist nicht zugänglich.

Eine Namensgleichheit zwischen einem globalen und einem lokalen Parameter ist unproblematisch. Der lokale Parameter überschattet (shadows) innerhalb der Template-Regel, für die er definiert ist, gegebenenfalls den gleichnamigen globalen. Der Wert des globalen Parameters ist daher innerhalb dieser Template-Regel nicht zugänglich.

Eine Namensgleichheit lokaler Parameter, die in verschiedenen Template-Regeln deklariert sind, ist unproblematisch, da sich ihre Gültigkeitsbereiche nicht überschneiden. Jeder lokale Parameter gilt nur während der Laufzeit seiner Template-Regel und ist außerhalb dieser daher nicht zugänglich bzw. nicht existent.

required

Wert

"yes" | "no"

Verwendung

optional

Einführung

XSLT 2.0

Das Attribut required legt fest, ob die Übergabe eines Wertes für diesen Parameter vorgeschrieben sein soll oder nicht.

  • required="no" (Defaultwert)
    Ist der Wert des required-Attributs "no", so muss dem Parameter nicht zwangsläufig ein Wert übergeben werden. Bei unterbleibender Wertübergabe tritt der Defaultwert des Parameters in Kraft, der sich entweder aus der Auswertung seines select-Attributs oder des in der Instruktion enthaltenen Sequenzkonstruktors ergibt.
  • required="yes"
    Wird das required-Attribut auf "yes" gesetzt, so muss in jedem Fall ein Wert für den betreffenden Parameter übergeben werden. In diesem Fall darf kein Defaultwert vorgegeben werden (der ohnehin nie in Kraft träte); xsl:param muss also leer sein und darf auch kein select-Attribut besitzen.

Hinweis: Das required-Attribut existiert nicht in XSLT 1.0.

Achtung – Besonderheit in xsl:function-Deklarationen von XSLT 2.0:
Das required-Attribut ist verboten, wenn xsl:param zur Definition von Funktionsparametern innerhalb von xsl:function eingesetzt wird. Werte müssen in diesem Fall ohnehin obligatorisch übergeben werden, jedoch geschieht dies über den Funktionsaufruf und nicht, wie bei anderen Parametern, mittels xsl:with-param.

select

Wert

xpath-expression

Verwendung

optional

Einführung

XSLT 1.0

Das select-Attribut dient alternativ zu einem möglichen Sequenzkonstruktor innerhalb von xsl:param zur Erzeugung des Defaultwertes des Parameters. Das Attribut enthält einen XPath-Ausdruck, dessen Auswertung den gewünschten Defaultwert ergibt. Ist das select-Attribut gesetzt, so muss das Element leer sein (die Spezifikation sieht jedoch nicht explizit eine Fehlermeldung vor).

Ergebnis der Auswertung ist eine Sequenz. Zahlen können unmittelbar als Literale übergeben werden, Strings müssen in diesem Fall – zusätzlich zu den Attributwertbegrenzern! – in Anführungszeichen eingeschlossen sein:

<xsl:param name="stringparam" select="'mein stringwert'"/>

Ist weder ein select-Attribut noch ein Sequenzkonstruktor im Inneren des Elements vorhanden, so wird der Defaultwert des Parameters auf den leeren String gesetzt. Folgende Ausdrücke sind daher wirkungsgleich:

<xsl:param name="leerer_param"/>

<xsl:param name="leerer_param" select="''"/>

Achtung – Besonderheit in xsl:function-Deklarationen von XSLT 2.0:
Wird xsl:param innerhalb einer xsl:function-Deklaration zum Übernehmen eines Funktionsarguments eingesetzt, so darf die Instruktion weder einen Templatekörper enthalten, noch darf das select-Attribut verwendet werden!

tunnel

Wert

"yes" | "no"

Verwendung

optional

Einführung

XSLT 2.0

Das Attribut tunnel mit Wert "yes" kennzeichnet einen Parameter als »Tunnelparameter«. Der betreffende Parame­ter erhält seinen Wert in diesem Fall aus dem Tunnelparameterstrom. Das Attri­but ist nicht anwendbar für globale Parameterdeklarationen in der Toplevel-Ebene und für Funktionsparameter.

Hinweis: Das tunnel-Attribut existiert nicht in XSLT 1.0.

Verwendungszweck:

Die Anweisung xsl:param dient zur Deklaration von Parametern, die vergleichbar mit den durch xsl:variable erzeugten XSLT-Variablen sind. Ebenso wie bei diesen handelt es sich um statische Vari­ablen, deren Wert während ihrer Gültigkeitsdauer nicht verändert werden kann.

Im Unterschied zu einer Variablen kann ein Parameter bei seiner Deklaration von außen mit einem Wert belegt werden, der dann den Defaultwert über­schreibt (so betrachtet, besitzt eine Variable nur ihren nicht überschreibbaren Defaultwert).

Die Referenzierung eines Parameters mit Namen name="p_name" erfolgt analog zu der einer Variable innerhalb eines XPath-Ausdrucks oder eines Attributwert-Templates über seinen Namen mit vorangestelltem $-Zeichen: $p_name.

Achtung – bei Referenzierung kein Unterschied zu xsl:variable:
Bei der Referenzierung im XPath-Ausdruck bzw. AVT wird nicht zwischen Variablen und Parametern unterschieden. Ob beispielsweise $x mittels <xsl:variable name="x"> oder <xsl:param name="x"> deklariert wurde, ist an der Referenz nicht erkennbar. Aus diesem Grund treten Kolli­sionen und Shadowing auch zwischen namensgleichen Variablen und Para­metern auf.

Ebenso wie bei der XSLT-Variable ist bei einem Parameter ein select-Attribut oder alternativ hierzu ein Templatekörper vorhanden, dessen Auswertung den Parameterwert ergeben kann. Im Gegensatz zum Wert einer Variable ist dieser Wert allerdings nur ein Defaultwert, der von außen im Zuge der Deklaration durch eine Wertübergabe überschrieben werden kann.

Anhand des Gültigkeitsbereichs des Parameters im Stylesheet unterscheidet man zwischen globalen und lokalen Parametern. Entscheidend hierfür ist der Ort der Deklaration.

Globale Parameter:

Wird die Deklaration xsl:param als unmittelbares Child-Element von xsl:stylesheet (bzw. xsl:transform) eingesetzt, so gilt der so definierte Parameter global innerhalb aller Template-Regeln des Styles­heets und kann dort überall referenziert werden:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="para_global" select="'defaultwert'"/>
  <!-- Referenzierung überall im Stylesheet mit $para_global -->
</xsl:stylesheet>

Eine Ausnahme bei der Referenzierungsmöglichkeit globaler Parameterwerte bilden diejenigen Template-Regeln, innerhalb derer ein gleich benannter loka­ler Parameter (oder eine gleich benannte lokale Variable!) definiert ist. Dieser überschattet den globalen Parameter. Der globale Wert ist innerhalb dieser Template-Regel daher nicht erreichbar.

Wertübergabe an globale Parameter:
Der Augenblick der Wertübergabe an einen Parameter ist abhängig von seiner Position im Stylesheet. Ein globaler (Toplevel-)Parameter wird beim Aufruf des Stylesheets initialisiert; sein Wert gilt während des gesamten Transformationsvorgangs. Eine anschließende Neu­belegung durch einen anderen Wert während der Laufzeit des Stylesheets ist nicht mehr möglich.

Die Methode der Wertübergabe an einen globalen Parameter ist abhängig von der die Transformation ausführenden Applikation. Der Wert kann mittels eines Querystrings (z.B. Cocoon) oder aus der Kommandozeile bei Aufruf der Trans­formation (z.B. Saxon, XT) übergeben werden.

  • Für Cocoon ist die Syntax in etwa folgende:
    "http://www.bei­spiel.org/beispiel.xml?p_name=p_wert"
    Beachten Sie, dass nicht das hier aufgerufene XML-Dokument den Parameter übernimmt, sondern in Wirklichkeit das verarbeitende XSLT-Stylesheet!
  • Für Saxon 8 lautet die Kommandozeile mit zwei übergebenen Parametern:
    java net.sf.saxon.Transform beispiel.xml beispiel.xsl  p_name=p_wert p_name2=p_wert2
    Der Wert wird in beiden Fällen im Rahmen eines name-value-Paares übergeben. Innerhalb des Stylesheets ist der übergebene Wert mit $p_name wie ein Variablenwert ansprechbar. Es ist dar­auf zu achten, dass bei einer Wertübergabe mit dieser Methode auch ein Zielparameter in Form eines globalen xsl:param-Elements mit dem gewähl­ten Namen name="p_name" vorhanden ist. Ist dies nicht der Fall, so wird der übergebene Wert verworfen.

Lokale Parameter:

Wird ein Parameter (auf Instruktionsebene) innerhalb einer Template-Regel xsl:template deklariert, so gilt er lokal innerhalb dieser Template-Regel während ihrer Laufzeit. Das xsl:param-Element muss dabei als erstes Child-Element der Template-Regel stehen, vor allen etwaigen andersartigen Inhalten des Templaterumpfes. Mehrere xsl:param-Elemente dürfen also aufeinander folgen. Ihre Reihenfolge untereinander spielt dabei weder für die Wertübergabe, noch für die Referenzierung der Werte eine Rolle. (Anmerkung: Dies ist nicht der Fall bei Funktionsdeklarationen mit xsl:function.)

<xsl:template match="beispiel">
  <xsl:param name="param1" select="'defaultwert1'"/>
  <xsl:param name="param2" select="'defaultwert2'"/>
  ...
  <!-- Referenzierung mit $param1 und $param2 -->
</xsl:template>

Ein lokaler Parameter wird bei jedem Aufruf der Template-Regel, in der er dekla­riert ist, neu initialisiert. Sein Wert gilt unverändert während der Laufzeit der Template-Regel – der Parameter kann bzw. muss aber bei jedem neuen Durch­lauf der Template-Regel neu belegt werden, wobei jedes Mal ein anderer Wert verwendet werden kann. Wird kein Wert übergeben, so gilt der Defaultwert.

Vor und nach der Instanziierung der Template-Regel ist ein lokaler Parameter nicht existent und aus diesem Grunde außerhalb der Template-Regel nicht zugänglich (auch nicht in untergeordneten Regeln, also durch diese aufgerufe­nen Regeln).

Es ist gefahrlos möglich, in anderen Template-Regeln gleich benannte Parameter zu verwenden, da sich deren Gültigkeitsbereiche nicht überlappen können. Existiert ein namensgleicher globaler Parameter (bzw. eine globale Variable), so besitzt der lokale innerhalb seiner Template-Regel Vorrang.

Wertübergabe an lokale Parameter:
Für die Wertübergabe an lokale Para­meter wird die XSTL-Instruktion xsl:with-param verwendet. Diese nennt über ihr eigenes name-Attribut den Namen des zu belegenden Parameters und über ihr select-Attribut oder einen enthaltenen Templaterumpf den zu über­gebenden Wert. In der addressierten Template-Regel sollte ein Parameter mit entsprechendem Namen existieren, andernfalls wird der zu übergebende Wert, sofern es sich nicht um einen Tunnelparameter handelt, verworfen – ein Lauf­zeitfehler wäre dies immerhin nicht (Ausnahme: Wertübergabe aus xsl:call-template).

Die Wertübergabe erfolgt beim Aufruf der Template-Regel, die den lokalen Para­meter enthält. Dieser Aufruf erfolgt entweder mit xsl:apply-templates (in XSLT 2.0 zusätzlich auch aus xsl:apply-imports oder xsl:next-match) oder xsl:call-template. Entsprechend der Zahl der zu übergebenden Parameter­werte werden ebenso viele xsl:with-param-Instruktionen als Child-Elemente der aufrufenden Instruktion verwendet – ihre Reihenfolge im Inneren der Instruktion spielt keine Rolle.

Wertübergabe aus xsl:apply-templates:

...
<xsl:apply-templates select="beispiel">
  <xsl:with-param name="sinn-des-lebens" select="42"/>
  <xsl:with-param name="autor">Douglas Adams</xsl:with-param>
</xsl:apply-templates>
...

Das xsl:with-param-Element generiert aus seinem Templatebody einen temporären Baum, der dann über die Parameterreferenz innerhalb der Tem­plate-Regel zugänglich ist. Ansonsten wird das Ergebnis des XPath-Ausdrucks des select-Attributs übergeben.

Werden durch eine einzige xsl:apply-templates-Instruktion mehrere Template-Regeln angesprochen (was z.B. der Fall ist, falls ein heterogener Nodeset zusammengestellt wird), so bekommen alle diese Template-Regeln die gleichen Parameterwerte übergeben.

Wertübergabe aus xsl:call-template:

...
<xsl:call-template name="meine_templateregel">
  <xsl:with-param name="sinn-des-lebens" select="42"/>
  <xsl:with-param name="autor">Douglas Adams</xsl:with-param>
</xsl:call-template>
...

Das Prinzip der Wertübergabe entspricht demjenigen bei xsl:apply-temp­lates.

Achtung – Unterschied zwischen XSLT 1.0 und XSLT 2.0:
In XSLT 2.0 ist es, sofern der Prozessor nicht im rückwärtskompatiblen Modus arbeitet, ein statischer Fehler, wenn zu einem übergebenen Wert im Ziel-Template kein entsprechender lokaler Parameter existiert (ERR XTSE0680). In XSLT 1.0 wird der betroffene Wert lediglich verworfen.

Wertübergabe aus xsl:apply-imports (möglich ab XSLT 2.0):

<xsl:template select="beispiel">
  <xsl:param name="para_1" select="defaultwert"/>
  ...
  <xsl:apply-imports>
    <xsl:with-param name="para_1" select="$para_1"/>
  </xsl:apply-imports>
  ...
</xsl:template>

In XSLT 1.0 musste innerhalb aktivierter importierter Template-Regeln auf die Defaultwerte der in ihnen gegebenenfalls enthaltenen lokalen Parameter zurückgegriffen werden, da keine Wertübergabe an sie vorgesehen war. In XSLT 2.0 ist das Inhaltsmodell von xsl:apply-imports erwei­tert worden, sodass jetzt Parameterwerte übergeben werden können.

Da sich die Instruktion xsl:apply-imports (nicht aber die aktivierte Temp­late-Regel!) im Gültigkeitsbereich lokaler Parameter und Variablen der aktivie­renden Template-Regel befindet, können deren Werte ebenfalls an Parameter – auch gleichnamige! – weitergegeben werden. Im obigen Beispiel geschieht dies für einen Parameter $para_1.

Obwohl die Aktivierung einer importierten Template-Regel funktional der Inklusion ihres Templaterumpfes an der Position der xsl:apply-imports-Instruktion gleichkommt, sind Variablen oder Parameter der aktivierenden Template-Regel in der importierten Regel nicht im Scope – sie können dort also nicht referenziert werden.

Ein Defaultwert eines lokalen Parameters der aktivierten Regel überschattet demzufolge den Wert eines gleichnamigen Parameters der aktivierenden Regel, solange dessen Wert nicht explizit weitergereicht wird.

Achtung – Unterschied zwischen XSLT 1.0 und XSLT 2.0:
In XSLT 1.0 ist eine Wertübergabe an Parameter einer im Rahmen von xsl:apply-imports aktivierten importierten Template-Regel nicht mög­lich, da das dort gültige Inhaltsmodell die xsl:with-param-Instruktion nicht zulässt.

Wertübergabe aus xsl:next-match (möglich ab XSLT 2.0):

<xsl:template select="beispiel">
  <xsl:param name="para1" select="defaultwert"/>
  ...
  <xsl:next-match>
    <xsl:with-param name="para1" select="$para1"/>
  </xsl:next-match>
  ...
</xsl:template>

Alternativ zu xsl:apply-imports kann in XSLT 2.0 die Instruktion xsl:next-match eingesetzt werden, um überschriebene Template-Regeln zu reaktivieren. Im Unterschied zu xsl:apply-imports werden hierbei auch Template-Regeln niedrigerer Priorität und nicht nur solche niedrigerer Importpräzedenz berücksichtigt. In XSLT 1.0 ist eine Aktivierung hingegen nur für importierte Template-Regeln vorgesehen.

Tunnelparameter (ab XSLT 2.0):

Parameterwerte können von einer Template-Regel zur anderen auch in Form von »Tunnelparametern« weitergegeben werden. Dies geschieht ebenfalls mit xsl:with-param, jedoch muss diese Instruktion zusätzlich über ein tunnel-Attribut mit Wert "yes" verfügen. Der entsprechend übergebene Wert wird dem sogenannten Tunnelstrom hinzuge­fügt und steht im aufgerufenen Template zur Verfügung, jedoch auch in diesem untergeordneten (also durch dieses aufgerufenen) Templates, ohne explizit weitergegeben werden zu müssen. Der Parameterwert »durchtunnelt« gewissermaßen die dazwischen liegenden, weiterführenden Templateaufrufe.

Ein Tunnelparameter ähnelt hierin einem globalen Parameter; er kann jedoch mit einem neuen Wert belegt werden, wenn die ihn erzeugende xsl:with-param-Instruktion neu instanziiert wird. Befindet sich zu diesem Zeitpunkt bereits ein Parameter des gleichen Namens im Tunnelstrom, so wird dessen Wert für die Gültigkeitsdauer des neuen Parameters überschrieben (der alte Wert ist jedoch nicht gelöscht, sondern wieder zugänglich, sobald das Temp­late, das den neuen Wert erzeugt, und dessen untergordnete Templates abgear­beitet sind).

Ein Tunnelparameter kann nur von einer xsl:param-Instruktion aufgefangen werden, die erstens den passenden Namen besitzt und zweitens ebenfalls über ein tunnel-Attribut mit Wert "yes" verfügt. Auch wenn der Parameterwert »unterwegs« ausgelesen wurde, steht er anschließend im Tunnelstrom weiter­hin für untergeordnete Templates zur Verfügung.

Ein explizit übergebener Wert hat im Zweifelsfall Vorrang vor einem Tunnel­wert – ein xsl:param mit tunnel="yes" nimmt also einen (auch ohne tunnel-Attribut!) direkt übergebenen Wert entgegen, auch wenn im Tunnelstrom ein gleich benannter Parameterwert vorhanden sein sollte (solche implizit überge­benen Dubletten sind gestattet).

Die Option, in einem Template zwei gleich benannte Parameter zu ver­wenden, auch wenn der eine ein tunnel-Attribut besitzt, besteht ausdrücklich nicht! Sie können also in keinem Fall gleichzeitig einen direkt übergebenen und einen Tunnelwert nutzen, wenn beide denselben (expandierten) Bezeich­ner haben.

Parameter in Stylesheetfunktionen (ab XSLT 2.0):

Die Übergabewerte einer mittels xsl:function deklarierten Stylesheetfunktion werden dort intern ebenfalls mittels xsl:param-Elementen definiert:

<xsl:function name="bsp:beispiel">
  <xsl:param name="para_1" as="xs:integer"/>
  <xsl:param name="para_2" as="xs:string"/>
  <xsl:param name="para_3" as="xs:string"/>
  ...
  <!-- Funktionsblock mit Referenzen $para_1, $para_2 etc. -->
  ...
  <!-- Ergebnisausgabe mit xsl:result -->
</xsl:function>

Kein Defaultwert für Funktionsparameter:
Es ist allerdings gegenüber der sonst üblichen Syntax eine Besonderheit zu bemerken: Die xsl:param-Dekla­rationen in einer Funktion dürfen weder ein select-Attribut noch einen Tem­plateblock besitzen. Ein Defaultwert ist also nicht nur nicht definierbar, son­dern darf nicht vorgegeben werden (normalerweise würde bei Abwesenheit eines select-Attributs und eines Templateblocks der leere String als Vorgabe­wert angenommen – auch dies ist hier nicht der Fall!). Die obere Funktion müsste z.B. so aufgerufen werden:

bsp:beispiel(42, 'Douglas Adams', 'Per Anhalter durch die Galaxis')

Die Ursache liegt darin, dass die Zahl der zu übergebenden Werte (arity) bei Aufruf der Funktion genau der Anzahl der für die Funktion definierten Para­meter entsprechen muss. Es ist nicht möglich, Stylesheetfunktionen mit vari­abler Anzahl von Übergabewerten oder optionalen Werten zu deklarieren (etwa durch required="no" – dieses Attribut darf für Funk­tionsparameter nicht verwendet werden). Statt beispielsweise überschüssig übergebene Werte zu verwerfen, würde ein Fehler gemeldet (es sei denn, es existiert eine gleichnamige Funktion mit der passenden Parameterzahl ­– soweit ist ein Überladen von Stylesheetfunktionen nämlich möglich).

Wie oben sichtbar, wird bei der Übergabe der Werte beim Aufruf der Funktion der Parametername nicht benötigt – die Zuordnung erfolgt alleine über die Rei­henfolge in der Argumentklammer. Der Name des Parameters wird lediglich im Inneren der Funktion zur Referenzierung im Funktionsblock benötigt.

Beispiele:

Beispiel 1 – Deklaration eines globalen Parameters mit Defaultwert:

Stylesheet:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="eingabedoc" select="'default.xml'"/>
  <xsl:variable name="docverarbeitung" select="document($eingabedoc)"/>
  <!-- Template-Regeln etc. -->
</xsl:stylesheet>

Erklärung:

Der globale Parameter $eingabedoc besitzt einen Defaultwert 'default.xml' in Form eines URI-Strings (hier nur ein Dateiname). Der Para­meterwert wird in einer folgenden globalen Variable als Argument für die document()-Funktion verwendet, die das entsprechende Dokument in die Ver­arbeitung zieht.

Beim Aufruf des Stylesheets kann ein beliebiger URI an den globalen Parameter übergeben werden, andernfalls wird das Defaultdokument verarbeitet.

Beispiel 2 – Ausgabe eines Copyright-Textes mit Parametern:

Stylesheet:

<xsl:template name="copyright">
  <xsl:param name="verlag" select="'Galileo-Computing'"/>
  <xsl:param name="jahr" select="2004"/>
  <p><xsl:text>Copyright: </xsl:text><xsl:value-of select="$verlag"/><xsl:text>, </xsl:text><xsl:value-of select="$jahr"/><xsl:text>. Alle Rechte vorbehalten.</xsl:text></p>
</xsl:template>

Ausgabe (Default):

<p>Copyright: Galileo-Computing, 2004. Alle Rechte vorbehalten.</p>

Das benannte Template gibt einen Standardtext unter Verwendung der Defaultwerte der lokalen Parameter aus, solange beim Aufruf keine Werte übergeben werden. Alternativ können beim Aufruf Parameterwerte übergeben werden, die die Defaultwerte (wahlweise nur einen davon) überschreiben:

<xsl:call-template name="copyright">
  <xsl:with-param name="jahr" select="'(o.J.)'"/>
  <xsl:with-param name="verlag" select="'Galileo-Design'"/>
</xsl:call-template>

Die Reihenfolge der Wertübergabe ist gleichgültig – hier ist sie absichtlich gegenüber der Template-Regel vertauscht. Die Ausgabe sieht in diesem Fall fol­gendermaßen aus:

<p>Copyright: Galileo-Design, (o.J.). Alle Rechte vorbehalten.</p>

Beispiel 3 -String-Ersetzung in einem Eingabestring:

Stylesheet:

<xsl:template name="substring-ersetzen">
  <!-- Eingabeparameter -->
  <xsl:param name="eingabestring" />
  <xsl:param name="suchstring" />
  <xsl:param name="ersetzungsstring" />
  <xsl:analyze-string regex="{$suchstring}" select="$eingabestring">
    <xsl:matching-substring>
      <xsl:value-of select="$ersetzungsstring"/>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
      <xsl:value-of select="."/>
    </xsl:non-matching-substring>
  </xsl:analyze-string>
</xsl:template>

Diese benannte Template-Regel ersetzt einen in beliebiger Häufigkeit auftreten­den Teilstring ($suchstring) eines Eingabestrings ($eingabestring) durch einen Ersetzungsstring ($ersetzungsstring). Der Eingabestring, der gesuchte String und der Ersetzungsstring werden beim Aufruf des Templates an entspre­chend benannte lokale Parameter übergeben.

Elementdefinition:

XSLT 1.0:

<!-- Category: top-level-element -->
<xsl:param 
     name = qname 
     select = expression>

     <!-- Content: template -->
</xsl:param>

XSLT 2.0:

<!-- Category: declaration -->
<xsl:param
     name = qname
     select? = expression
     as? = sequence-type 
     required? = "yes" | "no"
     tunnel? = "yes" | "no" >

     <!-- Content: sequence-constructor -->
</xsl:param>
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