Abarbeitung der Skriptausführung bei der XSL-Transformation

Da es für PHP kein XSLT Version 2 gibt, haben wir es in Weblication® CMS Core/Grid ermöglicht, direkt in allen Templates PHP auszuführen. Den Unterschied zwischen PHP in wsl:php Bereichen und PHP direkt in XSLT ausgeführt, wird Ihnen anhand von Quelltext-Beispielen in diesem Artikel aufgezeigt. Die Beispiele nutzen zur Veranschaulichung die Funktion, um alle Zeichen eines Texts in Großbuchstaben anzuzeigen.

Wichtig:
Jeglicher PHP-Code in XSL-Stylesheets wird NACH der xsl-Transformation ausgeführt. Daher ist es nicht möglich, einer xsl-Variable einen durch PHP ermittelten Wert zuzuweisen.

Reihenfolge bei der XSLT-Transformation:

  1. wslpre
  2. xsl
    (auch php:functionString und php:function)
  3. wsl bzw. php

Allgemein

Sie haben die Möglichkeit, in jedem beliebigen XSL-Stylesheet von Weblication® eigenen PHP-Code auszuführen. Allerdings darf hierbei nicht die gewöhnliche Notation des PHP-Bereiches verwendet werden, sondern ein dafür verfügbares wsl-Tag:

Funktioniert nicht:

<?php
  echo "test";
?>

Funktioniert:

<wsl:php>
  echo "test";
</wsl:php>
Bitte beachten Sie, dass durch die Verwendung von wsl:php der öffnende und schliessende PHP-Tag automatisch geschrieben wird. Sofern über den PHP-Code HTML-Fragmente definiert werden (Bilder, Formatierungen, etc.), müssen Sie die Ausgabe über CDATA einschliessen.

PHP in wsl:php Bereichen

Sie können an beliebigen Stellen wsl:php Bereiche definieren, in denen Sie wiederum beliebigen PHP-Code einbinden können. Sie können diesen direkt in das Template schreiben oder inkludieren.

Bei dieser Form wird das PHP nach der XSLT-Transformation ausgeführt, was in den meisten Fällen gewünscht ist.

Text über wsl:php in Großbuchstaben umwandeln

<wsl:php>
  print strToUpper('<xsl:value-of select="wd:fragment[@id = 'text']/text()" />');
</wsl:php>

PHP in XSL-Stylesheets ausführen

Das gleiche wie zuvor mit wsl:php umgesetzt, können Sie auch direkt während der XSL-Transformation erledigen. Das funktioniert ganz einfach über php:functionString, indem Sie als ersten Parameter eine PHP-Funktion und deren Parameter wiederum als weitere Parameter angeben. Sie können so entweder auf vordefinierte PHP-Funktionen, CMS Framework-Funktionen oder auch auf eigene Funktionen zurückgreifen.  

Mit dieser eleganten Methode können Sie XSLT beliebig erweitern und haben eine mächtige Template-Sprache ohne Grenzen.

Text in der XSLT-Transformation in Großbuchstaben umwandeln

<xsl:value-of select="php:functionString('strToUpper', wd:fragment[@id = 'text']/text())" />

Wertzuweisung an Variablen über XSL bzw. PHP

In einem weiteren Beispiel wird Ihnen aufgezeigt, wie Sie das Problem lösen, daß Sie XSLT Variablen nicht nachträglich manipulieren können. Dazu umgehen Sie einfach XSLT-Variablen und nutzen statt dessen globale PHP-Variablen, die Sie über php:functionString setzen bzw. auslesen.

Variablen über php:functionString setzen und in einem Attribut auslesen

<xsl:value-of select="php:function('wEnv::setGlobalValue', 'backgroundColor', 'black')"/>
<xsl:if test="position() = 1">
<xsl:value-of select="php:function('wEnv::setGlobalValue', 'backgroundColor', 'red')"/>
</xsl:if>

<div style="background-color:{php:functionString('wEnv::getGlobalValue', 'backgroundColor')}">*</div>

Werte in der Seite setzen und verfügbar machen

