8.4 MISE EN FORME DE DOCUMENTS AVEC XSLT Pour conclure cette présentation des possibilités d’utilisation de documents XML en association avec MySQL/PHP, nous montrons comment transformer
Trang 1/ / I l y a un p r o b l è m e A f f i c h a g e du f o r m u l a i r e d e s a i s i e / / a v e c l e s v a l e u r s du t a b l e a u
$ t h i s−>vue−>contenu = " Problème : $message <br / > "
$ t b l _ f i l m−>f o r m u l a i r e ( TableBD : : INS_BD ,
" s a i s i e " , " i n s e r e r " ) ; }
e l s e {
/ / I n s e r t i o n , a v e c l a f o n c t i o n du m o d è l e
$ t b l _ f i l m−>i n s e r t i o n ( ) ; / / On a f f i c h e c e qu ’ on v i e n t d ’ i n s é r e r
$ t h i s−>vue−>i d _ f i l m = $ t b l _ f i l m −>i d ;
$ t h i s−>vue−> t i t r e = $ t b l _ f i l m −> t i t r e ;
$ t h i s−>vue−>annee = $ t b l _ f i l m −>annee ;
$ t h i s−>vue−> r e a l i s a t e u r = $ t b l _ f i l m −>n o m R e a l i s a t e u r ( ) ;
$ t h i s−>vue−>f i c h i e r _ x m l = $_FILES [ ’ fichierXML ’ ] [ ’ name ’ ] ;
$ t h i s−>vue−> s e t F i l e ( " contenu " , " xml_import t p l " ) ;
}
}
echo $ t h i s−>vue−>r e n d e r ( " page " ) ;
}
En résumé, nous avons vu dans cette section comment écrire un module d’analyse
de documents XML simple mais limité, puis comment utiliser des aspects avancés
de la programmation orientée-objet pour obtenir des outils beaucoup plus puis-sants, comprenant une bonne partie de code réutilisable en toutes circonstances
On peut noter que cette programmation permet notamment d’éviter le recours aux variables globales, qui mène rapidement à des scripts difficilement compréhen-sibles
8.4 MISE EN FORME DE DOCUMENTS AVEC XSLT
Pour conclure cette présentation des possibilités d’utilisation de documents XML en association avec MySQL/PHP, nous montrons comment transformer un document obtenu par export d’une base MySQL en un format quelconque avec le langage de transformation XSLT La motivation est la même que celle déjà explorée avec les
templates : on voudrait pouvoir séparer complètement le traitement du contenu, ici obtenu par de la programmation PHP/MySQL, et la présentation de ce contenu Dans
le cas des templates on utilisait des « modèles » HTML comprenant des « entités » et
on remplaçait ensuite, par programmation, ces entités par des chaînes de caractères PHP construites dynamiquement
La technique XML/XSLT est comparable, avec deux différences notables :
XSLT ;
manière structurée dans un document XML
Trang 2Contrairement aux systèmes de templates, des solutions ad hoc dépendantes de
la bonne volonté d’un petit groupe de programmeurs, XSLT est un langage
offi-ciellement promu et défini par le World Wide Web Consortium, conçu pour offrir
toute la puissance nécessaire à la publication de contenus complexes, et offrant incontestablement de solides garanties de pérennité De plus, pour un même type
de document XML, il est possible de définir plusieurs programmes XSLT, chacun correspondant à un format de sortie différent XSLT est une solution à considérer si
on construit un site publiant un même contenu à destination de plusieurs médias
En contrepartie, XSLT est un langage complexe à apprendre et à maîtriser, et qu’avant de s’engager dans une solution technique comprenant des langages aussi différents que HTML, PHP, SQL, XML, XSLT, etc., il faut réfléchir sérieusement à ses avantages et inconvénients
La présentation qui suit a essentiellement pour objectif de vous permettre d’ap-précier les caractéristiques d’une telle solution, à charge pour vous ensuite de faire vos choix en connaissance de cause Il exclu de se lancer ici dans une présentation
du langage XSLT Les quelques exemples présentés se veulent suffisamment intuitifs pour saisir les principes de base
8.4.1 Quelques mots sur XSLT
Un programme XSLT est un document XML, constitué d’un élément racine
<xsl:stylesheet>, comprenant lui-même d’autres éléments parmi lesquels ceux
qui correspondent à des instructions XSLT sont tous préfixés par « xsl: » Les
principaux éléments XSLT sont les règles, de nom <xsl:template>.
Un programme XSLT s’applique à un document source XML en entrée et produit
un document résultat (qui est lui aussi du XML) La production du document résultat
s’appuie sur les règles du programme Intuitivement, le processeur XSLT commence par parcourir le document source, lequel est considéré comme une arborescence de nœuds Pour chaque nœud, le processeur regarde si une des règles du programme XSLT s’applique au nœud Si c’est le cas, un fragment du document résultat décrit dans la règle va être produit L’assemblage de tous les fragments produits au cours de l’exécution d’un programme constitue le document résultat complet
Nous allons présenter un programme XSLT qui s’applique aux documents XML
un document HTML Voici le programme XSLT « principal », avec une seule règle
Exemple 8.17 La règle XSLT pour la production d’une page HTML
< ? xml v e r s i o n = " 1 0 " e n c o d i n g = " ISO−8859−1 " ?>
< x s l : s t y l e s h e e t v e r s i o n = " 1 0 "
x m l n s : x s l = " h t t p : / / www w3 o r g / 1 9 9 9 / XSL / T r a n s f o r m " >
< x s l : i n c l u d e h r e f = " F i l m x s l " / >
< x s l : o u t p u t method= " html "
e n c o d i n g = " ISO−8859−1 " / >
Trang 3< x s l : t e m p l a t e match= " / " >
< !−− E n t ê t e de l a p a g e −−>
<html>
<head>
< t i t l e > P a g e p r o d u i t e a v e c XSLT< / t i t l e >
< l i n k r e l = " s t y l e s h e e t " h r e f = " f i l m s c s s " t y p e = " t e x t / c s s " / >
< / head>
<body>
< c e n t e r ><h1> R é s u l t a t de l a m i s e en f o r m e XSLT< / h1>< / c e n t e r >
V o i c i l a l i s t e d e s f i l m s , m i s au f o r m a t HTML.
< !−− Mise en f o r m e du document XML −−>
< x s l : a p p l y−t e m p l a t e s / >
< / body>
< / html>
< / x s l : t e m p l a t e >
< / x s l : s t y l e s h e e t >
Ce programme est bien un document XML, avec un élément racine
<xsl:stylesheet>, contenant deux instructions <xsl:include>
et <xsl:output> sur lesquelles nous reviendrons plus tard, et une règle
<xsl:template> Le principe d’un tel programme est d’exécuter les instructions
XSLT et de les remplacer par le résultat de cette exécution qui doit être un fragment XML bien formé Quand toutes les instructions ont été traitées, il reste un document XML résultat sans traces d’instructions XSLT Ici le « dialecte » choisi pour la sortie est du (X)HTML
L’attribut match de la règle indique les nœuds du document source pour lesquels elle va être déclenchée La valeur de cet attribut doit être une expression d’un autre langage, XPath, qui permet d’exprimer des chemins dans une arborescence
XML L’expression « / » indique en l’occurrence que la règle s’applique à la racine
du document XML Quand le processeur va rencontrer ce nœud (il s’agit du premier
rencontré), la règle est déclenchée et produit la version intermédiaire suivante du document résultat
Exemple 8.18 Regle1.xml : Résultat intermédiaire après application de la première règle
<html>
<head>
<title>Page produite avec XSLT</title>
<link rel="stylesheet" href="films.css" type="text/css"/>
</head>
<body>
<center><h1>Mise en forme XSLT</h1></center>
Trang 4Voici la liste des films, mis au format HTML.
<! Mise en forme du document XML >
<xsl:apply-templates/>
</body>
</html>
Ce document est déjà un document XML bien formé, mais pas encore un docu-ment HTML Il contient encore une instruction XSLT, <xsl:apply-templates>,
ce qui indique que le traitement n’est pas fini Le processeur XSLT va donc continuer
à parcourir le document source, en cherchant les règles qui s’appliquent à ses nœuds
et en déclenchant les règles appropriées
Dans notre premier programme nous avions une instruction <xsl:include>.
une unique autre règle
Exemple 8.19 La règle XSLT pour la présentation d’un film
< ? xml v e r s i o n = " 1 0 " e n c o d i n g = " i s o−8859−1 " ?>
< x s l : s t y l e s h e e t v e r s i o n = " 1 0 "
x m l n s : x s l = " h t t p : / / www w3 o r g / 1 9 9 9 / XSL / T r a n s f o r m " >
< x s l : o u t p u t method= " html " i n d e n t = " y e s " / >
< x s l : t e m p l a t e match= " F i l m " >
<h1>< i >< x s l : v a l u e−o f s e l e c t =" t i t r e " / >< / i >< / h1>
< !−− Genre , pays , e t a nnée du f i l m −−>
< x s l : v a l u e−o f s e l e c t =" g e nr e " / > ,
< i > < x s l : v a l u e−o f s e l e c t =" c o d e _ p a y s " / >< / i > ,
< x s l : v a l u e−o f s e l e c t =" annee " / >
< !−− Auteur du f i l m −−>
Mis en s c è n e p a r
<b>< x s l : v a l u e−o f
s e l e c t = " c o n c a t ( r e a l i s a t e u r / prenom , ’ ’ , r e a l i s a t e u r / nom ) " / >
< / b>
<h3> A c t e u r s < / h3>
< x s l : f o r−each s e l e c t =" Acteur ">
<b>< x s l : v a l u e−o f s e l e c t =" concat ( prenom , ’ ’ , nom) " / >< / b>
:
< x s l : v a l u e−o f s e l e c t =" nom_role " / ><br / >
< / x s l : f o r−each>
< !−− Résumé du f i l m −−>
<h3>Résumé< / h3>
Trang 5< x s l : v a l u e−o f s e l e c t =" resume " / >
< / x s l : t e m p l a t e >
< / x s l : s t y l e s h e e t >
L’attribut match indique que cette seconde règle se déclenche sur un nœud
<Film> Ce déclenchement produit un fragment qui constitue une représentation
HTML des différentes données constituant le film rencontré La page HTML résultat contiendra, s’il y a trois films, les trois fragments successivement produits par exécu-tion de cette règle Les données sont extraites du document source avec l’instrucexécu-tion
<xsl:value-of> Par exemple :
• <xsl:value-of select="titre"> insère dans le résultat le contenu de l’élément <titre>, fils de l’élément <Film> ;
• <xsl:value-of select="Realisateur/@nom"> insère dans le résultat
la valeur de l’attribut nom de l’élément <Realisateur>, fils de l’élément
<Film> ;
On peut noter que XSLT permet également d’effectuer des boucles sur un
ensemble d’éléments, ici les acteurs, avec l’instruction <for-each> À chaque
fois que le processeur évalue une de ces instructions, elle est remplacée par le fragment XML produit Quand toutes les instructions ont été traitées, on obtient un document HTML
Voici par exemple ce que donne l’exécution de cette seconde règle, à partir du
page 331 On constate que le xsl:apply-templates est remplacé par le fragment XHTML produit :
Exemple 8.20 Regle2.xml : Après application de la deuxième règle
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Page produite avec XSLT</title>
<link rel="stylesheet" href="films.css" type="text/css"/>
</head>
<body>
<center><h1>R´ esultat de la mise en forme XSLT</h1></center>
Voici la liste des films, mis au format HTML.
<h1><i>Kill Bill</i></h1>Drame, <i>USA</i>, 2003.
Mis en sc` ene par <b>Quentin Tarantino</b>.
<h3>Acteurs</h3>
<b>Uma Thurman</b>: La mari´ ee, alias "Black Mamba"<br/>
<b>Lucy Liu</b>: O-Ren Ishii<br/>
<b>David Carradine</b>: Bill<br/>