validation xml/css - correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/td_xml.pdf · modifiez...

20
06/12/07 22:06 Validation XML/CSS - Correction Page 1 sur 4 http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td1.php ::Enseignements :: Ingénieurs 2000 :: IR3 :: 2007-2008 :: eXtended Markup Language :: Validation XML/CSS - Correction Le but de ce TP est de se familiariser avec les notions d'élément, d'attribut, de DTD et de validation à travers un exemple simple : le système de balisage XHTML. On va créer une page Web écrite en XHTML, et on va la valider en utilisant le validateur officiel du consortium W3C. En même temps, on se propose de soigner la présentation de cette page en utilisant une feuille de style CSS, que l'on validera également par le biais d'un autre validateur W3C. Cahier des charges Il s'agit d'écrire une page Web qui contienne: des paragraphes de texte avec une présentation particulière, des images, un tableau, et un formulaire. La page Web devra être valide par rapport à la DTD "XHTML 1.0 strict". Vous êtes invités à regarder les documents suivant avant de poursuivre le TP : la DTD "XHTML 1.0 strict" un petit guide qui explique comment lire une DTD Exercice 1 - Ecrire et valider Commencez à écrire votre page XHTML. Le préambule qui convient à un document XHTML strict est: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Pour tester le processus de validation de la page, poursuivez avec un document minimal : <html> <p>document minimal</p> </html> Ensuite visitez la page http://validator.w3.org et suivez les instructions : Cliquer sur Parcourir Sélectionner le fichier sur le disque Cliquer sur Check Modifiez votre document en fonction des erreurs signalées et recommencez la procédure jusqu'à ce que votre page soit un document XHTML strict valide. Corrections Le document minimal D'après la DTD, <!ELEMENT html (head, body)>, un élément html doit être composé d'un head suivi d'un body. L'élément head est déclaré comme suit : <!ELEMENT head (%head.misc;, ((title, %head.misc;,(base, %head.misc;)?)|(base, %head.misc;, (title,%head.misc;))))> 06/12/07 22:06 Validation XML/CSS - Correction Page 2 sur 4 http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td1.php A savoir, un %head.misc suivi : 1. soit d'un titre, un %head.misc et éventuellement une base et un %head.misc 2. une base, un %head.misc ainsi qu'un titre et un %head.misc Le %head.misc est une combinaison optionnelle de tout élément de la liste suivante: <!ENTITY % head.misc "(script|style|meta|link|object)*"> Un header minimal est donc composé soit d'un titre, soit d'un titre et une base Exercice 2 - Ajouter des paragraphes de texte Le fichier tp1-ressources.html contient quelques paragraphes de texte. Il faut les inclure dans des paragraphes XHTML et les présenter de la manière suivante à l'aide d'une feuille de style CSS : 1. le texte doit être en jaune sur fond noir. Taille des caractères : 12 points, la composition doit être justifiée des deux cotés avec un retrait de 12 points; 2. Sauf pour le premier paragraphe, qui doit être rouge avec une police monospace et tous les caractères en majuscules; 3. La première lettre de chaque paragraphe doit être d'une taille deux fois superieure à celle des autres lettres qui composent le paragraphe. Testez d'abord votre feuille de style dans un élément style inclus dans la page HTML, ensuite dans un fichier exterieur monstyle.css. Valider la feuille de style en utilisant le validateur officiel CSS Corrections Un peu de style l'attribut type de la balise style est requis ! <!ELEMENT style (#PCDATA)> <!ATTLIST style %i18n; type %ContentType; #REQUIRED media %MediaDesc; #IMPLIED title %Text; #IMPLIED xml:space (preserve) #FIXED 'preserve' > Les textes des paragraphes sont jaunes, justifiés et de taille 12 avec un retrait de 12pt de chaque côté p { color : yellow ; text-align : justify ; background-color : black ; font-size : 12pt ; margin-left : 12pt ; margin-right : 12pt ; } Sauf le premier paragraphe (utilisation de pseudo-formats pour les paragraphes). Les pseudo-formats décrits ici sont conçus pour les éléments HTML typiques, pour les paragraphes et pour les titres. Dans les définitions de format pour les différents pseudo-formats vous pouvez affecter les propriétés CSS appropriées que vous voulez. Les pseudo-formats signifient: :first-line = la première ligne de l'élément reçoit les propriétés CSS

Upload: others

Post on 09-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:06Validation XML/CSS - Correction

Page 1 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td1.php

::Enseignements :: Ingénieurs 2000 :: IR3 :: 2007-2008 :: eXtended Markup Language ::

Validation XML/CSS - Correction

Le but de ce TP est de se familiariser avec les notions d'élément, d'attribut, de DTD et de validation à traversun exemple simple : le système de balisage XHTML. On va créer une page Web écrite en XHTML, et on va lavalider en utilisant le validateur officiel du consortium W3C. En même temps, on se propose de soigner laprésentation de cette page en utilisant une feuille de style CSS, que l'on validera également par le biais d'unautre validateur W3C.

Cahier des charges

Il s'agit d'écrire une page Web qui contienne:

des paragraphes de texte avec une présentation particulière,

des images,

un tableau,

et un formulaire.

La page Web devra être valide par rapport à la DTD "XHTML 1.0 strict". Vous êtes invités à regarder lesdocuments suivant avant de poursuivre le TP :

la DTD "XHTML 1.0 strict"

un petit guide qui explique comment lire une DTD

Exercice 1 - Ecrire et valider

Commencez à écrire votre page XHTML. Le préambule qui convient à un document XHTML strict est:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Pour tester le processus de validation de la page, poursuivez avec un document minimal :

<html> <p>document minimal</p> </html>

Ensuite visitez la page http://validator.w3.org et suivez les instructions :

Cliquer sur Parcourir

Sélectionner le fichier sur le disque

Cliquer sur Check

Modifiez votre document en fonction des erreurs signalées et recommencez la procédure jusqu'à ce que votrepage soit un document XHTML strict valide.

Corrections

Le document minimalD'après la DTD, <!ELEMENT html (head, body)>, un élément html doit être composé d'un headsuivi d'un body.L'élément head est déclaré comme suit :

<!ELEMENT head (%head.misc;,((title, %head.misc;,(base, %head.misc;)?)|(base, %head.misc;, (title,%head.misc;))))>

06/12/07 22:06Validation XML/CSS - Correction

Page 2 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td1.php

A savoir, un %head.misc suivi :

1. soit d'un titre, un %head.misc et éventuellement une base et un %head.misc

2. une base, un %head.misc ainsi qu'un titre et un %head.misc

Le %head.misc est une combinaison optionnelle de tout élément de la liste suivante:

<!ENTITY % head.misc "(script|style|meta|link|object)*">

Un header minimal est donc composé soit d'un titre, soit d'un titre et une base

Exercice 2 - Ajouter des paragraphes de texte

Le fichier tp1-ressources.html contient quelques paragraphes de texte. Il faut les inclure dans desparagraphes XHTML et les présenter de la manière suivante à l'aide d'une feuille de style CSS :

1. le texte doit être en jaune sur fond noir. Taille des caractères : 12 points, la composition doit êtrejustifiée des deux cotés avec un retrait de 12 points;

2. Sauf pour le premier paragraphe, qui doit être rouge avec une police monospace et tous les caractèresen majuscules;

3. La première lettre de chaque paragraphe doit être d'une taille deux fois superieure à celle des autreslettres qui composent le paragraphe.

Testez d'abord votre feuille de style dans un élément style inclus dans la page HTML, ensuite dans un fichierexterieur monstyle.css. Valider la feuille de style en utilisant le validateur officiel CSS

Corrections

Un peu de stylel'attribut type de la balise style est requis !

