Université de Reims Champagne-Ardenne U.F.R. de Sciences Exactes et Naturelles Licence MI 2009/2010 Travaux Dirigés n 4 Encore des transformations XSL Exercice 1 (Création d un template) 1 ) À partir du code XML suivant, réaliser avec un seul template un tableau en HTML contenant, pour chaque livre, son titre, son année de parution et ses auteurs dans cet ordre : <?xml version=" 1. 0 " encoding="utf 8"?> <?xml s t y l e s h e e t h r e f=" exemple1. x s l " type=" t e x t / x s l "?> < l i s t e> < l i v r e> < t i t r e genre=" j e u ">Le Texas Hold Em Poker o n l i n e </ t i t r e > <auteur>mark Stohan</auteur> <auteur>robert Bluman</auteur> <parution >2006</ parution > </ l i v r e > <l i v r e > < t i t r e genre="j e u">sudoku Manga</ t i t r e > <auteur>sudoku f a c t o r y </auteur> <parution >2007</ parution > </ l i v r e > <l i v r e > < t i t r e genre="j e u">kakoku</ t i t r e > <auteur>h i z i Kagochi</auteur> <parution >2005</ parution > </ l i v r e > <l i v r e > < t i t r e genre="photo">manuel de l a photo</ t i t r e > <auteur>j a c k i e Contiboeuf </auteur> <auteur>alain Mocney</auteur> <parution >2006</ parution > </ l i v r e > </ l i s t e >
<x s l : t e m p l a t e match="/ l i s t e "> <head> < t i t l e>e x e r c i c e 1</ t i t l e> </ head> <t a b l e> <x s l : f o r each s e l e c t=" l i v r e "> <t r> <td><x s l : v a l u e o f s e l e c t=" t i t r e "/></ td> <td><x s l : v a l u e o f s e l e c t=" p a r u t i o n "/></ td> <x s l : f o r each s e l e c t=" auteur "> </ t a b l e> </ body></ html> <td><x s l : v a l u e o f s e l e c t=". "/></ td> 2 ) Expliquer la raison pour laquelle, à partir de la feuille de style suivante, le résultat obtenu est celui de la figure 1 ci-dessous. <x s l : t e m p l a t e match="/"> <head> < t i t l e>e x e r c i c e 2</ t i t l e> </ head> <x s l : a p p l y t emplates /> </ body> </ html> <x s l : t e m p l a t e match=" t i t r e "> <x s l : f o r each s e l e c t=". "> T i t r e : <x s l : v a l u e o f s e l e c t=". "/><br /> Exercice 2 (Tests, tris, etc.) 1 ) Écrivez une feuille de style XSLT à partir de l exemple de l exercice 1.1 et qui affiche les titres de chaque ouvrage publié à partir de 2006. Le résultat doit avoir l aspect visuel suivant : 2009/2010 Travaux Dirigés n 4 page 2/3
Figure 1 Application de la feuille de style Figure 2 Tests conditionnels <x s l : o u t p u t method=" html " indent=" yes "/> <x s l : t e m p l a t e match=" l i s t e "> <head>< t i t l e>e x e r c i c e <x s l : a p p l y t emplates /> </ body></ html> 2. 1</ t i t l e></ head> <x s l : t e m p l a t e match=" l i v r e "> < x s l : i f t e s t=" p a r u t i o n [. >=2006] "><x s l : v a l u e o f s e l e c t=" t i t r e "/><x s l : t e x t> : Paru en </ x s l : t e x t> <x s l : v a l u e o f s e l e c t=" p a r u t i o n "/> <br /></ x s l : i f> 2 ) Écrivez une feuille de styles qui permet de recapituler dans un tableau toutes les informations figurant dans le XML de l exercice 1.1. Les livres les plus récents doivent apparaître en haut du tableau et chaque titre devra s afficher par ordre alphabétique, conformément à la figure 3 ci-dessous. 2009/2010 Travaux Dirigés n 4 page 3/3
Figure 3 Tri alphabétique <x s l : o u t p u t method=" html " indent=" yes "/> <x s l : t e m p l a t e match="/"> <head>< t i t l e>e x e r c i c e 2. 2</ t i t l e></ head> <t a b l e border="1"> <x s l : a p p l y t emplates /> </ t a b l e> </ body></ html> <x s l : t e m p l a t e match=" l i s t e "> <x s l : f o r each s e l e c t=" l i v r e "> < x s l : s o r t s e l e c t=" p a r u t i o n " o r d e r=" descending " data type="number"/> < x s l : s o r t s e l e c t=" t i t r e "/> <t r><td><x s l : v a l u e o f s e l e c t=" t i t r e "/></ td> <td><x s l : v a l u e o f s e l e c t=" p a r u t i o n "/></ td> Exercice 3 (Bannir le for-each) Produisez le même résultat que le fichier XSLT de l exercice 1.1, sans utiliser l instruction xsl :for-each. 2009/2010 Travaux Dirigés n 4 page 4/3
Comme il et interdit d utiliser for-each, nous devons créer des templates pour chaque titre, auteur et parution, et les appeller avec xsl :apply-templates. <x s l : t e m p l a t e match="/"> <head> < t i t l e>e x e r c i c e 3. 7</ t i t l e> </ head> <x s l : a p p l y t emplates /> </ body></ html> <x s l : t e m p l a t e match="/ l i s t e "> <t a b l e border="1"> <x s l : a p p l y t emplates s e l e c t=" l i v r e "/> </ t a b l e> <x s l : t e m p l a t e match=" l i v r e "> <t r> <x s l : a p p l y t emplates s e l e c t=" t i t r e "/> <x s l : a p p l y t emplates s e l e c t=" p a r u t i o n "/> <x s l : a p p l y t emplates s e l e c t=" auteur "/> <x s l : t e m p l a t e match=" t i t r e "> <td><x s l : v a l u e o f s e l e c t=". "/></ td> <x s l : t e m p l a t e match=" p a r u t i o n "> <td><x s l : v a l u e o f s e l e c t=". "/></ td> <x s l : t e m p l a t e match=" auteur "> <td><x s l : v a l u e o f s e l e c t=". "/></ td> Exercice 4 (Transformation XML vers XML) Considérons le document XML suivant : <?xml version=" 1. 0 " encoding="iso 8859 1" standalone="no"?> <mediatheque> <media type="cd" i d="ctc79"> < t i t r e>london C a l l i n g</ t i t r e> <auteur>the Clash</ auteur> <annee>1979</ annee> </ media> <media type="dvd" i d="dsa01"> < t i t r e>le s e i g n e u r des anneaux l a communauté de l anneau</ t i t r e > <auteur>peter Jackson </auteur> <annee >2001</annee> </media> <media type=" l i v r e " i d="lsa54"> <t i t r e >Le s e i g n e u r des anneaux l a communauté de l anneau</ t i t r e> <auteur>j.r.r. Tolkien</ auteur> <annee>1954</ annee> </ media> </ mediatheque> 2009/2010 Travaux Dirigés n 4 page 5/3
1 ) On souhaite modifier le document XML précédent, plus exactement, on souhaite à l aide d une transformation XSL obtenir un document dans lequel type, id, titre, auteur et annee seront des balises filles de media. <?xml version=" 1. 0 " encoding="utf 8"?> <x s l : o u t p u t method="xml" encoding="utf 8" indent=" yes " /> <x s l : t e m p l a t e match="/ mediatheque "> <mediatheque> <x s l : f o r each s e l e c t="media"> <media> <type> <x s l : v a l u e o f s e l e c t=". / @type"/> </ type> <i d> <x s l : v a l u e o f s e l e c t=". / @id"/> </ i d> < t i t r e> <x s l : v a l u e o f s e l e c t=" t i t r e "/> </ t i t r e> </ mediatheque> </ media> <auteur> <x s l : v a l u e o f s e l e c t=" auteur "/> </ auteur> Exercice 5 (XML avec PHP) 1 ) Dans le cadre d une transformation sur le serveur, donnée le code PHP permettant de réaliser la transformation et de sauvegarder ceci sur le serveur. <?php $ xsldoc = new DOMDocument( ) ; $ xsldoc >load ( " mediatestxml. x s l " ) ; $xmldoc = new DOMDocument( ) ; $xmldoc >load ( " mediatheque. xml" ) ; $ proc = new XSLTProcessor ( ) ; $ proc >i m p o r t S t y l e s h e e t ($ xsldoc ) ; $ doc = $ proc >transformtoxml ( $ xmldoc ) ; $ t o s a v e = new DOMDocument( ) ; $ tosave >loadxml($ doc ) ; $ tosave >save ( " t o t o. xml" ) ;?> Exercice 6 (Vers des transformations dynamiques) Dans le cadre de transformations sur le serveur, on souhaite pouvoir, à partir d un formulaire, choisir le champs selon lequel on va effectuer un tri. Il faudra donc mettre en place la possibilité de modifier le fichier XSL avant d appliquer la transformation. 1 ) En reprenant la transformation de l exercice précédent proposez plusieurs solutions à ce problème 2009/2010 Travaux Dirigés n 4 page 6/3
1. la première solution consiste à faire 2 fichiers pour le XS, et à les concaténer sus la forme de chaîne de caractères, en y incluant au milieu la ligne qui correspond au critère de tri 2. la seconde solution consiste à mettre en place un motif dans le fichier XSL, et à remplacer le motif par la valeur associée au tri, notamment à l aide d expressions régulières 2 ) Proposez l ensemble des fichiers : HTML, PHP et XSL pour chacune des solutions 2009/2010 Travaux Dirigés n 4 page 7/3
Le fichier HTML : <head> < t i t l e> Choix du c r i t è r e de t r i </ t i t l e> </ head> <form name="" a c t i o n=" ex4. php" method="post"> c r i t è r e de choix : <s e l e c t name=" choix "> <option value=". / @type"> l e type </ option> <o ption value=". / @id"> l i d e n t i f i c a t e u r </option> <o ption value=" t i t r e "> l e t i t r e </option> <option value="auteur"> l auteur </ option> </ s e l e c t> <input type=" submit " value="go"/> </ form> </ body> </ html> Le fichier XSL : <?xml version=" 1. 0 " encoding="utf 8"?> <x s l : t e m p l a t e match="/ mediatheque "> <head> < t i t l e> XSL </ t i t l e> </ head> <t a b l e border="1"> <t r> <td> Type </ td> <td> ID </ td> <td> T i t r e </ td> <td> auteur </ td> <x s l : f o r each s e l e c t="media"> < x s l : s o r t s e l e c t=" c r i t e r e "/> <t r> <td> <x s l : v a l u e o f s e l e c t=". / @type"/> </ td> <td> <x s l : v a l u e o f s e l e c t=". / @id"/> </ td> <td> <x s l : v a l u e o f s e l e c t=" t i t r e "/> </ td> <td> <x s l : v a l u e o f s e l e c t=" auteur "/> </ td> </ t a b l e> </ body> </ html> Le fichier PHP : <?php $ c r i t e r e = $_POST[ " choix " ] ;?> $ xsldoc = new DOMDocument( ) ; $ f i c = f i l e _ g e t _ c o n t e n t s ( ". / x s l e x 5. x s l " ) ; $ l e x s l = preg_replace ( "/ c r i t e r e /",$ c r i t e r e, $ f i c ) ; $ xsldoc >loadxml($ l e x s l ) ; $xmldoc = new DOMDocument( ) ; $xmldoc >load ( " mediatheque. xml" ) ; $ proc = new XSLTProcessor ( ) ; $ proc >i m p o r t S t y l e s h e e t ($ xsldoc ) ; $ doc = $ proc >transformtoxml ( $ xmldoc ) ; echo $ doc ; 2009/2010 Travaux Dirigés n 4 page 8/3