4.1.8  Stylesheet-Parameter auf der Kommandozeile

Beim XSLT-Call auf die Einsprungdatei (Hauptstylesheet) könnnen auf der Konsole Parameter mitgegeben werden. Diese werden normalerweise im Hauptstylesheet deklariert, können aber auch in Sub-Stylesheets untergebracht werden, wenn diese nur lokal verfügbar sein sollen.
Ein Parameter kann z.B. so aussehen:
<xsl:param name="test-param" required="no" select="'Hallo'"/>
Wenn das Feld @required den Wert yes zugewiesen bekommt, dann darf kein Default-Wert im @select Attribut angegeben werden. (Der Default könnte natürlich auch als PCDATA Inhalt innerhalb der Tags stehen.)
Ein Saxon-Aufruf auf der Kommandozeile, der diesen Parameter bedient, sieht z.B. so aus:
saxon -it:main -o:out.xml testparam="Servus!"

4.1.8.1  XPath als Parameterwert

Jetzt gib es hier aber auch noch einige versteckte Funktionalitäten, bspw. möchte man einen XPath-Ausdruck an das Stylesheet übergeben, der vom Hauptprogramm vllt. unter Zuhilfenahme einer Datenbankabfrage berechnet wird.
Im einfachsten Fall ist so ein XPath ein boolscher Wert true() Dieser wird an das Stylesheet korrekt übergeben, indem der XPath Kennzeichner ? vorangestellt wird, so:
saxon -it:main -o:out.xml ?testparam=true()
Wegen des ? -Prefix versteht Saxon sofort, dass es sich um einen XPath handelt. Ein xsl:choose Statement wie das folgende würde den korrekten Fall liefern:
[...]
<xsl:param name="test-param" required="yes"/>
[...]
<xsl:choose>
    <xsl:when test="$test-param">Gut</xsl:when>
    <xsl:otheriwse>Schlecht</xsl:otheriwse>
</xsl:choose>
[...]
Würde man das Prefix nicht setzen und bspw. dieses Name=Wert Paar senden:
saxon -it:main -o:out.xml testparam=false
So würde auch der gute Zweig ausgeführt, da der Nicht-Leerstring als wahr interpretiert wird, was aber falsch ist.
Typsicher kann man natürlich auch programmieren und an den Parameter noch eine Typendeklaration heften, was die Fehlersuche erleichtert:
<xsl:param name="test-param" required="yes" as="xs:boolean"/>
Um noch ein komplexeres Szenario für einen übergebenen XPath zu zeigen, betrachten wir die folgende Parameterübergabe:
saxon -it:main -o:out.xml ?testparam="//descendant::buch[id=$id-aus-webservice-abfrage]"
Die Shell Variable $id-aus-webservice-abfrage wird bei der Ausfühung des Shell-Skripts mit dem Ergebniswert eines vorangegangenen Webservice-Calls bestückt und an das XSLT Stylesheet übergeben. Dieses arbeitet auf einer Bücher-Liste und formatiert das ausgewählte Buch z.B. als HTML Seite:
<xsl:param name="test-param" required="yes" />

<xsl:template name="main">
    <xsl:apply-templates select="$test-param"/>
</xsl:template>

4.1.8.2  Clark Notation

Bei der Clark Notation ↗↗ kann dem Elementbezeichner mittels geschweifter Klammerung der benötigte Namespace vorangestellt werden. Das sieht z.B. wie folgt aus - wenn man auch gleich noch das ? -Prefix voranstellt:
?{http://www.tekturcms.de/namespaces/mein-namespace}spezieller-verarbeitungs-modus=true()
Im aufgerufenen Stylesheet wird zunächst der Namespace deklariert, dann der Parameter gesetzt und schliesslich die Logik angegeben:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:tk="http://www.tekturcms.de/namespaces/mein-namespace"
    exclude-result-prefixes="xs"
    version="2.0">
    
    <xsl:param name="tk:spezieller-verarbeitungs-modus" select="false()" as="xs:boolean"/>
    
    <xsl:template name="main">
        <xsl:choose>
            <xsl:when test="$tk:spezieller-verarbeitungs-modus">Gut</xsl:when>
            <xsl:otheriwse>Schlecht</xsl:otheriwse>
        </xsl:choose>
    </xsl:template>
    
</xsl:stylesheet>
Diesen Sonderfall braucht man eigentlich nur, wenn man in eine bestehende Transformation einen Parameter einführen will, dessen Bezeichner schon existiert, um so einen Namenskonflikt zu vermeiden - gesehen bspw. bei komplexen Schematron Regeln.
Previous Page Next Page
Version: 93
Jan 25 2021