XSLT côté serveur, HTML côté client
L'exemple est relativement simple mais suffisant pour montrer l'utilité d'un processeur XSLT. Un script PHP combine une feuille XSL et un fichier XML. Le document HTML généré sur le serveur est alors envoyé au navigateur. Cette fois, plus de problème. Plus besoin ainsi d'un navigateur disposant d'un processeur XSLT. Le processeur XSLT est utilisé du côté serveur.
A propos, saviez-vous que de nombreux sites institutionnels, comme le site de TV5, utilisent un traitement XSLT ?
<?php
// (c) janvier 2005 , atelierphp5.com
$fichier_xml = 'thorgal.xml';
$format = isset($_GET['format']) ? $_GET['format'] : '';
switch($format)
{
case 'csv' :
$fichier_xsl = 'format-csv.xsl';
@header("Content-Type: application/csv-tab-delimited-table");
@header("Content-disposition: filename=thorgal.csv");
break;
case 'doc' :
$fichier_xsl = 'format-word.xsl';
@header("Content-type: application/msword");
@header("Content-Disposition: attachment; filename=thorgal.doc");
break;
case 'wap' :
$fichier_xsl = 'format-wml.xsl';
@header("Content-Type: text/vnd.wap.wml");
break;
case 'html' :
$fichier_xsl = 'format-html2.xsl';
$nettoye_le_code_html = true;
@header('Content-Type: text/html;');
@header('Content-Type: text/html;');
break;
default :
$fichier_xsl = 'format-html.xsl';
$nettoye_le_code_html = true;
@header('Content-Type: text/html;');
}
if ( phpversion() <= '5.0.0') die('PHP5 non détecté !');
else #utilisation du processeur DOM-XML
{
if ( !class_exists('XsltProcessor') || !class_exists('DomDocument') )
die('processeur XSLT non disponible');
#chargement du fichier XSL:
$proc_xsl = new DomDocument();
$proc_xsl->load($fichier_xsl);
#chargement du fichier XML:
$proc_xml = new DomDocument();
$proc_xml->load($fichier_xml);
#processeur XSLT:
$xslt = new XsltProcessor();
$xslt->importStylesheet($proc_xsl);
$obj = $xslt->transformToDoc($proc_xml);
$output = $obj->saveXML();
}
@header('Content-Type: text/html;');
echo $output;
?>
Compliquons les choses et recréons un environnement plus réaliste avec : données SQL, gestion de langues, variables dynamiques, etc. A nouveau, les données sont struturées - en mémoire - en XML, puis organisées en XSL. Le processeur XSLT transforme le résultat en document HTML qui est enfin stylisé via une feuille de style CSS. Le PHP ne sert qu'à gérer les entrées/sorties et à mettre en relation les différentes composantes.
<?php
// (c) janvier 2005 , atelierphp5.com
$url= getenv('SCRIPT_NAME');
$base_url = 'http://' . getenv('SERVER_NAME') . substr($url, 0, strrpos($url, '/')) . '/';
$url= 'http://' . getenv('SERVER_NAME'). getenv('SCRIPT_NAME');
$lang_array = array('fr', 'en');
$lang = isset($_REQUEST['lang']) ? $_REQUEST['lang']: '';
if (!in_array($lang, $lang_array)) $lang='fr';
$page = isset($_REQUEST['page']) ? intval($_REQUEST['page']): 0;
$tableau = array();
$tableau['INVENTAIRE']= array();
$link = mysql_connect('localhost', 'root', '');
if (!link) die('connexion mySQL impossible');
mysql_select_db('db_librairie', $link) or die('connexion impossible a la base de donnees');
$result = mysql_query('SELECT COUVERTURE, TITRE, AUTEUR, EDITEUR, PAGES, PRIX from tb_thorgal');
if ( $result )
{
while ( $row = mysql_fetch_assoc($result) ) $tableau['INVENTAIRE'][] = $row;
@mysql_free_result($result);
}
@mysql_close($link);
require('./tools.php');
$machin = new MaClasseQuiFaitDuXml('LIVRE');
$arbre_xml = $machin->MafonctionQuiTransformeUnTableauEnXML('', $tableau);
$arbre_xml .= $machin->MafonctionQuiTransformeUnTableauEnXML('LANGUAGES', $lang_array, 1);
unset($machin);
$arbre_xml = <<<XML
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<DOCUMENT>
$arbre_xml
</DOCUMENT>
XML;$fichier_xsl = 'format-html.xsl';
if ( phpversion() <= '5.0.0') die('PHP5 non détecté !');
else #utilisation du processeur DOM-XML
{
if ( !class_exists('XsltProcessor') || !class_exists('DomDocument') )
die('processeur XSLT non disponible');
#chargement du fichier XSL:
$proc_xsl = new DomDocument();
$proc_xsl->load($fichier_xsl);
#chargement du document XML:
$proc_xml = new DomDocument();
$proc_xml->loadXML($arbre_xml);
#processeur XSLT:
$xslt = new XsltProcessor();
$xslt->importStylesheet($proc_xsl);
$xslt->setParameter(null, 'date', gmdate('d/m/Y H:i:s').' GMT');
$xslt->setParameter(null, 'base_url', $base_url);
$xslt->setParameter(null, 'url', $url);
$xslt->setParameter(null, 'lang', $lang);
$xslt->setParameter(null, 'page', $page);
# Resultat
$obj = $xslt->transformToDoc($proc_xml);
$output = $obj->saveXML();
}
@header('Content-Type: text/html;');
echo $output;
?>
S'il n'y avait pas la complexité du code XSL destiné à simuler une "bête" fonction sprintf(), cette utilisation du XML serait formidable, une excellente alternative à de nombreux système de gabarits comme Smarty, ModeliXe, PHPLib, FastTemplate...
PHPBB a son système de gabarits basé sur PHPLib. IPB a son HTML Logic. De nombreux CMS ont leur système de gabarits. Un système de gabarits est-il envisageable pour phpStudio ? Un système XSLT ? La question est posée...
Commentaires (5)