Signatur
Beschreibung
Mit setParameter() übergibst du Werte von außen an ein XSLT-Stylesheet. Das Stylesheet muss dafür auf oberster Ebene ein <xsl:param name="..."> deklarieren. Den Parameter kannst du dann im Stylesheet wie jede andere Variable per $name verwenden, etwa zum Filtern, Sortieren oder für Beschriftungen.
Typischerweise lädst du zuerst das Stylesheet mit importStylesheet(), setzt danach einen oder mehrere Parameter und rufst dann transformToFragment() oder transformToDocument() auf. Die Parameter bleiben am Prozessor gesetzt, bis du sie mit removeParameter() entfernst oder clearParameters() bzw. reset() aufrufst. Deshalb lässt sich derselbe Prozessor mit wechselnden Parametern mehrfach verwenden.
Der Parameter wird über ein Paar aus Namensraum-URI und lokalem Namen angesprochen. Bei Parametern ohne Namensraum, dem Normalfall, übergibst du null oder einen leeren String als Namensraum.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $namespaceURI Pflicht | string | null | Namensraum-URI des Parameters. Bei Parametern ohne Namensraum null oder "". |
|
| $localName Pflicht | string | Lokaler Name des Parameters, wie er im name-Attribut von <xsl:param> steht. |
|
| $value Pflicht | string | number | boolean | Node | NodeList | XPathResult | Wert des Parameters. Zeichenketten, Zahlen und Wahrheitswerte funktionieren in allen Browsern. Knoten bzw. Knotenmengen unterstützt vor allem Firefox. |
Rückgabewert
undefined).Beispiele
Einfacher Parameter für eine Überschrift
const xsl = `<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="titel" select="'Standard'"/>
<xsl:template match="/">
<h1><xsl:value-of select="$titel"/></h1>
</xsl:template>
</xsl:stylesheet>`;
const parser = new DOMParser();
const xslDoc = parser.parseFromString(xsl, 'application/xml');
const xmlDoc = parser.parseFromString('<root/>', 'application/xml');
const proc = new XSLTProcessor();
proc.importStylesheet(xslDoc);
proc.setParameter(null, 'titel', 'Produktliste');
const frag = proc.transformToFragment(xmlDoc, document);
console.log(frag.firstChild.textContent);
Produktliste nach Preisgrenze filtern
const xsl = `<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="maxPreis" select="1000"/>
<xsl:template match="/">
<ul>
<xsl:for-each select="produkte/produkt[number(@preis) <= $maxPreis]">
<li><xsl:value-of select="@name"/></li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>`;
const xml = `<produkte>
<produkt name="Maus" preis="25"/>
<produkt name="Monitor" preis="240"/>
<produkt name="Tastatur" preis="60"/>
</produkte>`;
const parser = new DOMParser();
const proc = new XSLTProcessor();
proc.importStylesheet(parser.parseFromString(xsl, 'application/xml'));
const xmlDoc = parser.parseFromString(xml, 'application/xml');
const render = (max) => {
proc.setParameter(null, 'maxPreis', max);
const ul = proc.transformToFragment(xmlDoc, document).firstChild;
return [...ul.children].map((li) => li.textContent);
};
console.log(render(100));
console.log(render(30));
Parameter abfragen und zurücksetzen
const proc = new XSLTProcessor();
proc.setParameter('', 'sprache', 'de');
console.log(proc.getParameter('', 'sprache'));
proc.removeParameter('', 'sprache');
console.log(proc.getParameter('', 'sprache'));
// Wichtig · Fallstricke
- Nur globale Parameter: Die Methode wirkt ausschließlich auf
<xsl:param>direkt unter<xsl:stylesheet>. Parameter innerhalb von Templates bleiben unberührt. - Typen: Ein String wird im Stylesheet als String ausgewertet. Für numerische Vergleiche nutzt du im XPath
number($param)oder übergibst direkt eine Zahl. Knoten als Werte funktionieren nicht in allen Browsern zuverlässig. - Kein Fehler bei Tippfehlern: Existiert kein passender Parameter, wird der Wert stillschweigend ignoriert und im Stylesheet gilt weiter der Standardwert.
- Parameter bleiben bestehen: Gesetzte Werte gelten für alle folgenden Transformationen. Entferne sie bei Bedarf mit
clearParameters(). - Kompatibilität und Zukunft: Browser unterstützen nur XSLT 1.0. Chrome hat angekündigt, XSLT im Browser langfristig zu entfernen. Für neue Projekte ist eine Transformation auf dem Server oder in JavaScript die zukunftssicherere Wahl.
- Sicherheit: Werte aus Benutzereingaben landen zwar als Daten im Stylesheet und nicht als Code. Füge das Ergebnis trotzdem nur als DOM-Fragment ein und nicht über
innerHTML, wenn das Stylesheetdisable-output-escapingverwendet.