Travaux Dirigés n˚4 Encore des transformations XSL
Transcription
Travaux Dirigés n˚4 Encore des transformations XSL
Université de Reims Champagne-Ardenne U.F.R. de Sciences Exactes et Naturelles Licence MI INFO0406 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 " e n c o d i n g="UTF−8" ?> <?xml−s t y l e s h e e t h r e f=" exemple1 . x s l " t y p e=" t e x t / x s l " ?> < l i s t e> < l i v r e> < t i t r e g e n r e=" j e u ">Le Texas Hold ’Em Poker o n l i n e </ t i t r e > <a u t e u r >Mark Stohan </a u t e u r > <a u t e u r >Robert Bluman</a u t e u r > <p a r u t i o n >2006</ p a r u t i o n > </ l i v r e > <l i v r e > < t i t r e g e n r e=" j e u ">Sudoku Manga</ t i t r e > <a u t e u r >Sudoku f a c t o r y </a u t e u r > <p a r u t i o n >2007</ p a r u t i o n > </ l i v r e > <l i v r e > < t i t r e g e n r e=" j e u ">Kakoku</ t i t r e > <a u t e u r >H i z i Kagochi </a u t e u r > <p a r u t i o n >2005</ p a r u t i o n > </ l i v r e > <l i v r e > < t i t r e g e n r e="photo">Manuel de l a photo </ t i t r e > <a u t e u r >J a c k i e C o n t i b o e u f </a u t e u r > <a u t e u r >A l a i n Mocney</a u t e u r > <p a r u t i o n >2006</ p a r u t i o n > </ l i v r e > </ l i s t e > Licence MI INFO0406 Solution : <?xml version=" 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 version=" 1 . 0 " x m l n s : x s l=" h t t p : //www. w3 . o r g /1999/XSL/ Transform "> <x s l : t e m p l a t e match=" / l i s t e "> <html> <head> < t i t l e>E x e r c i c e 1</ t i t l e> </ head> <body> <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=" a u t e u r "> <td><x s l : v a l u e −o f s e l e c t=" . " /></ td> </ x s l : f o r −each> </ t r> </ x s l : f o r −each> </ t a b l e> </ 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> 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. <?xml version=" 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 version=" 1 . 0 " x m l n s : x s l=" h t t p : //www. w3 . o r g /1999/XSL/ Transform "> <x s l : t e m p l a t e match=" / "> <html> <head> < t i t l e>E x e r c i c e 2</ t i t l e> </ head> <body> <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 : 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 /> </ x s l : f o r −each> </ x s l : t e m p l a t e> </ x s l : s t y l e s h e e t> Solution : 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 Licence MI INFO0406 Figure 1 – Application de la feuille de style Figure 2 – Tests conditionnels Solution : <?xml version=" 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 version=" 1 . 0 " x m l n s : x s l=" h t t p : //www. w3 . o r g /1999/XSL/ Transform "> <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=" l i s t e "> <html> <head>< t i t l e>E x e r c i c e 2 . 1</ t i t l e></ head> <body> <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 : 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 > </ x s l : t e m p l a t e> </ x s l : s t y l e s h e e t> 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 Licence MI INFO0406 Figure 3 – Tri alphabétique Solution : <?xml version=" 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 version=" 1 . 0 " x m l n s : x s l=" h t t p : //www. w3 . o r g /1999/XSL/ Transform "> <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=" / "> <html> <head>< t i t l e>E x e r c i c e 2 . 2</ t i t l e></ head> <body> <t a b l e b o r d e r=" 1 "> <x s l : a p p l y −t e m p l a t e s /> </ t a b l e> </ body></ html> </ x s l : t e m p l a t e> <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=" d e s c e n d i n g " data−t y p e="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> </ t r> </ x s l : f o r −each> </ x s l : t e m p l a t e> </ x s l : s t y l e s h e e t> 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 Licence MI INFO0406 Solution : 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. <?xml version=" 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 version=" 1 . 0 " x m l n s : x s l=" h t t p : //www. w3 . o r g /1999/XSL/ Transform "> <x s l : t e m p l a t e match=" / "> <html> <head> < t i t l e>E x e r c i c e 3 . 7</ t i t l e> </ head> <body> <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 : t e m p l a t e match=" / l i s t e "> <t a b l e b o r d e r=" 1 "> <x s l : a p p l y −t e m p l a t e s 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> <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 e m p l a t e s s e l e c t=" t i t r e " /> <x s l : a p p l y −t e m p l a t e s s e l e c t=" p a r u t i o n " /> <x s l : a p p l y −t e m p l a t e s s e l e c t=" a u t e u r " /> </ t r> </ x s l : t e m p l a t e> <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> <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> <x s l : t e m p l a t e match=" a u t e u r "> <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> </ x s l : s t y l e s h e e t> Exercice 4 (Transformation XML vers XML) Considérons le document XML suivant : <?xml version=" 1 . 0 " e n c o d i n g="ISO−8859−1" standalone=" no " ?> <mediatheque> <media t y p e="CD" i d="CTC79"> < t i t r e>London C a l l i n g</ t i t r e> <a u t e u r>The Clash</ a u t e u r> <annee>1979</ annee> </ media> <media t y p e="DVD" i d="DSA01"> < t i t r e>Le s e i g n e u r d e s anneaux − l a communauté de l ’ anneau </ t i t r e > <a u t e u r >P e t e r Jackson </a u t e u r > <annee >2001</annee> </media> <media t y p e=" l i v r e " i d ="LSA54"> < t i t r e >Le s e i g n e u r d e s anneaux − l a communauté de l ’ anneau</ t i t r e> <a u t e u r>J .R.R. T o l k i e n</ a u t e u r> <annee>1954</ annee> </ media> </ mediatheque> 2009/2010 – Travaux Dirigés n˚4 page 5/3 Licence MI INFO0406 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. Solution : <?xml version=" 1 . 0 " e n c o d i n g="UTF−8" ?> < x s l : s t y l e s h e e t version=" 1 . 0 " x m l n s : x s l=" h t t p : //www. w3 . o r g /1999/XSL/ Transform "> <x s l : o u t p u t method="xml" e n c o d i n g="UTF−8" i n d e n t=" y e s " /> <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> <t y p e> <x s l : v a l u e −o f s e l e c t=" . / @type " /> </ t y p e> <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> <a u t e u r> <x s l : v a l u e −o f s e l e c t=" a u t e u r " /> </ a u t e u r> </ media> </ x s l : f o r −each> </ mediatheque> </ x s l : t e m p l a t e> </ x s l : s t y l e s h e e t> 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. Solution : <? php $ x s l D o c = new DOMDocument ( ) ; $ xslDoc−>l o a d ( " m e d i a t e s t x m l . x s l " ) ; $xmlDoc = new DOMDocument ( ) ; $xmlDoc−>l o a d ( " mediatheque . xml" ) ; $ p r o c = new XSLTProcessor ( ) ; $ proc−>i m p o r t S t y l e s h e e t ( $ x s l D o c ) ; $ doc = $ proc−>transformToXML ( $ xmlDoc ) ; $ t o s a v e = new DOMDocument ( ) ; $ t o s a v e −>loadXML ( $ doc ) ; $ t o s a v e −>s a v e ( " 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 Licence MI INFO0406 Solution : 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 Licence MI INFO0406 Solution : Le fichier HTML : <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> <body> <form name=" " a c t i o n=" ex4 . php" method="POST"> c r i t è r e de c h o i x : < s e l e c t name=" c h o i x "> <o p t i o n v a l u e=" . / @type "> l e t y p e </ o p t i o n> <o p t i o n v a l u e=" . / @id "> l ’ i d e n t i f i c a t e u r </o p t i o n > <o p t i o n v a l u e=" t i t r e "> l e t i t r e </o p t i o n > <o p t i o n v a l u e="a u t e u r"> l ’ a u t e u r </ o p t i o n> </ s e l e c t> <i n p u t t y p e=" submit " v a l u e="Go" /> </ form> </ body> </ html> Le fichier XSL : <?xml version=" 1 . 0 " e n c o d i n g="UTF−8" ?> < x s l : s t y l e s h e e t version=" 1 . 0 " x m l n s : x s l=" h t t p : //www. w3 . o r g /1999/XSL/ Transform "> <x s l : t e m p l a t e match=" / mediatheque "> <html> <head> < t i t l e> XSL </ t i t l e> </ head> <body> <t a b l e b o r d e r=" 1 "> <t r> <td> Type </ td> <td> ID </ td> <td> T i t r e </ td> <td> a u t e u r </ td> </ t r> < 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=" a u t e u r " /> </ td> </ t r> </ x s l : f o r −each> </ t a b l e> </ 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> Le fichier PHP : <? php $ c r i t e r e = $_POST[ " c h o i x " ] ; $ x s l D o c = new DOMDocument ( ) ; $ f i c = file_get_contents (" ./ xslex5 . xsl ") ; $ l e x s l = p r e g _ r e p l a c e ( "/−− 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−>l o a d ( " mediatheque . xml" ) ; $ p r o c = new XSLTProcessor ( ) ; $ proc−>i m p o r t S t y l e s h e e t ( $ x s l D o c ) ; $ doc = $ proc−>transformToXML ( $ xmlDoc ) ; echo $ doc ; ?> 2009/2010 – Travaux Dirigés n˚4 page 8/3