<!ELEMENT style (#PCDATA)><!ATTLIST style %i18n; type %ContentType; #REQUIRED media %MediaDesc; #IMPLIED title %Text; #IMPLIED xml:space (preserve) #FIXED 'preserve' >

Les textes des paragraphes sont jaunes, justifiés et de taille 12 avec un retrait de 12pt de chaque côté

p { color : yellow ; text-align : justify ; background-color : black ; font-size : 12pt ; margin-left : 12pt ; margin-right : 12pt ;}

Sauf le premier paragraphe (utilisation de pseudo-formats pour les paragraphes). Les pseudo-formatsdécrits ici sont conçus pour les éléments HTML typiques, pour les paragraphes et pour les titres. Dans lesdéfinitions de format pour les différents pseudo-formats vous pouvez affecter les propriétés CSSappropriées que vous voulez. Les pseudo-formats signifient:

:first-line = la première ligne de l'élément reçoit les propriétés CSS

Page 2: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:06Validation XML/CSS - Correction

Page 3 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td1.php

:first-letter = la première lettre du texte reçoit les propriétés CSS

:first-child = le premier élément enfant de l'élément reçoit les propriétés CSS

p:first-child { color: red ; font-family : monospace ; text-transform : uppercase ;}

La première lettre de taille 2 fois supérieure

p:first-letter { font-size : 200% ;}

Exercice 3 - Ajouter des images

Incluez les images elephant.jpg, lion.png, mouseani.gif et sylvester.jpg dans votre document dans unnouveau paragraphe sur fond blanc. Alignez les images en les ordonnant de gauche à droite de l'animal leplus petit jusqu'à l'animal le plus grand et redimensionner ces images afin d'obtenir des proportions plusréalistes. Validez sous XHTML strict.

Corrections

Ajout d'images dans un paragrapheIl n'y a pas de last-child, on doit donc utiliser une classe ou un identifiant perso

<p id="images"><img src="mouseani.gif" height="60" alt='mouse'/><img src="sylvester.jpg" height="160" alt='sylvestre'/><img src="lion.png" height="240" alt='lion'/><img src="elephant.jpg" height="350" alt='elephant'/></p>

/* p.images avec attribut class="images" */p#images { background-color : white ;}

Exercice 4 - Ajouter un tableau

Le fichier tp1-ressources.html contient quelques informations utiles dans un tableau écrit en très mauvaisHTML.Copiez ce tableau et corrigez le pour qu'il soit valide sous XHTML strict. Ensuite, écrivez les règles CSS pourque :

toutes les cellules soient sur fond bleu;

sauf les cellules de la première colonne, qui sont sur fond jaune;

et celles de la première ligne, qui sont sur fond gris.

Validez également la feuille de style.

Corrections

06/12/07 22:06Validation XML/CSS - Correction

Page 4 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td1.php

TableauIl manque les balises fermantes td et tr; d'autre part, en css on a

td{ background-color:blue;}td:first-child { background-color : yellow ;}tr:first-child td{ background-color : lightgray ;}

Exercice 5 - Ajouter un formulaire

Ajouter un formulaire qui permet de lancer une recherche sur Google. Le formulaire devra au moins contenirun champ texte pour recevoir la requette, un bouton pour soumettre le formulaire et deux boutons radio quipermettent de cibler la recherche sur l'ensemble des pages internet ou sur les pages francophonesuniquement. On pourra consulter les sources HTML de la page d'accueil de Google. Valider par rapport à laDTD XHTML strict

Corrections

Recherche googleLors du lancement d'une recherche du mot essai, c'est la page suivante qui est ouverte :http://www.google.fr/search?q=essaiIl suffit donc de faire un formulaire pointant vers http://www.google.fr/search qui passe par laméthode get un paramètre nommé q. Pour ne sélectionner que la langue francaise on doit passer leparamètre lr=lang_fr rien sinon

<form action="http://www.google.fr/search"> <h2> Recherche sur Google</h2><fieldset> <label for="req">rechercher :</label> <input id="req" type="text" name="q" size="41"/>

<input id="all" type="radio" name="meta" value="" checked="checked"/><label for="all"> Web</label> <input id="lgr" type="radio" name="meta" value="lr=lang_fr"/><label for="lgr"> Pages francophones</label> <input type="submit" value="rechercher"/> <fieldset></form>

Références

Les spécifications HTML 4, en français : http://www.la-grange.net/w3c/xhtml1

les spécifications XHTML (il n'y a que les différences entre HTML 4 et XHTML) : http://www.la-grange.net/w3c/xhtml1,

un tutoriel en anglais sur le XHTML : http://www.w3schools.com/xhtml/default.asp,

et sur le CSS : http://www.w3schools.com/css/default.asp

© Université de Marne-la-Vallée

Page 3: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:07Ingrid Bergman - Correction

Page 1 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td2.php

::Enseignements :: Ingénieurs 2000 :: IR3 :: 2007-2008 :: eXtended Markup Language ::

Ingrid Bergman - Correction

Dans ce TP autour de la filmographie d'Ingrid Bergman, nous verrons la conception de DTD et une initiationaux requêtes XPath. L'objectif à plus long terme est d'effectuer la conversion des données XML en XHTML, quenous verrons lors du prochain TP.

Exercice 1 - Corrections

Le fichier minibergman.xml contient un certain nombre d'informations (en format XML) sur l'actrice IngridBergman, informations tirées de la base internationale en ligne du cinema (International Movie Database).Récupérez le fichier et testez à l'aide de la commande suivante s'il est bien formé :

$ xmllint minibergman.xml --noout

Des messages d'erreurs sont alors affichés indiquant la nature et la position des différentes erreurs trouvées.Editez le fichier et corrigez les erreurs reportées pour obtenir un document XML bien formé.

Corrections

Correctionsa) <citation id='c1" auteur="Herself"> -> <citation id="c1" auteur="Herself"> b)</citation> -> </citations>

Exercice 2 - XPath

L'option --shell du programme xmllint permet de naviguer dans l'arborescence du document XML demanière intéractive et d'y effectuer des requettes XPath. Par exemple, en écrivant :

$ xmllint --shell bergman.xml / > cat /filmographie/perso/naissance/@annee

on récupère la valeur de l'attribut annee, de l'unique élément naissance, fils de l'élément perso, lui mêmefils de l'élément filmographie. De même, en écrivant l'instruction :

/ > cat /filmographie/aliases/alias[@filmref='f7']

on récupère trois réponses : les trois éléments alias qui ont f7 pour valeur de leur attribut filmref.Enfin, la commande cd suivi d'une expression XPath, permet de changer la valeur du noeud courant, ce quipermet de tester des expressions XPath relativement à un noeud donné.Expressions XPath sur le fichier bergman.xml

1. Récupérer les années des trois mariages d'Ingrid Bergman.

2. Récupérer sa biographie.

3. Récupérer le titre original du film où elle joue le personnage de Charlotte.

4. Récupérer alors le nom du réalisateur de ce film en utilisant la valeur de l'attribut filmref

5. Récupérer les pays qui correspondent aux titres de films de ce même film.

6. Récupérer les titres originaux des 5 films sortis en salle après 1980.

7. Récupérer les personnages qu'elle joue dans ces 5 films.

8. Récupérer les citations dont elle est à l'origine.

9. Récupérer les dates des titres pour lesquels on a une indication de pays.

10. Récupérer les dates des titres pour lesquels on n'a pas d'indication de pays.

11. Récupérer les noms des réalisateurs de documentaires (c'est-a-dire dont le résumé soit[Documentaire]).

06/12/07 22:07Ingrid Bergman - Correction

Page 2 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td2.php

12. Même question, mais éviter les réalisateurs dont on ne connaît pas le nom, c'est-à-dire ceux où on aun point d'interrogation à la place du nom.

13. Récupérer les titres des films romantiques (les films dont le résumé contient le mot love ouromantic)

Corrections

XPATH

On peut utiliser la fonction text() pour n'afficher que le contenu plutôt que le noeud complet Exercice 1/filmographie/perso/mariages/mariage/@debut195819501937

Exercice 2/filmographie/perso/biographie...

Exercice 3/filmographie/roles/role[@personnage="Charlotte"]Höstsonaten

Exercice 4/filmographie/resumes/resume[@filmref="f7"]/@realisateurIngmar Bergman

Exercice 5/filmographie/aliases/alias[@filmref="f7"]/@paysUSAWest GermanyFrance

Exercice 6/filmographie/roles/role[@date>1980]Orson Welles: The One-Man BandFirst 100 Years: A Celebration of American Movies, TheTheremin: An Electronic OdysseyIngridWoman Called Golda, A

Exercice 7/filmographie/roles/role[@date>1980]/@personnageHerselfHerselfActress in 'Spellbound' ClipHerselfGolda Meir Exercice 8/filmographie/perso/citations/citation[@auteur="Herself"]The best way to keep young...

Exercice 9/filmographie/aliases/alias[@pays]/@date19961979...

Exercice 10/filmographie/aliases/alias[not(@pays)]/@date19701965...

Exercice 11/filmographie/resumes/resume[text()="[Documentaire]"]/@realisateurVassili Silovic

Page 4: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:07Ingrid Bergman - Correction

Page 3 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td2.php

Chuck WorkmanGene FeldmanMarty Pasetta?Marshall Flaum?

Exercice 12/filmographie/resumes/resume[(text()="[Documentaire]")and(not(@realisateur="?"))]/@realisateurVassili SilovicChuck WorkmanGene FeldmanMarty PasettaMarshall Flaum

Exercice 3 - Initiation à XSLT

On va s'initier à la programmation XSLT en écrivant des feuilles de style simples. Le programme xsltprocpermet d'appliquer une feuille de style XSLT sur un document XML. La syntaxe générale de la ligne decommande est la suivante :

$ xsltproc <feuilledestyle.xsl> <document.xml>

Le résultat de la transformation s'affiche alors à l'écran, on peut rediriger la sortie vers un fichier avec l'option-o (comme avec gcc).Recherche d'informations Ecrire une première feuille de style qui extrait les informations contenues dans les éléments role du fichierbergman.xml. La sortie du programme sera un fichier texte dans lequel chaque ligne contiendra le titre,l'année et le nom du personnage interprété pour un film donné, sous la forme :

...Murder on the Orient Express (1974) : GretaSalute to Orson Welles, A (1975) : Herself...

Dans un second temps, on triera l'affichage des lignes du film le plus ancien au film le plus récent.Réorganisation On va écrire une nouvelle feuille de style films.xsl qui à partir du fichier bergman.xml va créer unnouveau document XML qui contiendra les informations contenues dans les éléments role mais organiséesdifféremment.Pour chaque élément role dans bergman.xml, on veut créer un élément film dans le document résultat quicontienne les attributs date et filmref tirés de role et ainsi que deux sous-éléments :

titre, avec pour contenu celui de l'élément role,

et personnage, avec pour contenu le nom du personnage interprété tiré de l'attribut personnage del'élément role.

Ainsi, par exemple l'élément :

<role filmref="f23" personnage="Paula Tessier" date="1961">Goodbye Again</role>

deviendra :

<film filmref="f23" date="1961"> <titre>Goodbye Again</titre> <personnage>Paula Tessier</personnage></film>

Sauver le résultat de la transformation dans un nouveau fichier films.xml avec la commande :

$ xstlproc -o films.xml films.xsl bergman.xml

06/12/07 22:07Ingrid Bergman - Correction

Page 4 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td2.php

Mise en page HTML (si vous avez le temps)On va mettre en page au format HTML les informations contenues dans le nouveau fichier films.xml à l'aided'une nouvelle feuille de style XSLT. Chaque film sera présenté par une paire de cellules d'un tableau, celle degauche contenant le titre et l'année du film et celle de droite contenant le nom du personnage interprété.

Corrections

Recherche d'informations

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" indent="yes"/> <xsl:template match="/"> <xsl:for-each select="roles/role"> <xsl:sort select="@date"/> <xsl:value-of select="."/> ( <xsl:value-of select="@date"/>) : <xsl:value-of select="@personnage"/> <xsl:text>

</xsl:text> </xsl:for-each>

</xsl:template>

</xsl:stylesheet>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <xsl:apply-templates select="//roles/role"> <xsl:sort select="@date"/> </xsl:apply-templates> </xsl:template>

<xsl:template match="role"> <film> <xsl:copy-of select="@date|@filmref"/> <titre>

<xsl:value-of select="."/> </titre>

<personnage>

<xsl:value-of select="@personnage"/> </personnage>

</film>

</xsl:template>

</xsl:stylesheet>

L'utilisation de <xsl:text></xsl:text> est fortement recommandée pour bien gérer le texte non xmlRéorganisationcréation d'attribut:

<!-- Category: instruction --><xsl:attribute name = { qname } namespace = { uri-reference }> <!-- Content: template --></xsl:attribute>

L'élément xsl:attribute peut être utilisé pour ajouter des attributs aux éléments résultats qui sontcréés soit par un élément résultat littéral dans la feuille de style soit par des instructions telles quexsl:element. ici pas besoin d'utiliser xsl:element.

<!--films.xsl-->

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/>

Page 5: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:08Ingrid Bergman et XSLT - Correction

Page 1 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td3.php

::Enseignements :: Ingénieurs 2000 :: IR3 :: 2007-2008 :: eXtended Markup Language ::

Ingrid Bergman et XSLT - Correction

Dans ce TP, toujours autour d'Ingrid Bergman, nous proposons une initiation à XSLT.

Saxon

Les feuilles de style XSLT seront appliquées aux fichiers XML à l'aide de Saxon. Saxon est sous la forme d'unearchive JAR qui se trouve dans /usr/share/java/saxon.jar.Ecrivez le script bash saxon ci-dessous et placez-le dans le répertoire bin de votre répertoire utilisateur.N'oubliez pas de placer ce répertoire dans votre variable d'environnement PATH s'il n'y est pas déjà. N'oubliezpas de donner des permissions d'exécution (chmod 700 saxon, par exemple).

java -cp /usr/share/java/saxon.jar com.icl.saxon.StyleSheet $@

Exercice 1 - Réorganisation

On va réorganiser le document bergman.xml du précédent TP à l'aide d'une feuille de style XSLT, demanière à produire un nouveau document XML, bergman2.xml, qui contiendra les mêmes informations maisde manière mieux organisée. Le nouveau document aura pour élément racine bergman qui lui-mêmecontiendra un élément filmographie qui comprendra un ensemble d'éléments film.Remplacer tout élément role par un élément film qui contient les attributs suivants :

filmref, tiré de role ;

img et pdf, tirés de resume ;

realisateur, tiré de resume ;

date, tiré de role ;

misc, tiré de role ;

personnage, tiré de role,

et les sous-éléments suivants (dans cet ordre) :

titre, avec comme contenu celui de role ;

resume, avec comme contenu celui de resume ;

autant de alias, que nécessaires.

Chaque élément alias conserve son contenu et ses attributs date et pays eventuels. Exemple :

<resumes> ... <resume filmref="f29" img="29.jpg" pdf="29.pdf" realisateur="Jean Renoir"> Polnish countess Elena falls in love to a Frensh radical party's candidate, a general, in pre world war I Paris, but another officer pines for her. </resume> ...</resumes><aliases> ... <alias filmref="f29" date="1956">Elena and Her Men</alias> <alias filmref="f29" date="1956" pays="Italy">Eliana e gli uomini</alias> <alias filmref="f29" date="1956" pays="UK">Paris Does Strange Things</alias> ...</aliases><roles> ... <role filmref="f29" personnage="Elena Sokorowska" date="1956"> Elena et les hommes ...</roles>

devient

<film filmref="f29" img="29.jpg" pdf="29.pdf" realisateur="Jean Renoir" date="1956" personnage="Elena Sokorowska"> <titre>Elena et les hommes</titre> <resume> Polnish countess Elena falls in love to a French radical party's candidate, a general, in pre world war I Paris, but another officer pines for her. </resume> <alias date="1956">Elena and Her Men</alias>

06/12/07 22:08Ingrid Bergman et XSLT - Correction

Page 2 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td3.php

<alias date="1956" pays="Italy">Eliana e gli uomini</alias> <alias date="1956" pays="UK">Paris Does Strange Things</alias> </film>

L' élément perso doit être recopié tel quel.Sauvegardez le résultat de la transformation XSLT précédente dans un fichier bergman2.xml, à l'aide de lacommande :

$ saxon -o bergman2.xml bergman.xml <mafeuilledestyle.xsl>

Corrections

reorg.xsl

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:template match="/"> <filmographie> <xsl:apply-templates select="perso"/> <films>

<xsl:apply-templates select="filmographie/roles"/> </films>

<!--

<xsl:for-each select="filmographie/roles">

<xsl:apply-templates select="role">

<xsl:sort select="@date"/>

</xsl:apply-templates>

</xsl:for-each>

-->

</filmographie>

</xsl:template>

<xsl:template match="roles"> <xsl:apply-templates select="role"> <xsl:sort select="@date"/> </xsl:apply-templates>

</xsl:template>

<xsl:template match="role"> <xsl:element name="film"> <!-- ou

<film>

-->

<xsl:variable name="filmref" select="@filmref"/> <!-- attributs recuperes depuis role -->

<xsl:copy-of select="@filmref"/> <xsl:copy-of select="@date"/> <xsl:copy-of select="@misc"/> <xsl:copy-of select="@personnage"/> <!-- attributs img et pdf et realisateur tirés de resume -->

<xsl:copy-of

select="/filmographie/resumes/resume[@filmref=$filmref]/@img"/> <xsl:copy-of

select="/filmographie/resumes/resume[@filmref=$filmref]/@pdf"/> <xsl:copy-of

select="/filmographie/resumes/resume[@filmref=$filmref]/@realisateur"/> <!-- elements fils de l'element film -->

<titre>

<!--xsl:value-of select="."/-->

<xsl:apply-templates/>

</titre>

<xsl:apply-templates

select="/filmographie/resumes/resume[@filmref=$filmref]"/> <xsl:apply-templates

select="/filmographie/aliases/alias[@filmref=$filmref]"/>

Page 6: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:08Ingrid Bergman et XSLT - Correction

Page 3 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td3.php

</xsl:element> <!-- end of film --> <!--

ou </film>

-->

</xsl:template>

<xsl:template match="resume"> <xsl:element name="resume"> <xsl:apply-templates/>

</xsl:element>

</xsl:template>

<xsl:template match="alias"> <xsl:copy>

<xsl:copy-of select="@date|@pays"/> <xsl:copy-of select="*"/> </xsl:copy>

</xsl:template>

<xsl:template match="perso"> <xsl:copy>

<xsl:copy-of select="@*"/> <xsl:copy-of select="*"/> </xsl:copy>

</xsl:template>

</xsl:stylesheet>

Exercice 2 - Produire du code XHTML

On va écrire une nouvelle feuille de style XSLT (bergman3.xsl) pour convertir ce nouveau document XML enXHTML.Filmographie Chaque film sera présenté comme une paire de cellules d'un tableau, celle de gauchecontenant l'image associée au film et celle de droite contenant les diverses informations. Ces informationsseront presentées de la manière suivante : le titre du film en caractères gras de grande taille, suivi de la dateentre parenthèses ; en dessous, les mots "Réalisé par" suivis du nom du réalisateur ; en dessous, les mots"Personnage interpreté :" suivis du nom du personnage interprété. Suit le résumé, et, à la fin, les aliaséventuels, en italiques, suivis de la date et du pays éventuel entre parenthèses.Les infos personnelles Mettre un titre avant chaque unité (biographie, mariages, infos, citations). Lesentrées de mariage, info, citation, forment des listes (énumerative pour les mariages, non-énumerativesinon). Dans le cas des mariages, on affichera également les dates de début et de fin, dans le cas descitations, leurs auteurs.Génération de la table des matières Pour faciliter la lecture de cette page HTML, on produira une table desmatières de la forme suivante :

Filmographie premier film (date) ... dernier film (date)Informations personnelles Biographie Mariages Divers Citations

où chaque entrée est un lien hypertexte vers la rubrique appropriée. Comme mot-clé commun entre le lien etsa cible, on utilisera soit les valeurs des attributs filmref, soit des mots-clés générés automatiquement parXSLT.

Corrections

Filmographie

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">

<xsl:output method="html" encoding="utf-8" indent="yes" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

<!-- Traitement de la filmographie -->

06/12/07 22:08Ingrid Bergman et XSLT - Correction

Page 4 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td3.php

<xsl:template match="/filmographie">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF8"/> <title>Filmographie d'Ingrid</title> </head>

<style>

h2.titre{text-transform:capitalize;}</style>

<body>

<h1>Filmographie d'I. Bergman</h1><a name="Filmographie"/>

<xsl:call-template name="index"/>

<table border="1"> <xsl:apply-templates select="films"/></table>

<a name="Perso"/><xsl:apply-templates select="perso"/></body>

</html>

</xsl:template>

<xsl:template match="film"> <tr> <td> <xsl:element name="img"> <xsl:attribute name="href"> <xsl:value-of select="@img"/> </xsl:attribute> </xsl:element> </td> <td> <table> <tr><td><a name="{@filmref}"/> <b><span style="font-size:large"> <xsl:value-of select="titre"/> </span></b> (<xsl:value-of select="@date"/>) </td></tr> <tr><td> <b>Réalisé par </b> <xsl:value-of select="@realisateur"/> </td></tr> <tr><td> <b>Personnage interprété : </b> <xsl:value-of select="@personnage"/> </td></tr> <tr><td> <xsl:apply-templates select="resume"/> </td></tr> <xsl:apply-templates select="alias"/> </table> </td></tr>

</xsl:template>

<xsl:template match="resume"> <b>Résumé. </b> <xsl:apply-templates/></xsl:template>

<xsl:template match="alias"> <tr><td> <i> <xsl:apply-templates/> (<xsl:value-of select="@date"/>, <xsl:value-of select="@pays"/>) </i> </td></tr></xsl:template>

<!-- Traitement des infos personnelles -->

<xsl:template match="perso"> <xsl:for-each select="*"> <a name="{generate-id(.)}"/><h2 class="titre"><xsl:value-of select="local-name(.)"/></h2> <xsl:apply-templates select="."/>

Page 7: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:08Ingrid Bergman et XSLT - Correction

Page 5 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td3.php

</xsl:for-each>

</xsl:template>

<xsl:template match="nom"> <xsl:value-of select="."/></xsl:template>

<xsl:template match="naissance"> née le <xsl:value-of select="@jour"/>&#160;<xsl:value-of select="@mois"/>&#160;<xsl:value-of select="@annee"/> à <xsl:value-of select="@lieu"/> </xsl:template>

<xsl:template match="mort"> décédée le <xsl:value-of select="@jour"/>&#160;<xsl:value-of select="@mois"/>&#160;<xsl:value-of select="@annee"/> à <xsl:value-of select="@lieu"/></xsl:template>

<xsl:template match="biographie"> <xsl:copy/>

</xsl:template>

<xsl:template match="mariages"> <ol>

<xsl:for-each select="mariage"> <li><xsl:apply-templates select="."/></li> </xsl:for-each>

</ol>

</xsl:template>

<xsl:template match="mariage">de <xsl:value-of select="@debut"/> à <xsl:value-of select="@fin"/> avec <xsl:value-of select="."/></xsl:template>

<xsl:template match="infos"> <ul>

<xsl:for-each select="info"> <li><xsl:value-of select="."/></li> </xsl:for-each>

</ul>

</xsl:template>

<xsl:template match="citations"> <ul>

<xsl:for-each select="citation"> <li>

[<xsl:value-of select="@auteur"/>] <xsl:value-of select="."/> </li>

</xsl:for-each>

</ul>

</xsl:template>

<!-- Traitement des index -->

<xsl:template name="index"> <a href="#Filmographie">Filmographie</a><br/> <xsl:for-each select="films/film"> &#160;&#160;<a href="#{@filmref}"><xsl:value-of select="titre"/></a><br/> </xsl:for-each>

<a href="#Perso">Informations personnelles</a><br/> <xsl:for-each select="perso/*"> &#160;&#160;<a href="#{generate-id(.)}"><xsl:value-of select="local-name(.)"/></a> <br/>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

© Université de Marne-la-Vallée

Page 8: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Mon curriculum vitae - Correction

Page 1 sur 9http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td4.php

::Enseignements :: Ingénieurs 2000 :: IR3 :: 2007-2008 :: eXtended Markup Language ::

Mon curriculum vitae - Correction

Ce TP aborde l'utilisation pratique des technologies XML/XSLT pour faciliter la maintenance de son curriculumvitae en plusieurs langues.

Cahier des charges

On va mettre en place une suite d'outils XML/XSL d'aide à la maintenance de son curriculum vitae enplusieurs langues. Afin d'éviter de devoir maintenir les différentes traductions (anglais, français,...) etprésentations (HTML, PDF, ...) de son CV dans des fichiers séparés, on propose de structurer et réunir toutesces informations dans un unique fichier XML à partir duquel sera généré les différentes versions à l'aide d'unprogramme XSLT.

Modèle de CV européen

Vous trouverez ci-après des documents issus du site de Europass regroupant des recommandations et desexemples pour le contenu et la mise en page des curriculum vitae au modèle européen.

CVInstructions_fr_FR-1.pdf

CVTemplate_fr_FR.sxw

CVInstructions_en_GB.pdf

CVTemplate_en_GB.sxw

Il faut tout d'abord concevoir un format XML pour la représentation des CV. Le format doit d'une partpermettre de représenter toutes les sections décrites dans la recommandation du modèle européen, etd'autres part permettre de contenir des informations traduites en plusieurs langues.Le fichier betty.xml contient un exemple de CV français/anglais en XML que vous pourrez utiliser commebase pour la suite du TP.

Exercice 1 - Production de code HTML

Il s'agit d'écrire une feuille de style XSLT qui effectue la conversion du CV au format XML vers un documentHTML. Le programme XSLT prendra un paramètre lang qui spécifie la langue dans laquelle le CV doit êtregénéré. D'autre part la mise en page du document produit devra suivre la mise en page du modèle de CVeuropéen.Là encore plusieurs documents sont disponibles pour vous aider :

les versions anglaise betty-en.html et française betty-fr.html du cv de Betty Hobkins qui ont étégénérées automatiquement à partir du document betty.xml par un programme XSLT,

la feuille de style CSS cv.css qui spécifie les paramètres de mise en page,

et le fichier cv-trad.xml qui contient les traductions en anglais et en français des intitulés desdifférentes sections définies dans le modèle de CV européen.

Corrections

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<!-- <xsl:import href="cv-common.xsl"/>

<xsl:param name="headers"/>

<xsl:param name="langcodes"/>

<xsl:param name="css"/>

<xsl:param name="favicon"/>

<xsl:param name="eurologo"/>

<xsl:param name="myphoto"/>

<xsl:variable name="lang" select="document($headers)/ecvheaders/@lang"/>

-->

06/12/07 22:11Mon curriculum vitae - Correction

Page 2 sur 9http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td4.php

<xsl:param name="lang" select="'en'"/> <xsl:variable name="dico" select="'cv-trad.xml'"/> <xsl:variable name="header" select="document($dico)/dico/trad[@lang=$lang]"/>

<xsl:template name="addEmptyRow"> <tr> <td class="header"></td><td class="data"></td> </tr> </xsl:template>

<xsl:template match="cv"> <html lang="{$lang}"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>curriculum vitae</title> <link rel="stylesheet" type="text/css" href="cv.css" /> </head>

<body>

<table> <tr> <td class="title"> curriculum vitae <img id="eurologo" src="images/eurologo.gif" align="right" border="0" alt="European logo"/> </td> <xsl:variable name="photo" select="contact/photo"/> <td class="photo"> <xsl:if test="$photo"> <img id="myphoto" src="{$photo}" align="right" border="1" alt="photo"/> </xsl:if> </td> </tr>

<xsl:apply-templates select="contact"/> <xsl:apply-templates select="works"/> <xsl:apply-templates select="education"/> <xsl:apply-templates select="skills"/> <xsl:apply-templates select="additionnal"/> <!-- <xsl:apply-templates select="annexes[@lang=$lang]"/>

-->

</table> </body> </html> </xsl:template>

<xsl:template match="contact"> <tr> <td class="section"> <xsl:value-of select="$header/contact/title"/> </td> <td class="data"></td> </tr>

<xsl:call-template name="addEmptyRow"/>

<tr> <td class="header"> <xsl:value-of select="$header/contact/name"/> </td> <td class="important"><xsl:value-of select="surname"/><xsl:text>, </xsl:text> <xsl:value-of select="name"/></td> </tr> <xsl:apply-templates select="address"/> <xsl:apply-templates select="phone"/> <xsl:apply-templates select="fax"/> <xsl:apply-templates select="email"/> <xsl:apply-templates select="website"/> <xsl:apply-templates select="nationality[@lang=$lang]"/> <xsl:apply-templates select="birthday"/>

Page 9: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Mon curriculum vitae - Correction

Page 3 sur 9http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td4.php

</xsl:template>

<xsl:template match="address"> <tr> <td class="header"> <xsl:value-of select="$header/contact/address"/> </td> <td class="important"><xsl:value-of select="."/></td> </tr> </xsl:template>

<xsl:template match="phone"> <tr> <td class="header"> <xsl:value-of select="$header/contact/phone"/> </td> <td class="important"><xsl:value-of select="."/></td> </tr> </xsl:template>

<xsl:template match="fax"> <tr> <td class="header"> <xsl:value-of select="$header/contact/fax"/> </td> <td class="important"><xsl:value-of select="."/></td> </tr> </xsl:template>

<xsl:template match="email"> <xsl:variable name="email" select="."/> <tr> <td class="header"> <xsl:value-of select="$header/contact/email"/> </td> <td class="important"> <a href="mailto:{$email}"><xsl:value-of select="."/></a></td> </tr> </xsl:template>

<xsl:template match="website"> <tr> <td class="header"> <xsl:value-of select="$header/contact/website"/> </td> <td class="important"><a href="{.}"><xsl:value-of select="."/></a></td> </tr> </xsl:template>

<xsl:template match="nationality"> <tr> <td class="header"> <xsl:value-of select="$header/contact/nationality"/> </td> <td class="data"><xsl:value-of select="."/></td> </tr> </xsl:template>

<xsl:template match="birthday"> <tr> <td class="header"> <xsl:value-of select="$header/contact/birthday"/> </td> <td class="data"> <xsl:call-template name="date"/> </td> </tr> </xsl:template>

<!-- WORKS SECTION -->

06/12/07 22:11Mon curriculum vitae - Correction

Page 4 sur 9http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td4.php

<xsl:template match="works">

<xsl:call-template name="addEmptyRow"/> <xsl:call-template name="addEmptyRow"/>

<tr> <td class="section"> <xsl:value-of select="$header/work/title"/> </td> <td class="data"><xsl:text> </xsl:text> </td> </tr>

<xsl:apply-templates select="work"/>

</xsl:template>

<xsl:template match="work"> <xsl:call-template name="addEmptyRow"/> <xsl:apply-templates select="dates"/> <xsl:apply-templates select="employer"/> <xsl:apply-templates select="position[@lang=$lang]"/> <xsl:apply-templates select="activities[@lang=$lang]"/> </xsl:template>

<xsl:template match="dates"> <tr> <td class="header"> <ul><li><xsl:value-of select="$header/work/dates"/></li></ul> </td> <td class="data"> <xsl:choose>

<xsl:when test="to"> <xsl:apply-templates select="from"/> <xsl:text> - </xsl:text> <xsl:apply-templates select="to"/> </xsl:when> <xsl:otherwise> <!-- pas de to: current job --> <xsl:value-of select="$header/since"/> <xsl:apply-templates select="from"/> </xsl:otherwise> </xsl:choose> </td> </tr> </xsl:template>

<xsl:template match="from"> <xsl:call-template name="date"> <xsl:with-param name="lang" select="$lang"/> </xsl:call-template> </xsl:template> <xsl:template match="to"> <xsl:call-template name="date"> <xsl:with-param name="lang" select="$lang"/> </xsl:call-template> </xsl:template>

<xsl:template name="date"> <xsl:value-of select="@day"/> <xsl:text> </xsl:text> <xsl:value-of select="$header/months/m[@no=current()/@month]"/> <xsl:text> </xsl:text> <xsl:value-of select="@year"/> </xsl:template>

<xsl:template match="xdates"> <tr> <td class="header">

Page 10: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Mon curriculum vitae - Correction

Page 5 sur 9http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td4.php

<ul> <li><xsl:value-of select="$header/work/dates"/></li> </ul> </td> <td class="data"> <xsl:choose> <xsl:when test="from/@year=to/@year"> <xsl:choose> <xsl:when test="from/@month=to/@month"> <xsl:call-template name="date"> <xsl:with-param name="day" select="from/@day"/> <xsl:with-param name="month" select="''"/> <xsl:with-param name="year" select="''"/> <xsl:with-param name="lang" select="$lang"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:call-template name="date"> <xsl:with-param name="day" select="from/@day"/> <xsl:with-param name="month" select="from/@month"/> <xsl:with-param name="year" select="''"/> <xsl:with-param name="lang" select="$lang"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:call-template name="date"> <xsl:with-param name="day" select="from/@day"/> <xsl:with-param name="month" select="from/@month"/> <xsl:with-param name="year" select="from/@year"/> <xsl:with-param name="lang" select="$lang"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> <xsl:text> - </xsl:text> <xsl:call-template name="date"> <xsl:with-param name="day" select="to/@day"/> <xsl:with-param name="month" select="to/@month"/> <xsl:with-param name="year" select="to/@year"/> <xsl:with-param name="lang" select="$lang"/> </xsl:call-template> </td> </tr> </xsl:template>

<xsl:template match="employer"> <tr> <td class="header"> <ul><li><xsl:value-of select="$header/work/contact"/></li></ul> </td> <td class="data"><xsl:value-of select="name"/>, <xsl:value-of select="address"/></td> </tr> <xsl:apply-templates select="type[@lang=$lang]"/> </xsl:template>

<xsl:template match="employer/type"> <tr> <td class="header"> <ul><li><xsl:value-of select="$header/work/sector"/></li></ul> </td> <td class="data"><xsl:value-of select="."/></td> </tr> </xsl:template>

<xsl:template match="position"> <tr> <td class="header"> <ul><li><xsl:value-of select="$header/work/position"/></li></ul> </td> <td class="data"><xsl:value-of select="."/></td> </tr>

06/12/07 22:11Mon curriculum vitae - Correction

Page 6 sur 9http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td4.php

</xsl:template>

<xsl:template match="activities"> <tr> <td class="header"> <ul><li><xsl:value-of select="$header/work/activities"/></li></ul> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template>

<xsl:template match="list"> <ul><xsl:apply-templates/></ul> </xsl:template>

<xsl:template match="item"> <li><xsl:apply-templates/></li> </xsl:template>

<!-- EDUCATION -->

<xsl:template match="education">

<xsl:call-template name="addEmptyRow"/> <xsl:call-template name="addEmptyRow"/>

<tr> <td class="section"> <xsl:value-of select="$header/education/title"/> </td> <td class="data"></td> </tr>

<xsl:apply-templates select="qualification"/> </xsl:template>

<xsl:template match="qualification">

<xsl:call-template name="addEmptyRow"/>

<xsl:apply-templates select="dates"/> <xsl:apply-templates select="school"/> <xsl:apply-templates select="title[@lang=$lang]|degree[@lang=$lang]"/> <xsl:apply-templates select="subject[@lang=$lang]|subjects[@lang=$lang]"/> <xsl:apply-templates select="note[@lang=$lang]"/> </xsl:template>

<xsl:template match="school"> <tr> <td class="header"> <ul><li><xsl:value-of select="$header/education/school"/></li></ul> </td> <td class="data"> <xsl:value-of select="name"/> <xsl:if test="type[@lang=$lang]"> <xsl:text>, </xsl:text><xsl:value-of select="type[@lang=$lang]"/> </xsl:if> </td> </tr> </xsl:template>

<xsl:template match="subject|subjects"> <tr> <td class="header"> <ul><li><xsl:value-of select="$header/education/subject"/></li></ul> </td> <td class="data"> <xsl:apply-templates/>

Page 11: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Mon curriculum vitae - Correction

Page 7 sur 9http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td4.php

</td> </tr> </xsl:template>

<xsl:template match="title|degree"> <tr> <td class="header"> <ul><li><xsl:value-of select="$header/education/title"/></li></ul> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template>

<xsl:template match="note"> <tr> <td class="header"> <ul><li><xsl:value-of select="$header/education/note"/></li></ul> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template>

<!-- SKILLS -->

<xsl:template match="skills">

<xsl:call-template name="addEmptyRow"/> <xsl:call-template name="addEmptyRow"/>

<tr> <td class="section"> <xsl:value-of select="$header/skills/title"/> </td> <td class="data"> <xsl:text> </xsl:text> </td> </tr>

<xsl:apply-templates select="languages"/> <xsl:apply-templates select="social[@lang=$lang]"/> <xsl:apply-templates select="organisational[@lang=$lang]"/> <xsl:apply-templates select="technical[@lang=$lang]"/> <xsl:apply-templates select="artistic[@lang=$lang]"/> <xsl:apply-templates select="other[@lang=$lang]"/> <xsl:apply-templates select="driving[@lang=$lang]"/> </xsl:template>

<xsl:template match="languages">

<xsl:call-template name="addEmptyRow"/>

<td class="subsection"> <xsl:value-of select="$header/skills/languages"/> </td> <td class="data"> </td>

<xsl:call-template name="addEmptyRow"/>

<xsl:apply-templates select="language"/> </xsl:template>

<xsl:template match="language"> <tr> <td class="header"> <xsl:value-of select="name[@lang=$lang]"/> </td> <td class="data">

06/12/07 22:11Mon curriculum vitae - Correction

Page 8 sur 9http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td4.php

<xsl:value-of select="level[@lang=$lang]"/> </td> </tr> </xsl:template>

<xsl:template match="social"> <xsl:call-template name="addEmptyRow"/> <tr> <td class="subsection"> <xsl:value-of select="$header/skills/social"/> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template>

<xsl:template match="organisational"> <xsl:call-template name="addEmptyRow"/> <tr> <td class="subsection"> <xsl:value-of select="$header/skills/organisational"/> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template>

<xsl:template match="technical"> <xsl:call-template name="addEmptyRow"/> <tr> <td class="subsection"> <xsl:value-of select="$header/skills/technical"/> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template>

<xsl:template match="artistic"> <xsl:call-template name="addEmptyRow"/> <tr> <td class="subsection"> <xsl:value-of select="$header/skills/artistic"/> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template>

<xsl:template match="skills/other"> <xsl:call-template name="addEmptyRow"/> <tr> <td class="subsection"> <xsl:value-of select="$header/skills/other"/> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template>

<xsl:template match="driving"> <xsl:call-template name="addEmptyRow"/> <tr> <td class="subsection"> <xsl:value-of select="$header/skills/driving"/> </td> <td class="data">

Page 12: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Mon curriculum vitae - Correction

Page 9 sur 9http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td4.php

<xsl:apply-templates/> </td> </tr> </xsl:template>

<xsl:template match="additional"> <xsl:call-template name="addEmptyRow"/> <tr> <td class="section"> <xsl:value-of select="$header/additional"/> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template>

<xsl:template match="annexes"> <xsl:call-template name="addEmptyRow"/> <xsl:call-template name="addEmptyRow"/> <tr> <td class="section"> <xsl:value-of select="$header/annexes"/> </td> <td class="data"> <xsl:apply-templates/> </td> </tr> </xsl:template></xsl:stylesheet>

© Université de Marne-la-Vallée

Page 13: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:07Ingrid Bergman - Correction

Page 5 sur 5http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td2.php

<xsl:template match="/"> <xsl:for-each select="//roles/role"> <xsl:sort select="@date"/> <film> <xsl:copy-of select="@date|@filmref"/> <titre>

<xsl:value-of select="."/> </titre>

<personnage>

<xsl:value-of select="@personnage"/> </personnage>

</film>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Mise en page HTML

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="1.0" encoding="UTF8" indent="yes"/> <xsl:template match="/"> <html> <body>

<xsl:apply-templates select="films"/> </body>

</html>

</xsl:template>

<xsl:template match="films"> <table>

<xsl:apply-templates select="film"/> </table>

</xsl:template>

<xsl:template match="film"> <tr>

<td>

<xsl:value-of select="titre"/>( <xsl:value-of select="@date"/>)</td> <td>

<xsl:value-of select="personnage"/> </td>

</tr>

</xsl:template>

</xsl:stylesheet>

© Université de Marne-la-Vallée

Page 14: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:09Récursivité - Correction

Page 1 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td5.php

::Enseignements :: Ingénieurs 2000 :: IR3 :: 2007-2008 :: eXtended Markup Language ::

Récursivité - Correction

Ce TP aborde quelques notions de programmation en XSLT, notamment la récursivité.

Exercice 1 - Agence immobilière

Le fichier maisons.xml contient les descriptions de plusieurs maisons (pièces, décoration, superficie...).Ecrire un programme XSLT qui, à partir de ce fichier XML, calcule pour chaque maison sa superficie totale etqui retrouve la pièce la plus grande. Pour ce faire, le programme comprendra au moins deux modèles detransformation (template) nommés :

total-surface : qui étant donné un ensemble de noeuds nodeset passé en paramètre, calcule etretourne la somme des superficies spécifiées dans les attributs surface des éléments du nodeset;

max-surface : qui prend un ensemble de noeuds nodeset en paramètre et retourne la valeur la plusgrande parmi les attributs surface des éléments de nodeset

La sortie du programme sera un fichier texte qui contient toutes ces informations, sous la forme suivante :

Maison #1:

superficie : 95m2

Plus grande pièce : chambre (28m2)

Maison #2:

superficie : 28m2

Plus grande pièce : salledeBain (15m2)

etc.

Corrections

Solution 1)

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:exsl="http://exslt.org/common"

extension-element-prefixes="exsl"

version="1.0">

<xsl:output method="text" version="1.0" encoding="utf-8" indent="no"/>

<xsl:template name="get-pieces">

<xsl:param name="pieces"/>

<xsl:for-each select="$pieces">

<xsl:choose>

<xsl:when test="@surface">

<piece>

<surf>

<xsl:variable name="x"><xsl:value-of select="substring-before(@surface,'m')"/>

</xsl:variable>

<xsl:value-of select="$x"/>

</surf>

<nom><xsl:value-of select="name()"/></nom>

</piece>

</xsl:when>

</xsl:choose>

</xsl:for-each>

</xsl:template>

<!-- On calcule la somme des surfaces des pieces ($pieces) d'une maison-->

<xsl:template name="total-surface">

<xsl:param name="pieces"/>

<xsl:value-of select="sum(exsl:node-set($pieces)/piece/surf)"/>

</xsl:template>

06/12/07 22:09Récursivité - Correction

Page 2 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td5.php

<xsl:template name="maximum">

<xsl:param name="a"/>

<xsl:param name="b"/>

<xsl:choose>

<xsl:when test="$a > $b">

<xsl:value-of select="$a"/>

</xsl:when>

<xsl:otherwise>

<xsl:value-of select="$b"/>

</xsl:otherwise>

</xsl:choose>

</xsl:template>

<!-- recherche de la piece la plus grande au moyen d'une fonction recursive-->

<xsl:template name="max-surface">

<xsl:param name="pieces"/>

<xsl:param name="pos">0</xsl:param>

<xsl:param name="curr">0</xsl:param>

<xsl:param name="curr-name"></xsl:param>

<xsl:choose>

<xsl:when test="$pieces/piece[$pos]">

<xsl:variable name="x"><xsl:call-template name="maximum">

<xsl:with-param name="a" select="$pieces/piece[$pos]/surf" />

<xsl:with-param name="b" select="$curr" />

</xsl:call-template></xsl:variable>

<xsl:variable name="n">

<xsl:choose>

<xsl:when test="$x > $curr">

<xsl:value-of select="$pieces/piece[$pos]/nom"/>

</xsl:when>

<xsl:otherwise><xsl:value-of select="$curr-name"/></xsl:otherwise>

</xsl:choose>

</xsl:variable>

<xsl:call-template name="max-surface">

<xsl:with-param name="pieces" select="$pieces" />

<xsl:with-param name="pos" select="$pos + 1" />

<xsl:with-param name="curr" select="$x" />

<xsl:with-param name="curr-name" select="$n" />

</xsl:call-template>

</xsl:when>

<!-- cas de base -->

<xsl:otherwise>

<max><xsl:value-of select="$curr"/></max>

<piece><xsl:value-of select="$curr-name"/></piece>

</xsl:otherwise>

</xsl:choose>

</xsl:template>

<xsl:template match="/">

<xsl:apply-templates select="maisons/maison"/>

</xsl:template>

<xsl:template match="maison">

<!-- on recupere une nouvelle arborescence des pieces utiles d'une maison -->

<xsl:variable name="pieces">

<xsl:call-template name="get-pieces">

<xsl:with-param name="pieces" select="*//*[@surface]" />i

</xsl:call-template>

</xsl:variable>

<!-- On calcule la superficie totale de la maison-->

Maison <xsl:value-of select="@id"/>: <xsl:call-template name="total-surface">

<xsl:with-param name="pieces" select="$pieces" />

</xsl:call-template>m2

<!-- On cherche la piece la plus grande-->

<xsl:variable name="max">

<xsl:call-template name="max-surface">

<xsl:with-param name="pieces" select="$pieces" />

</xsl:call-template>

</xsl:variable>

Plus grande surface: <xsl:value-of select="exsl:node-set($max)/piece"/>

Page 15: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:09Récursivité - Correction

Page 3 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td5.php

(<xsl:value-of select="exsl:node-set($max)/max"/>m2)

</xsl:template>

</xsl:stylesheet>

Solution 2)

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" encoding="UTF-8"/>

