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