<texit info> author=E. Bruno title=XML TP3 </texit>
TP3 - Transformation de documents XML avec XSLT et présentation de documents HTML et XML avec CSS
Objectif
L’objectif de ce TP est d’utiliser le langage XSLT pour (1) transformer la structure d’un ensemble de documents XML vers un format pivot, (2) puis de transformer ce format “pivot” vers un ou plusieurs formats applicatifs (XHTML dans un premier temps).
Outils utilisés pour l’application de feuilles XSLT:
- Processeur XSLT : Saxon (http://saxon.sourceforge.net/#F9.4HE)
Transformation pas à pas de XML vers XML
La commande pour appliquer une feuille de style est :
java -cp saxon9he.jar net.sf.saxon.Transform -strip:all -s:sourceDocument.xml -xsl:stylesheet.xsl -o:outputDocument.xml
Un squelette de feuille XSLT est fourni dans le fichier squel.xsl, le compléter pour que l’application de cette feuille de style
au document books.xml
des TP précédents créée un document qui réponde aux exigences suivantes :
- Le document résultat contient un élément racine
Result
qui contient trois élémentsBloc
. - Le premier contient la liste des catégories et de leurs descriptions
- Faire une exception pour la catégorie
C
dont la description est secrète, on affichera alors “catégorie secrète”.
- Le second élément bloc contient les informations qui décrivent le “top author” de la semaine (indiqué dans la variable top-author) dans un élément
topAuthor
- Ajouter un élément fils
Books
contenant un élémentTitle
pour chacun de ses livres. - ajouter un attribut
nbLivres
à l’élémentBooks
dont la valeur est le nombre de ses livres. - Créer un élement
LastBook
qui contient le texte du titre du dernier livre de cet auteur dans le document source. - Ajouter à cet élément un attribut
price
dont la valeur est le prix de ce livre. - Créer un élément
Domain
qui la liste des catégories des livres de cet auteur. - Ajouter un attribut
averageBookPrice
dont la valeur est le prix moyen de ses livres.
- Le troisième élément
Bloc
contient la liste complètes des livres triées par premier auteur et par catégorie dans des éléments
de la forme <Book category='…’><FirstAuthor>…</FirstAuthor><Title></Title></Book>
Avez-vous pensé à utiliser les modes ?
De XML à HTML
Ecrire une feuille XSLT qui transforme le document XML obtenu dans l’exercice précédent en un document XHTML.
Le document XHTML sans instructions de présentation
Un introduction très basique à HTML : http://www.w3.org/TR/html/. Important : Votre document XHTML ne contiendra que des informations liées à la structure logique du document mais aucune instructions de présentation.
La présentation avec une feuille de style CSS
Créer une feuille de style CSS (http://www.w3.org/TR/CSS2/) qui décrit précisément la présentation à associer au document XHTML précédent.
Des éditeurs CSS existent (par exemple bluefish http://bluefish.openoffice.nl/ sous Linux) ou un un mode emacs.
Vous pouvez utiliser comme point de départ la page dédiée du W3C http://www.w3.org/Style/CSS/.
XML+CSS
Il est possible d’écrire une feuille de style qui s’applique directement au document XML précédent (CSS s’applique à HTML et
à XML). ECrivez une feuille de style “simple” pour le document books.xml
XML vers SVG
Ecrire une feuille de style XSLT qui s’applique au document “book.xml” et produit un histogramme illustrant le nombre d’auteur de chaque livre.
Pour aller plus loin
XML vers XSL-FO
La présentation du document pourra être réalisée en utilisant le langage XSLT-FO à la place de XHTML+CSS. Ecrire une feuille XSLT qui transforme le document sortie.xml en XSL-FO. Le document obtenu pour être transformé en pdf avec fop (cf. TP 1).
Une description de XSL-FO pourra être trouvée ici : http://www.w3.org/TR/xsl et un tutoriel ici : http://www.renderx.com/Tests/doc/html/tutorial.html
Exemple de solution
Un autre exemple de feuille de style
- autre.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <Resultat> <Catégories><xsl:apply-templates select=".//Category"/></Catégories> <Livres><xsl:apply-templates select=".//Item"/></Livres> </Resultat> </xsl:template> <xsl:template match="Category"> <Categorie> <Code><xsl:value-of select="@code"/></Code> <Desc><xsl:value-of select="@desc"/></Desc> </Categorie> </xsl:template> <xsl:template match="Item"> <Livre><xsl:apply-templates/></Livre> </xsl:template> <xsl:template match="Title"> <h1><xsl:apply-templates/></h1> </xsl:template> <xsl:template match="Authors"> <div><xsl:apply-templates/></div> </xsl:template> <xsl:template match="Author"> <h2><xsl:apply-templates/></h2> </xsl:template> <xsl:template match="text()"> </xsl:template> <xsl:template match="Title/text()|Author/text()"> <xsl:value-of select="."/> </xsl:template> </xsl:stylesheet>