348 Chapitre 8. XML // Il y a un problème. Affichage du formulaire de saisie // avec les valeurs du tableau $this−>vue−>contenu = "Problème: $message<br/>" . $tbl_film−>formulaire (TableBD::INS_BD, "saisie" , "inserer"); } else { // Insertion , avec la fonction du modèle $tbl_film−>insertion (); // On affiche ce qu’on vient d’insérer $this−>vue−>id_film = $tbl_film−>id ; $this−>vue−>titre = $tbl_film−>titre ; $this−>vue−>annee = $tbl_film−>annee ; $this−>vue−>realisateur = $tbl_film−>nomRealisateur () ; $this−>vue−>fichier_xml = $_FILES [ ’ fichierXML ’ ][ ’name ’ ]; $this−>vue−>setFile ("contenu" , "xml_import . tpl ") ; } } echo $this−>vue−>render ("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 : • les modèles de templates sont remplacés par des règles et autres instructions XSLT ; • au lieu de placer le contenu dans une chaîne de caractères, on le représente de manière structurée dans un document XML. 8.4 Mise en forme de documents avec XSLT 349 Contrairement 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,denom<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 exportésdelabaseFilms (voir par exemple KillBill.xml, page 331) et les transforme en 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 version=" 1.0" encoding="ISO−8859−1"?> <xsl:stylesheet version="1.0 " xmlns:xsl="http: //www.w3. org/1999/XSL/Transform"> <xsl:include href="Film . xsl " /> <xsl:output method="html" encoding="ISO−8859−1"/> 350 Chapitre 8. XML <xsl:template match="/"> <!−− Entête de la page −−> <html> <head> <title>Page produite avec XSLT</ title> <link rel="stylesheet" href="films . css" type="text/ css"/> </ head> <body> <center><h1>Résultat de la mise en forme XSLT</h1></ center> Voici la liste des films , mis au format HTML. <!−− Mise en forme du document XML −−> <xsl:apply−templates /> </ body> </ html> </xsl:template> </ xsl:stylesheet> 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> 8.4 Mise en forme de documents avec XSLT 351 Voici 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>. Comme son nom l’indique, elle inclut un autre programme XSLT, Film.xsl, qui contient une unique autre règle. Exemple 8.19 La règle XSLT pour la présentation d’un film <?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="html" indent="yes"/> <xsl:template match="Film"> <h1><i><xsl:value−of select="titre"/></i></h1> <!−− Genre , pays , et année du film −−> <xsl:value−of select="genre"/>, <i> <xsl:value−of select="code_pays"/></ i>, <xsl:value−of select="annee"/>. <!−− Auteur du film −−> Mis en scène par <b><xsl:value−of select="concat( realisateur /prenom , ’ ’ , realisateur /nom)"/> </b> <h3>Acteurs</h3> <xsl:for−each select="Acteur"> <b><xsl:value−of select="concat(prenom , ’ ’ ,nom)"/></b> : <xsl:value−of select="nom_role"/><br/> </ xsl:for−each> <!−− Résumé du film −−> <h3>Résumé</h3> 352 Chapitre 8. XML <xsl:value−of select="resume" /> </ xsl:template> </ xsl:stylesheet> 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’instruction <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 document intermédiaire Regle1.xml, page 350, appliqué au document source KillBill.xml 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/> . 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,. 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. par des chaînes de caractères PHP construites dynamiquement. La technique XML/XSLT est comparable, avec deux différences notables : • les modèles de templates sont remplacés par des règles et