Und noch eine interessante Möglichkeit ergibt sich durch php:functionString. Da diese Funktionen bereits während der XSL-Transformation und vor den WSL-Tags ausgeführt werden, können Sie darüber Werte in der Seite setzen, die davor (z.B. im HTML-Kopf) ausgegeben werden.

Werte über php:functionString während der XSL-Transformation setzen und davor über wsl:php ausgeben

...
<title><wsl:php>print wEnv::getGlobalValue('pageTitle');</wsl:php></title>
...
<value-of select="php:function('wEnv::setGlobalValue', 'pageTitle', 'Spezieller Seitentitel')"/>
...

navid als Wert an z.B. eine Liste übergeben

Im nachfolgenden Beispiel wird global über die wMyProject.php die navid auf Grundlage der Navigationsdatei zur aufgerufenen URL ermittelt und steht über die Funktion als Rückgabewert zur Verfügung (linkes Quelltextbeispiel).
In der Liste für die Suchergebnisse der Volltextsuche (search.wFilelist.php) wird der Rückgabewert der Funktion für die URL der Suchergebnisse genutzt, um diesen den navid-Parameter mitzugeben.

navid-Funktion in wMyProject.php definieren:

//*********************************************************************************/
/**
* @method String navid(String $url)
*
* @description Gibt die Navigations-ID zu einer URL in der Navigation zurück
*
* @param url URL
*
* @return String
*
*/
//*********************************************************************************/

public static function navid($url){

$wPathProject = wProjectCur::getPath();
//$url = '';
$navid = wNavigation::getNavId($wPathProject."/wGlobal/content/navigations/standard.wNavigation.php", $url);

return
$navid;

}

navid-Wert in der search.wFilelist.php übergeben:

...
              <xsl:variable name="navid"><xsl:value-of select="php:functionString('wMyProject::navid', $url)" /></xsl:variable>
              <div class="listEntryUrl"><a href="{$url}?navid={$navid}"><xsl:value-of select="$url"/></a></div>
              <!--<div class="listEntryUrl"><a href="{$url}"><xsl:value-of select="$url"/></a></div>-->
...

Abschliessende Beispiele / Gegenüberstellung

Abschließend nochmals eine Gegenüberstellung, um zu verdeutlichen, welche Aufrufe zu einem erfolgreichen Ergebnis führen und welche nicht.
Tipp:
Damit eine einheitliche Vorgehensweise zur optionalen Maskierung von Anführungszeichen verwendet werden kann, nutzen Sie zum Setzen eines PHP-Strings durch XSL am besten ausschließlich doppelte Anführungszeichen ("...").

Wertzuweisung über PHP an eine XSL-Variable funktioniert so nicht:

Beispiel: Über PHP einer xsl-Variablen einen Wert zuweisen (FUNKTIONIERT NICHT)

<xsl:variable name="test"><wsl:php>echo "testWert";</wsl:php></xsl:variable>

<xsl:value-of select="$test"/> <!-- Der Wert von $test bleibt leer -->

Umgekehrt funktioniert die Wertzuweisung (XSL weist einer PHP-Variablen einen Wert zu):

Beispiel: Über XSL einer PHP-Variablen einen Wert zuweisen

<wsl:php>
  $testWert = "<xsl:value-of select="wd:fragment[@id='text']/text()"/>";
  echo $testWert; // gibt den Wert von wd:fragment[@id='text']/text() aus
</wsl:php>

Hinweise

  • Sofern Sie PHP-Variablen projektweit in Ihren Seiten nutzen wollen, definieren Sie diese am besten zentral über die in der BASE hinterlegte wMyProject.php Datei.
  • Vor-/Nachteile wsl:php und php:functionString
    Auf die Performance hat dies grundsätzlich keinen Einfluß.
    Der grundsätzliche Unterschied besteht darin, dass wsl:php nach und php:functionString während der XSL-Transformation ausgeführt wird. Deshalb kann auch die Variable, die über php:functionString (also php) geholt wird anschließend in XSLT genutzt werden.