<xsl:template name="maximum">

<xsl:param name="a"/>

<xsl:param name="b"/>

<xsl:choose>

<xsl:when test="$a < $b">

<xsl:value-of select="$b"/>

</xsl:when>

<xsl:otherwise>

<xsl:value-of select="$a"/>

</xsl:otherwise>

</xsl:choose>

</xsl:template>

<xsl:template name="surface">

<xsl:param name="piece"/>

<xsl:choose>

<xsl:when test="$piece/@surface">

<xsl:value-of select="substring-before($piece/@surface, 'm')"/>

</xsl:when>

<xsl:otherwise>0</xsl:otherwise>

</xsl:choose>

</xsl:template>

<xsl:template name="total-superficie">

<xsl:param name="sum" select="0"/>

<xsl:param name="pieces"/>

<xsl:choose>

<xsl:when test="$pieces">

<xsl:variable name="s">

<xsl:call-template name="surface">

<xsl:with-param name="piece" select="$pieces[1]"/>

</xsl:call-template>

</xsl:variable>

<xsl:call-template name="total-superficie">

<xsl:with-param name="sum" select="$sum + $s"/>

<xsl:with-param name="pieces" select="$pieces[position() > 1]"/>

</xsl:call-template>

</xsl:when>

<xsl:otherwise><xsl:value-of select="$sum"/></xsl:otherwise>

