Signatur
Beschreibung
XSLTProcessor ist eine PHP-Klasse, die XSLT 1.0-Transformationen (Extensible Stylesheet Language Transformations) auf XML-Dokumente anwendet. Sie nutzt intern die libxslt-Bibliothek und arbeitet eng mit den Klassen DOMDocument und SimpleXMLElement zusammen. Typischer Anwendungsfall ist die Umwandlung von XML-Daten in HTML-Seiten, andere XML-Strukturen oder reinen Text.
Der Arbeitsablauf besteht aus drei Schritten: Zunächst wird ein XSLT-Stylesheet in ein DOMDocument geladen und mit importStylesheet() in den Prozessor importiert. Anschließend können über setParameter() optionale Parameter an das Stylesheet übergeben werden. Die eigentliche Transformation erfolgt dann mit transformToDoc(), transformToUri() oder transformToXml().
Ein großer Vorteil von XSLTProcessor ist die strikte Trennung von Daten und Präsentation: Die Geschäftslogik bleibt in PHP und XML, während das XSLT-Stylesheet die Ausgabe vollständig kontrolliert. Dies erleichtert Wartung und Wiederverwendbarkeit erheblich, besonders bei komplexen XML-zu-HTML-Konvertierungen.
PHP-Funktionen können über registerPHPFunctions() in XSLT-Stylesheets verfügbar gemacht werden, was die Flexibilität der Transformation deutlich steigert — jedoch ist hierbei Vorsicht geboten, da dies potenziell sicherheitsrelevante Operationen ermöglicht.
Beispiele
XML mit XSLT in HTML umwandeln
<?php
// XML-Quelldokument
$xmlStr = '<?xml version="1.0" encoding="UTF-8"?>
<personen>
<person>
<name>Anna Müller</name>
<alter>30</alter>
</person>
<person>
<name>Max Schmidt</name>
<alter>25</alter>
</person>
</personen>';
// XSLT-Stylesheet
$xslStr = '<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html><body>
<h1>Personenliste</h1>
<ul>
<xsl:for-each select="personen/person">
<li><xsl:value-of select="name"/> (Alter: <xsl:value-of select="alter"/>)</li>
</xsl:for-each>
</ul>
</body></html>
</xsl:template>
</xsl:stylesheet>';
$xml = new DOMDocument();
$xml->loadXML($xmlStr);
$xsl = new DOMDocument();
$xsl->loadXML($xslStr);
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
$result = $proc->transformToXml($xml);
echo $result;
Parameter an das XSLT-Stylesheet übergeben
<?php
$xmlStr = '<?xml version="1.0"?><daten><wert>Hallo Welt</wert></daten>';
$xslStr = '<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="prefix">INFO</xsl:param>
<xsl:template match="/">
<ausgabe>
<xsl:value-of select="$prefix"/>: <xsl:value-of select="daten/wert"/>
</ausgabe>
</xsl:template>
</xsl:stylesheet>';
$xml = new DOMDocument();
$xml->loadXML($xmlStr);
$xsl = new DOMDocument();
$xsl->loadXML($xslStr);
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
// Parameter setzen (Namespace leer = kein Namespace)
$proc->setParameter('', 'prefix', 'AUSGABE');
echo $proc->transformToXml($xml);
PHP-Funktionen in XSLT verwenden (registerPHPFunctions)
<?php
$xmlStr = '<?xml version="1.0"?><liste><item> Leerzeichen </item><item>GROSSBUCHSTABEN</item></liste>';
$xslStr = '<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl">
<xsl:template match="/">
<ergebnis>
<xsl:for-each select="liste/item">
<zeile><xsl:value-of select="php:function(\'strtolower\', php:function(\'trim\', string(.)))"/></zeile>
</xsl:for-each>
</ergebnis>
</xsl:template>
</xsl:stylesheet>';
$xml = new DOMDocument();
$xml->loadXML($xmlStr);
$xsl = new DOMDocument();
$xsl->loadXML($xslStr);
$proc = new XSLTProcessor();
// Nur explizit erlaubte Funktionen freigeben
$proc->registerPHPFunctions(['trim', 'strtolower']);
$proc->importStylesheet($xsl);
echo $proc->transformToXml($xml);
// Wichtig · Fallstricke
Sicherheit bei registerPHPFunctions(): Wird registerPHPFunctions() ohne Parameter aufgerufen, sind alle PHP-Funktionen im Stylesheet verfügbar — das kann gefährliche Funktionen wie exec(), file_get_contents() oder system() einschließen. Immer explizit eine Whitelist erlaubter Funktionen übergeben: $proc->registerPHPFunctions(['trim', 'strtolower']);
Externe Entitäten (XXE): Beim Laden von XML- oder XSL-Dokumenten sollten externe Entitäten deaktiviert werden, um XXE-Angriffe zu verhindern: libxml_disable_entity_loader(true); (vor PHP 8.0) bzw. die Option LIBXML_NONET beim Laden verwenden.
XSLT-Version: XSLTProcessor unterstützt ausschließlich XSLT 1.0. Für XSLT 2.0 oder 3.0 sind externe Tools (z. B. Saxon via Shell) notwendig.
Voraussetzung: Die PHP-Extension xsl muss aktiviert sein (extension=xsl in der php.ini). Sie ist nicht standardmäßig in allen Umgebungen aktiv.