Catégories: XML | XSLT | Langage | Article
Transformations XML avec XSLT et PHP
Un article de ToutProgrammer.com.
En peu de temps, XML est devenu le langage d'échange entre applications. Grâce à des outils comme XSLT, il est capable de se transformer en d'autres langages comme par exemple le HTML pour être compris et affiché par tout navigateur. Cet article propose différentes approches d'utilisation de XSLT avec PHP.
Sommaire |
[modifier] Introduction
[modifier] Qu'est ce que XSLT ?
XSLT est un langage créé pour transformer des documents XML en documents XML, HTML ou texte. XSLT, associé à XPath offre une vaste palette de possibilités pour transformer un document (ou plusieurs) XML dans toute sorte de formats.
Les applications de XSLT sont très nombreuses, par exemple pour transformer des contenus en HTML, WML, RDF ou encore pour analyser des pages Web écrites en XHTML.
XSLT a donc toute sa place dans un environnement Web, puisqu'il peut vous permettre de créer des contenus communs distribués sur plusieurs sites ou plusieurs formats de sorties.
[modifier] Qu'est ce que XML ?
XML est un langage de description utilisant des marqueurs SGML (tout comme HTML). XML est plus strict sur de nombreux points à SGML et s'est imposé depuis sa conception comme une sorte d'espéranto pour les échanges de données à travers les sites Web. XML vous permet de créer votre propre langage à balise, libre à vous, ensuite de trouver les moyens de le rendre lisible par les autres, soit en leur donnant les instructions pour lire vos fichiers (souvent dans une DTD), soit en le transformant dans un format connu de tous (XHTML, RDF, etc.) ; c'est le rôle de XSLT.
Et, plus important que tout, XML vous permet de séparer proprement et définitivement le message et la manière de le transmettre, que ce soit en terme de présentation ou de transport. XML n'est pas seul à savoir faire cela, XML n'a pas inventé l'EDI, XML est juste arrivé au bon moment avec les bonnes idées.
[modifier] XSLT et PHP, un couple heureux
[modifier] Les solutions XSLT
Le premier processeur XSLT est Xt de James Clark qui n'est autre que l'auteur des spécifications XSLT. Ce programme très complet, écrit en Java, a ouvert la voie à d'autres tels que Saxon, Xalan ou encore Sablotron.
Ces outils fonctionnent bien, sont devenus assez rapides et ont dans l'ensemble le même niveau en ce qui concerne le support de la norme XSLT. Nous verrons cependant que certains se détachent vraiment du lot.
[modifier] Les solutions intégrées
PHP a très tôt intégré des solutions de transformation XSLT, via Sablotron, devenue l'interface xslt censée permettre l'usage d'autres processeurs, puis via Domxml et ses extensions XSLT.
Ces solutions présentent l'intérêt d'offrir des fonctions toutes prêtes qu'il suffit d'appeler pour que tout fonctionne bien.
[modifier] L'exécution directe
Certains problèmes en PHP n'ont parfois de solution que dans l'exécution d'un programme en ligne de commande, puis récupération du résultat. Cette façon de procéder que l'on peut juger peu élégante est souvent très efficace pour peu que le programme que l'on appelle ne soit pas trop gourmand en ressource.
Après avoir longtemps travaillé avec Sablotron puis Domxml, je me suis tourné vers l'usage d'autres outils en ligne de commande. Finalement, cela n'a rien de bien gênant, au contraire, nous le verrons plus tard.
[modifier] Comparaison des différents processeurs XSLT
Ce tableau n'a rien d'exhaustif mais est juste l'ensemble de mes conclusions après usage de chacun. Il en manque, je ne les ai pas tous essayé...
| Points forts | Point faibles | |
|---|---|---|
| Sablotron | Simple à installer, repose sur Expat de James Clark, robuste, extension PHP. | Lenteur des transformations, support de XSLT 1.0 incomplet, support des catalogues XML ou SGML inexistant. |
| Domxslt | Très rapide, bon support des standards, support des extensions EXSLT, extension PHP. | Peut provoquer des fuites mémoire, pas de support des catalogues XML ou SGML, comportement étrange avec les modes de sortie. |
| Xalan C++ | Même fiabilité que la version Java, bon respect des standards XSLT 1.0, ajoute un espace avant le /> final d'une balise unique. | Très lent, support compliqué des catalogues XML, la version C++ ne propose pas les extensions de la version Java. |
| Xsltproc | Rapide, support des catalogues XML et SGML aisé, bon respect des standards XSLT 1.0, support des extensions EXSLT. | Comportement étrange avec attributs xmlns dans le document source, support des catalogues XML défaillant sur MS Windows. |
[modifier] Choix d'un processeur XSLT
D'après le tableau vu auparavant, il convient d'écarter Xalan C++ car beaucoup trop lent pour permettre une génération de contenu à la volée. Ensuite le choix se portera sur celui qui vous intéresse le plus en terme de rapidités, en fonction de vos besoins. Par exemple si vous écrivez votre DTD, si vous avez besoin que celle-ci soit intégrée dans vos documents et que vous comptez diffusez vos documents XML, il convient d'utiliser les catalogues XML ou SGML. Donc le choix par défaut sera Xsltproc.
| Note |
|---|
| Un catalogue XML est un fichier XML contenant des informations de correspondance entre un identifiant public et un fichier local. Cela évite de travailler sur une DTD sur via le réseau mais directement sur une copie que vous possédez en local. Pour en savoir plus sur les catalogues XML, consultez les spécifications des catalogues XML. |
Xsltproc est à tout point de vue un des processeurs XSLT les plus intéressant à exploiter. Il est très rapide, supporte les catalogues et les extensions EXSLT.
Comme il est intéressant de voir chaque solution, nous allons voir comment installer et utiliser Sablotron, Domxml et Xsltproc.
[modifier] Installation des processeurs XSLT
[modifier] Sablotron
[modifier] Téléchargement
Sablotron est un logiciel libre écrit par Gingerall. C'est le premier processeur XSLT à avoir été intégré à PHP en tant qu'extension. L'installation de Sablotron vous donnera aussi un processeur en ligne de commande. Vous pourrez en télécharger les sources depuis leur page de téléchargement. Vous y trouverez également des fichiers RPM pour distributions GNU/Linux RedHat ainsi que des binaires pour MS Windows. L'installation est trivial et se passe d'explications supplémentaires. Les heureux possesseurs d'un système GNU/Linux Debian se contenteront de demander l'installation du paquet Sablotron :
# apt-get install sablotron
[modifier] Installation de l'extension PHP
Pour installer l'extension PHP de Sablotron vous pouvez recompiler PHP en activant les options --enable-xslt --with-xslt-sablot dans la ligne ./configure.
Une autre solution consiste à utiliser phpize pour compiler l'extension en tant que module dynamique, vous évitant ainsi la fastidieuse tâche de recompilation de tout PHP. Pour cela il vous suffit de vous rendre dans le répertoire ext/xslt des sources PHP puis d'exécuter les commandes suivantes :
# phpize # ./configure --enable-xslt --with-xslt-sablot # make
Le fichier d'extension se trouvera alors dans le répertoire modules, copiez le dans le répertoire habituel pour vos extensions PHP puis ajouter le à votre fichier php.ini. En voici un exemple :
; [...] ; Emplacement de vos extensions extension_dir = /usr/local/apache/lib/php ; [...] ; chargement de l'extension extension xslt.so
Pour finir, vérifiez avec phpinfo() que Sablotron est bien installé. Nous verrons plus tard comment exploiter Sablotron.
[modifier] Domxml
[modifier] Présentation
Domxml est un extension s'appuyant sur Libxml, une extension créée pour le projet Gnome. Le rôle principal de Domxml est l'accès aux arbres XML pour pouvoir les modifier, en extraire des données, etc. Libxml peut se voir adjoint une librairie de transformation XSLT : Libxslt. Cette librairie est disponible pour Domxml, il suffit de l'activer.
[modifier] Installation
Avant de recompiler PHP (ou de créer un module dynamique), vous devez installer les librairies pour Libxml et Libxslt. Vous trouverez les sources de Libxml et Libxslt sur le site xmlsoft. Si vous possédez une distribution Debian, on passera par Apt :
apt-get install libxml2 libxml2-dev libxslt1 libxslt1-dev
Une fois que vous avez installé tout vos librairies, il ne vous reste plus qu'à compiler PHP (ou le module), avec les options suivantes :
./configure --with-dom=shared --with-dom-xslt=shared --with-dom-exslt=shared
Après la compilation et l'éventuelle intégration du module dans PHP, un phpinfo() indiquera la présence de Domxml.
[modifier] Xsltproc
Xsltproc n'est rien d'autre que le programme servant à tester Libxst, il suffit donc d'installer les mêmes librairies que pour Domxml (les librairies de développement ne sont pas obligatoires), pour avoir Xsltproc (inclus dans Libxslt).
Pour le tester, il vous faudra écrire des fichiers de test, ce que nous allons voir maintenant.
[modifier] Première exploitation de XSLT
[modifier] Documents de test
Pour pouvoir tester nos différents préprocesseurs, nous allons créer deux documents de test très simples, et allons voir comment les transformer avec Sablotron, Domxml et Xsltproc.
[modifier] Source XML
Le premier document que l'on va créer est la source XML. Ce document comportera des marqueurs <b> que nous transformerons en marqueurs <strong>. Voici son code source :
<?xml version="1.0" encoding="ISO-8859-1"?> <doc> <p>Recordari volo transactas foeditates meas, et carnales corruptiones animae <b>meae</b>, non quod eas amem, sed ut amem te, deus meus. amore amoris tui facio istuc, recolens vias meas nequissimas in amaritudine recogitationis meae, ut tu <b>dulcescas</b> mihi, dulcedo non fallax, dulcedo felix et secura, et colligens me a dispersione, in qua frustatim discissus sum, dum ab uno te aversus in multa evanui.</p> <p>Exarsi enim aliquando satiari inferis in adulescentia, et silvescere ausus sum <b>variis</b> et umbrosis amoribus, et contabuit species mea, et conputrui coram oculis tuis, <b>placens</b> mihi et placere cupiens oculis hominum.</p> </doc>
[modifier] Feuille de style XSLT
La feuille de style servant à traiter le document ne présente pas d'intérêt particulier. Elle possède deux paramètres, que nous utiliserons plus tard pour étudier de quelle manière s'effectue le passage de paramètres. Voici son code :
<?xml version="1.0" encoding="ISO-8859-1" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/> <xsl:param name="param.1"/> <xsl:param name="param.2"/> <xsl:template match="/"> <html> <head> <title>Première transformation</title> </head> <body> <p>Paramètre 1 :<xsl:value-of select="$param.1"/><br/> Paramètre 2 :<xsl:value-of select="$param.2"/></p> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="p"> <p><xsl:apply-templates/></p> </xsl:template> <xsl:template match="b"> <strong><xsl:apply-templates/></strong> </xsl:template> </xsl:stylesheet>
[modifier] Transformation attendue
Le document source une fois transformé doit donner ce résultat :
<?xml version="1.0" encoding="ISO-8859-1"?>
<html>
<head>
<title>Première transformation</title>
</head>
<body><p>Paramètre 1 :<br/>
Paramètre 2 :</p>
<p>Recordari volo transactas foeditates meas, et carnales corruptiones
animae <strong>meae</strong>, non quod eas amem, sed ut amem te, deus meus. amore
amoris tui facio istuc, recolens vias meas nequissimas in amaritudine
recogitationis meae, ut tu <strong>dulcescas</strong> mihi, dulcedo non fallax,
dulcedo felix et secura, et colligens me a dispersione, in qua frustatim
discissus sum, dum ab uno te aversus in multa evanui.</p>
<p>Exarsi enim aliquando satiari inferis in adulescentia, et silvescere
ausus sum <strong>variis</strong> et umbrosis amoribus, et contabuit species mea, et
conputrui coram oculis tuis, <strong>placens</strong> mihi et placere cupiens oculis
hominum.</p>
</body>
</html>
Pour réaliser les transformations, créez deux fichiers : test.xml et test.xsl dans lesquels vous mettrez respectivement le contenu de la source XML et de la feuille de style ci-dessus. Ensuite, créez un fichier PHP dans le même répertoire, donnez lui le nom que vous voudrez, pour les besoins de l'exercice, je l'appellerai index.php.
[modifier] Première transformation
[modifier] Transformation avec Xsltproc
Xsltproc est la transformation la plus simple, car elle s'effectue en ligne de commande et retourne le résultat sur la sortie standard.
Voici comment transformer notre fichier depuis la ligne de commande :
$ Xsltproc test.xsl test.xml
C'est trivial vous en conviendrez. Voyons maintenant comment appliquer la transformation depuis un script PHP. Le script suivant, va appeler Xsltproc puis retourner le résultat par un simple echo.
<?php $xsltproc = '/usr/bin/xsltproc'; $cmd = $xsltproc.' test.xsl test.xml 2>&1'; ?>
| Note |
|---|
| L'usage de 2>&1 dans la ligne de commande permet de récupérer les erreurs retournées par Xsltproc. |
[modifier] Transformation avec Sablotron
L'extension XSLT de PHP donne accès à certaines fonctions permettant de transformer les documents ou les chaînes de caractères et d'en extraire le résultat. Voici notre script maintenant modifié pour transformer notre document avec Sablotron :
<?php # Ouverture d'un gestionnaire XSLT $xh = xslt_create(); # Tranformation des documents $res = xslt_process($xh, 'test.xml', 'test.xsl'); # Fermeture du gestionnaire xslt_free($xh); # Affichage echo $res; ?>
[modifier] Transformation avec Domxml
La transformation d'un document XML avec Domxml est tout aussi simple qu'avec les autres processeurs, voici le code source de notre fichier, adapté à Domxml :
<?php # Chargement de la feuille de style $xslt = domxml_xslt_stylesheet_file('test.xsl'); # Chargement du fichier XML $xml = domxml_open_file('test.xml'); # Transformation $html = $xslt->process($xml); # Affichage ?>
[modifier] Transformation avec passage de paramètres
Fort heureusement pour nous, il est possible de passer des paramètres à une feuille de style avant la transformation d'un fichier. Ceci s'avère indispensable pour pouvoir fournir des informations que l'on peut récupérer d'une variable PHP, d'une base de données, etc.
[modifier] Transformation avec Xsltproc
Avec Xsltproc, les paramètres sont passés avec l'argument --param suivit du nom du paramètre et de sa valeur. La valeur sera entourée par des guillemets doubles. Par exemple --param param.1 "'valeur'" ajoutée à la ligne de commande, permettra de passer la chaîne "valeur" comme paramètre nommé "param.1".
| Note |
|---|
| Pour passer une chaîne on l'encadre de guillemets simples, en plus des doubles. |
Voici le premier script modifié pour pouvoir lui passer des paramètres :
<?php $xsltproc = '/usr/bin/xsltproc'; $params = "--param param.1 \"'hello world'\" "; $params .= "--param param.2 \"'bonjour le monde'\" "; $cmd = $xsltproc.' '.$params.' test.xsl test.xml 2>&1'; ?>
[modifier] Transformation avec Sablotron
La transformation XSLT avec passage de paramètres avec Sablotron est plus compliquée à mettre en oeuvre mais a l'avantage de passer par un tableau. Voici le script étendu pour la transformation avec Sablotron :
<?php # Tableau des paramètres 'param.1' => 'hello world', 'param.2' => 'bonjour le monde'); # Ouverture d'un gestionnaire XSLT $xh = xslt_create(); # Tranformation des documents # Fermeture du gestionnaire xslt_free($xh); # Affichage echo $res; ?>
Rien de bien méchant finalement, juste de nouveaux paramètres passés à la fonction xslt_process, dont le tableau contenant les paramètres.
[modifier] Transformation avec Domxml
Avec Domxml, rien de plus simple que de passer des paramètres puisqu'il suffit de passer le tableau de paramètres comme second argument de la fonction process pour que ceux-ci soient passés à la feuille de style. Voici le code :
<?php # Tableau des paramètres 'param.1' => 'hello world', 'param.2' => 'bonjour le monde'); # Chargement de la feuille de style $xslt = domxml_xslt_stylesheet_file('test.xsl'); # Chargement du fichier XML $xml = domxml_open_file('test.xml'); # Transformation $html = $xslt->process($xml,$array_params); # Affichage ?>
[modifier] Documentation XML et XSLT
[modifier] Ressources Internet
Ressources du W3C
Ressources diverses
- XMLfr, espace XML francophone,
- Forum XSLT de Allhtml
[modifier] Ouvrages
- XML: langage et applications de Alain Michard, Édition Eyrolles, ISBN: 2-212-09206-7
- XML Précis et concis de Robert Eckstein et Michel Casabianca, O'Reilly, ISBN: 2-84177-104-0
- Initiation à XML de David Hunter, Wrox Press, ISBN: 2-212-09248-2
- XSLT de Micheal Kay, Campus Press, ISBN: 2-7440-9004-2
- Comprendre XSLT de Bernd Amann et Philippe Rigaux, O'Reilly, ISBN: 2-84177-148-2
[modifier] Historique de l'article
Cet article, réalisé par Olivier MEUNIER, a été publié pour la première fois sur le site NeoKraft puis sur le site ToutProgrammer.com (1ème version) le 19 février 2004.