</xsl:choose>

</xsl:template>

<xsl:template name="max-surface">

<xsl:param name="curr">0</xsl:param>

<xsl:param name="left"/>

<!--max = <xsl:value-of select="$curr"/>-->

<xsl:choose>

<xsl:when test="$left">

06/12/07 22:09Récursivité - Correction

Page 4 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td5.php

<!--

max = <xsl:value-of select="$curr"/>

first = <xsl:value-of select="substring-before($left[1]/@surface, 'm')"/>

-->

<xsl:variable name="nmax">

<xsl:call-template name="maximum">

<xsl:with-param name="a" select="$curr"/>

<xsl:with-param name="b" select="substring-before($left[1]/@surface, 'm')"/>

</xsl:call-template>

</xsl:variable>

<!--nmax = <xsl:value-of select="$nmax"/>-->

<xsl:call-template name="max-surface">

<xsl:with-param name="curr" select="$nmax"/>

<xsl:with-param name="left" select="$left[position() > 1]"/>

</xsl:call-template>

</xsl:when>

<xsl:otherwise>

<xsl:value-of select="$curr"/>

</xsl:otherwise>

</xsl:choose>

</xsl:template>

<xsl:template match="maison">

<xsl:variable name="surface">

<xsl:call-template name="total-superficie">

