XSLT in PHP mit Namensräumen

Wenn man ein XML Dokument hat und dieses formatiert und lesbar in HTML anzigen will, kann man ein XSL Stylesheet verwenden, dass man mit XSLT in das gewünschte Zielformat transformieren kann. In PHP geht dies recht einfach mit Bordmitteln:

//XML Datei über URL als String laden
$str_xml =  file_get_contents("http://www.lfu.bayern.de/gdi/dls/umweltbeobachtung.xml");
//XML Inhalt (String) in XML Objekt laden (DOMDocument)
$xml = new DOMDocument();
$xml->loadXML($str_xml);
//Weiteres DOMDocument Objekt für Stylesheet anlegen
$xsl = new DOMDocument();
$xsl->load('stylesheet.xsl');
//XSLT Prozessor erzeugen
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
//XML transformieren
$ergebnis = $proc->transformToXML($xml);
if($ergebnis === false) {
	die('Fehler');
}
print $ergebnis;

Das XML Stylesheet sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:georss="http://www.georss.org/georss" xmlns:inspire_dls="http://inspire.ec.europa.eu/schemas/inspire_dls/1.0" xmlns:a="http://www.w3.org/2005/Atom" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <h1><xsl:value-of select="a:feed/a:title"/></h1>
    <xsl:for-each select="a:feed/a:entry">
      	<h2><xsl:value-of select="a:title"/></h2>
	  <div><xsl:value-of select="a:summary" disable-output-escaping="yes"/></div>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Wichtig: Das XML Dokument hat Namensräume definiert. Dabei ist der folgender Namensraum ohne Prefix definiert und kann somit auch ohne Prefix im XMl_Dokument verwendet werden: xmlns:a=http://www.w3.org/2005/Atom. Dies ist der Default-Namensraum. Wenn man nun das XSL erstellt, mag man schnell in Versuchung geraten den Namensraum ebenfalls als Standard zu definieren und in den XPath Anweisungen kein Präfix anzugeben. Dies funktioniert leider in PHP bei der XSLT Transformation nicht. Der Grund: PHP verwendet die libxslt-Bibliothek und diese unterstützt derzeit kein XSLT 2.0. Hier wäre nämlich die Definition eines Default Namensraumes in XSL möglich.

In XSL Stylesheet habe ich daher ein eigenes Präfix code für den Namensraum vergeben. Somit funktioniert die Transformation.



Als erster einen Kommentar schreiben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.