PHP5 ermöglicht es mittels
XSLTProcessor::registerPHPFunctions innerhalb von XSL-Stylesheets PHP Funktionen zu verwenden. Soweit, so gut...
- Dagegen spricht:
- Die Verwendung von PHP-Funktionen in XSL-Stylesheets ist böse
- Mit der Verwendung von PHP-Funktionen in XSL-Stylesheets sind diese nicht mehr portabel
- ...beliebige weitere (gute!) Gründe die gegen die Verwendung von PHP-Funktionen in XSL-Stylesheets sprechen
- Dafür spricht:
- Die Verwendung von PHP-Funktionen in XSL-Stylesheets ist praktisch ;-)
Mit einem kleinen
Trick ist es aber möglich XSL-Stylesheets zu schreiben, die auch mit "Nicht-PHP-XSLT-Prozessoren" wie z.B.
xsltproc verarbeitet werden können, aber beim Einsatz von
PHP:XSL dennoch die Möglichkeiten der PHP-Funktionen zu nutzen.
Man definiert innerhalb des XSL-Stylesheets einen Parameter, welchen man vor der Verwendung von PHP-Funktionen prüft und per Default eben "was Anderes, nicht PHP-Spezielles" macht.
Bei der Verwendung von PHP als XSLT-Prozessor setzt man den Parameter von aussen (also im PHP) und aktiviert damit die Verwendung der erweiterten PHP-Funktionen.
Ja, ich habe mir die Frage auch gestellt: Warum sollte man überhaupt PHP-Funktionen im XSL verwenden, wenn man jeweils noch eine Fallback-Lösung in "plain-xsl" einbauen muss, die ohne PHP auskommt, dann kann man doch gleich diese verwenden....
Schon richtig, aber solange PHP nicht wichtige Ausgabelogik übernehmen muss/soll, sondern die Ausgabe mit PHP "nur aufgehübscht" wird, finde ich es völlig ok.
Hier eine kleines Beispiel wie das aussehen kann, wenn man z.b. für Software-Doku den PHP-Code mit der PHP eigenen Funktion
highlight_string() in buntem HTML angezeigt bekommen möchte, aber bei der Verwendung von nicht PHP Prozessoren auch darauf verzichten kann.
Beispiel: der PHP-Code
PHP:
<?php
// initialisieren des XSLT Processors
$xslt = new XsltProcessor;
// Optional: registrieren von PHP-Funktions im XSL
$xslt->registerPhpFunctions();
// PHP XSLT Processors als Parameter fuer das XSL setzen um darin die
// optionalen Funktionen zu nutzen.
// PHP braucht das nicht, aber wenn das XSL-Template auch mit anderen
// XSLT-Prozessoren genutzt werden soll, muss vor der Verwendung eine
// Abfrage rein, denn nur PHP kennt die PHP-Funktionen.
$xslt->setParameter('', 'xsltproc', 'php');
// XSL-Stylesheet importieren
$xslt->importStylesheet($xslDom);
// Transformation ausfuehren -> return XML/HTML
$xslt->transformToXML($xmlDom);
?>
Beispiel: ein passender XSL-Stylesheet Schnippsel
CODE:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "xslt10.dtd" >
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl"
exclude-result-prefixes="php"
>
<!--
Mit diesem Parameters koennen die optionalen PHP-Funktionen
"angeschaltet" werden.
Wenn der Wert "php" ist werden diese genutzt, ansonsten eben nicht
-->
<xsl:param name="xsltproc" select="'standard'"/>
<!-- [..] -->
<xsl:template match="code[@class='php']">
<!--
==================================================
PHP Code mit der eigenen PHP Funktion "rendern" lassen und hier
"nur" den fertigen HTML-Code als Inhalt 1:1 einbinden.
ACHTUNG: funktioniert nur mit PHP als XSLT Prozessor!
Wenn das XSL-Template auch mit anderen XSLT-Prozessoren genutzt
werden soll, muss vor der Verwendung eine Abfrage rein, denn
nur PHP kennt die PHP-Funktionen.
D.h. zur Aktivierung der PHP-Funktionen MUSS von aussen (im
PHP-Script der parameter xsltproc=php mit
XSLTProcessor::setParameter gesetzt
werden.
==================================================
-->
<div class="phpcode">
<xsl:choose>
<xsl:when test="$xsltproc='php'">
<xsl:value-of select="php:functionString('highlight_string', string(.), 1)"
disable-output-escaping="yes"/>
</xsl:when>
<xsl:otherwise>
<pre>
<xsl:apply-templates/>
</pre>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- [..] -->
</xsl:stylesheet>
Mein erster Ansatz war, das xsl-Element <xsl:fallback> zu verwenden, aber das kann der PHP-XSLT-Prozessor (oder meine libxsl?) leider nicht, daher ist es ein <xsl:choose> geworden.
Warning: XSLTProcessor::transformToXml(): xsltApplySequenceConstructor: fallback was not compiled in...
Nunja. Alles in Allem ein weiterer Gimmik/Trick den die Welt nicht braucht, der aber manchmal das Leben um Vieles einfacher machen kann ;-)