<xsl:with-param name="pieces" select=".//*[@surface]"/>

</xsl:call-template>

</xsl:variable>

<xsl:variable name="surf-max">

<xsl:call-template name="max-surface">

<xsl:with-param name="left" select=".//*[@surface]"/>

</xsl:call-template>

</xsl:variable>

Maison #<xsl:value-of select="@id"/>:

superficie : <xsl:value-of select="$surface"/>m2

Plus grande pièce :

<xsl:value-of select="local-name(.//*[@surface=concat($surf-max, 'm2')])"/>

(<xsl:value-of select="$surf-max"/>m2)

</xsl:template>

</xsl:stylesheet>

© Université de Marne-la-Vallée

Page 16: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Révisions - Examen du 4 novembre 2005 - Correction

Page 1 sur 6http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/tdrevision.php

::Enseignements :: Ingénieurs 2000 :: IR3 :: 2007-2008 :: eXtended Markup Language ::

Révisions - Examen du 4 novembre 2005 - Correction

Ce TP peut servir de base de révisions pour l'examen final. Tous les documents furent autorisés.

Cahier des charges

On donne 4 fichiers :

plant_catalog.xml, un catalogue de plantes ;

plant_catalog.css, une feuille de style CSS pour la visualisation de ce catalogue ;

plant_families.xml, qui indique à quelle famille appartiennent certaines plantes ;

plant_order.xml, une commande de plantes.

On demande d’écrire 5 programmes XSLT et de les exécuter.

Exercice 1 - Insérer une instruction de traitement

Faire un programme XSLT qui s'applique à plant_catalog.xml et produit plant_catalog_css.xml. Leprogramme XSLT doit insérer l'instruction de traitement

<?xml-stylesheet type= "text/css" href="plant_catalog.css" ?>

qui appelle la feuille de style CSS.

Corrections

<?xml version="1.0" encoding="ISO-8859-1"?><!-- instr_trait.xsl --><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/> <xsl:strip-space elements="*"/>

<xsl:template match="CATALOG"> <xsl:text></xsl:text> <xsl:processing-instruction name="xml-stylesheet"> <xsl:text>type= "text/css" href="plant_catalog.css"</xsl:text> </xsl:processing-instruction> <xsl:copy-of select="."/> </xsl:template>

</xsl:stylesheet>

Exercice 2 - Ajouter une information extraite d’un document extérieur

Faire un programme XSLT qui s'applique à plant_catalog.xml et produit plant_catalog_family.xml.Le programme XSLT doit ajouter dans chaque élément PLANT un élément FAMILY qui donne le nom de lafamille à laquelle appartient la plante. Exemple :

06/12/07 22:11Révisions - Examen du 4 novembre 2005 - Correction

Page 2 sur 6http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/tdrevision.php

<PLANT> <COMMON>Bloodroot</COMMON> <BOTANICAL>Sanguinaria canadensis</BOTANICAL> <ZONE>4</ZONE> <LIGHT>Mostly Shady</LIGHT> <PRICE>$2.44</PRICE> <AVAILABILITY>031599</AVAILABILITY> <FAMILY>Papaveraceae</FAMILY> </PLANT>

Les familles sont indiquées dans le document plant_families.xml.

Corrections

<?xml version="1.0" encoding="ISO-8859-1"?><!-- extr_doc_ext.xsl --><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/> <xsl:strip-space elements="*"/>

<xsl:template match="CATALOG"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template>

<xsl:template match="PLANT"> <xsl:copy> <xsl:copy-of select="*"/> <xsl:call-template name="add-family-name"> <xsl:with-param name="botanical" select="BOTANICAL"/> </xsl:call-template> </xsl:copy> </xsl:template>

<xsl:template name="add-family-name"> <xsl:param name="botanical"/> <xsl:for-each select="document('plant_families.xml')"> <FAMILY> <xsl:value-of select="//FAMILY[SPECIES=$botanical]/NAME"/> </FAMILY> </xsl:for-each> </xsl:template>

</xsl:stylesheet>

Exercice 3 - Classer des éléments en fonction d’une propriété

Faire un programme XSLT qui s'applique à plant_catalog.xml et produitplant_catalog_by_light.xml. Le programme XSLT doit classer les éléments PLANT en fonction ducontenu de l'élément LIGHT, et les regrouper comme dans l'exemple ci-dessous :

<CATALOG> <LIGHT> <EXPOSURE>Mostly Shady</EXPOSURE> <PLANT> <COMMON>Bloodroot</COMMON>

Page 17: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Révisions - Examen du 4 novembre 2005 - Correction

Page 3 sur 6http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/tdrevision.php

<BOTANICAL>Sanguinaria canadensis</BOTANICAL> <ZONE>4</ZONE> <PRICE>$2.44</PRICE> <AVAILABILITY>031599</AVAILABILITY> </PLANT> <PLANT> <COMMON>Columbine</COMMON> <BOTANICAL>Aquilegia canadensis</BOTANICAL> <ZONE>3</ZONE> <PRICE>$9.37</PRICE> <AVAILABILITY>030699</AVAILABILITY> </PLANT> (...) </LIGHT> <LIGHT> <EXPOSURE>Mostly Sunny</EXPOSURE> <PLANT> <COMMON>Marsh Marigold</COMMON> <BOTANICAL>Caltha palustris</BOTANICAL> <ZONE>4</ZONE> <PRICE>$6.81</PRICE> <AVAILABILITY>051799</AVAILABILITY> </PLANT> </LIGHT> (...) </CATALOG>

Corrections

<?xml version="1.0" encoding="ISO-8859-1"?><!-- integration.xsl --><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="by-light" match="PLANT" use="LIGHT"/>

<xsl:template match="CATALOG"> <xsl:text></xsl:text> <xsl:processing-instruction name="xml-stylesheet"> <xsl:text>type= "text/css" href="plant_catalog.css"</xsl:text> </xsl:processing-instruction> <xsl:copy> <xsl:apply-templates select="PLANT[generate-id()= generate-id(key('by-light', LIGHT))]/LIGHT"> <xsl:sort/> </xsl:apply-templates> </xsl:copy> </xsl:template>

<xsl:template match="LIGHT"> <xsl:copy> <EXPOSURE> <xsl:value-of select="."/> </EXPOSURE> <xsl:apply-templates select="key('by-light', .)"/> </xsl:copy> </xsl:template>

<xsl:template match="PLANT">

06/12/07 22:11Révisions - Examen du 4 novembre 2005 - Correction

Page 4 sur 6http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/tdrevision.php

<xsl:copy> <xsl:copy-of select="COMMON|BOTANICAL|ZONE|PRICE|AVAILABILITY"/> </xsl:copy> </xsl:template>

</xsl:stylesheet>

Exercice 4 - Intégration

Faire un programme XSLT qui s'applique à plant_catalog.xml et produit plant_catalog2.xml. Leprogramme XSLT doit faire les 3 opérations des 3 exercices précédents, et également :

classer les éléments LIGHT par ordre alphabétique du contenu des éléments EXPOSURE ;

classer les éléments PLANT par ordre alphabétique du contenu des éléments COMMON.

Vérifier que le fichier résultat se visualise bien avec la feuille de style.

Corrections

<?xml version="1.0" encoding="ISO-8859-1"?><!-- integration.xsl --><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="by-light" match="PLANT" use="LIGHT"/>

<xsl:template match="CATALOG"> <xsl:text></xsl:text> <xsl:processing-instruction name="xml-stylesheet"> <xsl:text>type= "text/css" href="plant_catalog.css"</xsl:text> </xsl:processing-instruction> <xsl:copy> <xsl:apply-templates select="PLANT[generate-id()= generate-id(key('by-light', LIGHT))]/LIGHT"> <xsl:sort/> </xsl:apply-templates> </xsl:copy> </xsl:template>

<xsl:template match="LIGHT"> <xsl:copy> <EXPOSURE> <xsl:value-of select="."/> </EXPOSURE> <xsl:apply-templates select="key('by-light', .)"> <xsl:sort use="COMMON"/> </xsl:apply-templates> </xsl:copy> </xsl:template>

<xsl:template match="PLANT"> <xsl:copy> <xsl:copy-of select="COMMON|BOTANICAL|ZONE|PRICE|AVAILABILITY"/> <xsl:call-template name="add-family-name"> <xsl:with-param name="botanical" select="BOTANICAL"/> </xsl:call-template> </xsl:copy>

Page 18: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Révisions - Examen du 4 novembre 2005 - Correction

Page 5 sur 6http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/tdrevision.php

</xsl:template>

<xsl:template name="add-family-name"> <xsl:param name="botanical"/> <xsl:for-each select="document('plant_families.xml')"> <FAMILY> <xsl:value-of select="//FAMILY[SPECIES=$botanical]/NAME"/> </FAMILY> </xsl:for-each> </xsl:template>

</xsl:stylesheet>

Exercice 5 - Calcul arithmétique

Faire un programme XSLT qui s'applique à plant_order.xml et produit un fichier texte price.txt. Leprogramme XSLT doit calculer le montant total de la commande et l'écrire dans le fichier price.txt.

Corrections

<?xml version="1.0" encoding="ISO-8859-1"?><!-- calcul_prix.xsl --><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> <xsl:output method="text"/> <xsl:key name="plante-par-nom" match="PLANT" use="COMMON"/>

<xsl:template match="ORDER"> <xsl:call-template name="calcul-prix"> <xsl:with-param name="plantes" select="PLANT"/> <xsl:with-param name="total" select="0"/> </xsl:call-template> </xsl:template>

<xsl:template name="calcul-prix"> <xsl:param name="plantes"/> <xsl:param name="total"/> <xsl:choose> <xsl:when test="$plantes"> <xsl:variable name="prix-plante"> <xsl:apply-templates select="$plantes[1]"/> </xsl:variable> <xsl:call-template name="calcul-prix"> <xsl:with-param name="plantes" select="$plantes[position()>1]"/> <xsl:with-param name="total" select="$total+$prix-plante"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$total"/> </xsl:otherwise> </xsl:choose> </xsl:template>

<xsl:template match="PLANT"> <xsl:variable name="nom-plante" select="COMMON"/> <xsl:variable name="prix-plante"> <xsl:for-each select="document('plant_catalog.xml')"> <xsl:value-of select="key('plante-par-nom',$nom-plante)/PRICE"/> </xsl:for-each> </xsl:variable>

06/12/07 22:11Révisions - Examen du 4 novembre 2005 - Correction

Page 6 sur 6http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/tdrevision.php

<xsl:message> <xsl:value-of select="substring-after($prix-plante,'$')*QUANTITY"/> </xsl:message> <xsl:value-of select="substring-after($prix-plante,'$')*QUANTITY"/> </xsl:template>

</xsl:stylesheet>

© Université de Marne-la-Vallée

Page 19: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Les clés de la filmographie - Correction

Page 1 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td7.php

::Enseignements :: Ingénieurs 2000 :: IR3 :: 2007-2008 :: eXtended Markup Language ::

Les clés de la filmographie - Correction

Ce TP entraîne à l'utilisation des clés d'accès, au regroupement de noeuds par classes, et à la création de liensHTML.

Exercice 1 - <xsl:key>

Modifier le programme XSLT filmreorg.xsl de réorganisation de fichiers de filmographie (e.g.bergman.xml) en utilisant des clés pour retrouver les résumés et les titres alternatifs (alias) parl'intermédiaire de l'attribut filmref des films.

Corrections

Rappels

<xsl:key match="pattern" name="qname" use="expression"></xsl:key>

The xsl:key element is used to declare a named key that can be used by the key function in expressionsand patterns. The key function has two arguments: the key name and the value (consider this to be akey-value pair). The appropriate use of these key-value pairs can permit easy access to information incomplex XML documents.A key does not have to be unique. Further, a key can refer to more than one node and a node can havemore than one key.There is no limit to the number of the xsl:key elements that can occur. However, each xsl:key elementcan only be a child of the xsl:stylesheet or the xsl:transform elements. It cannot contain any elements ascontent, nor can it appear inside a template.The xsl:key element alerts the XSLT processor to create an indexed data structure for the keyexpressions ahead of time. This indexed data structure will be used by the key function. If there are noxsl:key elements, then the time-consuming indexing is not performed.This is not a self-closing element. The separate closing element is mandatory.match="pattern"The mandatory match attribute defines the nodes to which the key will be applied.name="qname"The mandatory name attribute is a qname that identifies the key. A qname is a qualified name that iscomposed of an optional namespace prefix, a colon, which is only present if there is a prefix, and amandatory XML name (for example, xsl:zipcode or zipcode).use="expression"The mandatory use attribute is an expression or string that is used to determine the value of the key foreach node.

Corrections

<?xml version="1.0" encoding="ISO-8859-1"?><!-- filmReorg.xsl -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>

<xsl:key name="resume" match="resume" use="@filmref"/> <xsl:key name="alias" match="alias" use="@filmref"/> <xsl:template match="filmographie"> <filmographie> <films> <xsl:apply-templates select="roles"/>

06/12/07 22:11Les clés de la filmographie - Correction

Page 2 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td7.php

</films> </filmographie> </xsl:template>

<xsl:template match="roles"> <xsl:apply-templates select="role"> <xsl:sort select="@date"/> </xsl:apply-templates> </xsl:template>

<xsl:template match="role"> <xsl:element name="film">

<xsl:variable name="filmref" select="@filmref"/>

<!-- attribut filmref tir

Exercice 2 - Regroupement

Faire un programme XSLT qui produit à partir d'un fichier de filmographie (e.g. bergman.xml) un documentXHTML qui contient la liste des titres alternatifs, classés par pays.Ne pas faire de classe pour les titres alternatifs sans attribut pays. Pour chaque pays, présenter la liste destitres alternatifs, classés par date, en précisant à chaque fois la date, le titre original du film, la date du filmoriginal et le nom du réalisateur.Exemple :

Surf, The (1949) : "Bränningar" (1935, Ivar Johansson)

Corrections

Rappels

generate-id($noeud1) renvoie un identifiant de $noeud1. Dans une même exécution du programmeXSLT, (1) le noeud a toujours le même identifiant et (2) deux noeuds distincts ont deux identifiantsdistincts. Si plusieurs noeuds passés en paramètre, renvoie l'identifiant du premier. Par conséquent, onpeut utiliser generate-id pour s'assurer de ne traiter chaque pays qu'une seule fois.

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>

<xsl:key name="aliasparpays" match="alias" use="@pays"/><xsl:key name="role" match="role" use="@filmref"/><xsl:key name="resume" match="resume" use="@filmref"/>

<xsl:template match='filmographie'> <html> <head> <title>par pays</title> </head> <body> <h1>Titre alternatifs des films</h1> <xsl:apply-templates select="aliases/alias[generate-id()=generate-id( key('aliasparpays', @pays))]"> <xsl:sort select="@pays"/> </xsl:apply-templates> </body> </html></xsl:template>

Page 20: Validation XML/CSS - Correctionsvn2.assembla.com/svn/kedoc-workspace/ir3_xml/TD_XML.pdf · Modifiez votre document en fonction des erreurs signalées et recommencez la procédure

06/12/07 22:11Les clés de la filmographie - Correction

Page 3 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td7.php

<xsl:template match='alias'> <h2><xsl:value-of select="@pays"/></h2> <p> <xsl:for-each select="key('aliasparpays', @pays)"> <xsl:sort select="@date"/> <xsl:value-of select="."/> (<xsl:value-of select="@date"/>) : <xsl:call-template name='film'> <xsl:with-param name="filmref" select='@filmref'/> </xsl:call-template> <br/> </xsl:for-each> </p></xsl:template>

<xsl:template name="film"> <xsl:param name="filmref"/> "<xsl:value-of select="key('role', $filmref)"/>" (<xsl:value-of select="key('role', $filmref)/@date"/>, <xsl:value-of select="key('resume', $filmref)/@realisateur"/>)</xsl:template>

</xsl:stylesheet>

Exercice 3 - Liens HTML

Faire un programme XSLT qui produit à partir d'un fichier de CV européen (e.g. betty.xml) un documentXHTML qui recense tous les textes qui apparaissent traduits dans le CV XML (ils sont signalés par l'attributlang dans le fichier de CV).Présenter tous les textes en anglais, par ordre alphabétique, puis les textes en français, également par ordrealphabétique. Faire un lien de chaque texte vers sa traduction en français ou en anglais.

Corrections

<?xml version="1.0" encoding="ISO-8859-1"?><!-- textesTraduits.xsl -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> <xsl:output method="html" version="1.0" encoding="ISO-8859-1" indent="yes"/> <xsl:key name="resumesParRealisateurs" match="resume" use="@realisateur"/> <xsl:key name="rolesParId" match="role" use="@filmref"/>

<xsl:template match="cv"> <html> <head> <title>Texts with translation</title> </head> <body> <h1>Texts with translation</h1> <xsl:apply-templates select="//*[@lang]"> <xsl:sort select="@lang"/> <xsl:sort select="text()"/> </xsl:apply-templates> </body> </html> </xsl:template>

<xsl:template match="*[@lang]"> <xsl:variable name="element" select="local-name()"/> <xsl:variable name="autre"> <xsl:choose> <xsl:when test="@lang='fr'">en</xsl:when> <xsl:otherwise>fr</xsl:otherwise> </xsl:choose> </xsl:variable> <p><a name="{generate-id()}">

06/12/07 22:11Les clés de la filmographie - Correction

Page 4 sur 4http://igm.univ-mlv.fr/ens/IR/IR3/2007-2008/eXtendedMarkupLanguage/td7.php

<xsl:variable name="traduction" select="../*[local-name()=$element][@lang=$autre]"/> <xsl:if test="$traduction"> <xsl:attribute name="href">#<xsl:value-of select="generate-id($traduction)"/> </xsl:attribute> </xsl:if> <xsl:value-of select="."/> </a></p></xsl:template>

</xsl:stylesheet>

Exercice 4 - Un peu de révisions

Faire un programme XSLT qui produit à partir d'un fichier de filmographie (e.g. bergman.xml) un documentXHTML qui recense, dans l'ordre alphabétique, les noms de personnes citées comme réalisateur de film, maride l'actrice ou auteur d'une citation.Pour chaque nom, lister les films (dans le cas d'un réalisateur), le mariage avec les dates (dans le cas d'unmari), les citations (dans le cas d'un auteur de citations).

Corrections

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/><xsl:key name="parNom" match="resume" use="@realisateur"/><xsl:key name="parNom" match="mariage" use="text()"/><xsl:key name="parNom" match="citation" use="@auteur"/><xsl:key name="noms" match="@realisateur|mariage/text()|@auteur" use="."/><xsl:key name="roles" match="role" use="@filmref"/>

<xsl:template match="filmographie"> <dictionnaire> <xsl:variable name="citees" select="//resume/@realisateur|//mariage/text()| //citation/@auteur"/> <xsl:apply-templates select="$citees[generate-id()=generate-id(key('noms', .))]"> <xsl:sort/> </xsl:apply-templates> </dictionnaire></xsl:template>

<xsl:template match="@realisateur|mariage/text()|@auteur"> <personneCitee> <xsl:value-of select="."/> <xsl:apply-templates select="key('parNom', .)"/> </personneCitee></xsl:template>

<xsl:template match="resume"> <entry> R

© Université de Marne-la-Vallée