Manuel INF 6450 (complet) - Téluq
Manuel INF 6450 (complet) - Téluq
Manuel INF 6450 (complet) - Téluq
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Manuel</strong> <strong>INF</strong> <strong>6450</strong> (<strong>complet</strong>)<br />
Daniel Lemire, professeur responsable<br />
Kamel Aouiche, auxiliaire de recherche<br />
Lucie Moulet, auxiliaire de recherche<br />
Jean-François Savard, concepteur associé<br />
Renée Dumas, spécialiste en communication écrite<br />
Montréal, 4 avril 2009
Sommaire<br />
Sommaire<br />
iii<br />
Guide d’étude 1<br />
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
Contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
Problématique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
Découplement des informations . . . . . . . . . . . . . . . . 3<br />
XML et interopérabilité . . . . . . . . . . . . . . . . . . . . 3<br />
Flexibilité et évolution des schémas de données . . . . . . . . 4<br />
Les modules du cours . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
Caractéristiques médiatiques . . . . . . . . . . . . . . . . . . . . . . 6<br />
Encadrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
L’évaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
Les travaux notés . . . . . . . . . . . . . . . . . . . . . . . 7<br />
Examen en salle . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
Gestion du temps et pondération . . . . . . . . . . . . . . . . . . . . 8<br />
Version PDF du cours . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
Module 1 : Introduction à XML 13<br />
1.1 Aperçu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
1.1.1 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
1.1.2 Qu’est-ce que le XML . . . . . . . . . . . . . . . . . . . . . 13<br />
1.1.3 Démarche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
1.2 Installation de Mozilla Firefox . . . . . . . . . . . . . . . . . . . . . 15<br />
1.2.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
1.2.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
1.2.3 Installation de polices de caractères optionnelles . . . . . . . 16<br />
1.2.4 Avertissement . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
1.2.5 Autres navigateurs . . . . . . . . . . . . . . . . . . . . . . . 16<br />
1.2.6 Retour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
1.3 Création de documents XML . . . . . . . . . . . . . . . . . . . . . . 16<br />
1.3.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
iii
iv<br />
1.3.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
Autres éditeurs pour le XML . . . . . . . . . . . . . . . . . . 18<br />
1.3.3 Retour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
1.4 Introduction à XML . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
1.4.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
1.4.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
1.4.3 Quelques notions du XML . . . . . . . . . . . . . . . . . . . 19<br />
1.4.4 La philosophie du XML . . . . . . . . . . . . . . . . . . . . 21<br />
1.4.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . 22<br />
1.4.6 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 22<br />
1.4.7 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
1.5 Principes de XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
1.5.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
1.5.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
1.5.3 Quelques principes et notions importantes du XML . . . . . . 26<br />
1.5.4 Points importants dans la syntaxe de base . . . . . . . . . . . 28<br />
1.5.5 Dans l’ordre ou dans le désordre . . . . . . . . . . . . . . . . 29<br />
1.5.6 Appels d’entités . . . . . . . . . . . . . . . . . . . . . . . . 29<br />
1.5.7 Les commentaires . . . . . . . . . . . . . . . . . . . . . . . 30<br />
1.5.8 Les instructions de traitement . . . . . . . . . . . . . . . . . 30<br />
1.5.9 Jeux de caractères . . . . . . . . . . . . . . . . . . . . . . . 31<br />
1.5.10 La déclaration XML . . . . . . . . . . . . . . . . . . . . . . 32<br />
1.5.11 Les espaces . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
1.5.12 Les fins de ligne . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
1.5.13 Les hyperliens . . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
1.5.14 Documents bien formés . . . . . . . . . . . . . . . . . . . . 34<br />
1.5.15 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 34<br />
1.5.16 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44<br />
1.6 Définition de type de document . . . . . . . . . . . . . . . . . . . . . 48<br />
1.6.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
1.6.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
1.6.3 Document XML valable . . . . . . . . . . . . . . . . . . . . 48<br />
1.6.4 Normes de définition de type de document . . . . . . . . . . . 49<br />
1.6.5 Documents valables utilisant la norme DTD . . . . . . . . . . 51<br />
1.6.6 La syntaxe des documents DTD . . . . . . . . . . . . . . . . 52<br />
1.6.7 Exemple supplémentaire . . . . . . . . . . . . . . . . . . . . 54<br />
1.6.8 Les attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . 54<br />
1.6.9 Les entités . . . . . . . . . . . . . . . . . . . . . . . . . . . 56<br />
1.6.10 DTD interne et externe . . . . . . . . . . . . . . . . . . . . . 57<br />
1.6.11 Les entités paramètres . . . . . . . . . . . . . . . . . . . . . 58<br />
1.6.12 Commentaires dans les fichiers DTD . . . . . . . . . . . . . 58<br />
1.6.13 Une comparaison entre Relax NG et DTD . . . . . . . . . . . 59<br />
1.6.14 Une approche plus modulaire . . . . . . . . . . . . . . . . . 62<br />
1.6.15 Définir l’élément-racine . . . . . . . . . . . . . . . . . . . . 64<br />
1.6.16 Définir le type de contenu en Relax NG . . . . . . . . . . . . 64<br />
CC BY-NC-SA
v<br />
1.6.17 Est-ce qu’il existe un outil pour passer d’un format à l’autre<br />
(DTD, Relax NG, XML Schema) . . . . . . . . . . . . . . . 65<br />
1.6.18 Est-ce qu’un document DTD est un document XML . . . . . 65<br />
1.6.19 Pourquoi est-ce qu’il n’est pas suffisant d’utiliser des documents<br />
bien formés À quoi sert la validation . . . . . . . . . 65<br />
1.6.20 Est-ce vraiment nécessaire d’avoir des documents valables<br />
Est-ce que je dois vraiment toujours travailler avec des fichiers<br />
DTD, XML Schema ou Relax NG . . . . . . . . . . . . . . . 65<br />
1.6.21 Livres de référence . . . . . . . . . . . . . . . . . . . . . . . 66<br />
1.6.22 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 66<br />
1.6.23 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87<br />
1.7 La validation des documents XML . . . . . . . . . . . . . . . . . . . 91<br />
1.7.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91<br />
1.7.2 Activité de validation . . . . . . . . . . . . . . . . . . . . . . 92<br />
Procédure pour valider des documents XML . . . . . . . . . 92<br />
Vérification de la procédure . . . . . . . . . . . . . . . . . . 96<br />
1.7.3 Retour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97<br />
1.8 Espaces de noms . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97<br />
1.8.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97<br />
1.8.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97<br />
1.8.3 Les vocabulaires XML . . . . . . . . . . . . . . . . . . . . . 97<br />
1.8.4 Les identificateurs de ressources uniformes (URI) . . . . . . . 97<br />
1.8.5 Les espaces de noms . . . . . . . . . . . . . . . . . . . . . . 98<br />
1.8.6 Les DTD et les espaces de noms . . . . . . . . . . . . . . . . 98<br />
1.8.7 Déclaration de l’espace de noms . . . . . . . . . . . . . . . . 99<br />
1.8.8 Les déclarations croisées . . . . . . . . . . . . . . . . . . . . 102<br />
1.8.9 Le préfixe par défaut . . . . . . . . . . . . . . . . . . . . . . 102<br />
1.8.10 Rappel des notions formelles . . . . . . . . . . . . . . . . . . 103<br />
1.8.11 Les espaces de noms et Relax NG . . . . . . . . . . . . . . . 103<br />
1.8.12 Le préfixe « xml » . . . . . . . . . . . . . . . . . . . . . . . 104<br />
1.8.13 Rappel : des espaces de noms pour les attributs . . . . . . . 104<br />
1.8.14 En résumé, qu’est-ce que les espaces de noms . . . . . . . . 105<br />
1.8.15 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 105<br />
1.8.16 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108<br />
1.9 Travail noté 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109<br />
1.9.1 Objectifs et pondération . . . . . . . . . . . . . . . . . . . . 109<br />
1.9.2 Consignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109<br />
Question 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 110<br />
Question 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 110<br />
Question 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 111<br />
Question 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 111<br />
Question 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 112<br />
Question 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . 113<br />
Question 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . 113<br />
Question 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . 114<br />
Question 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . 114<br />
CC BY-NC-SA
vi<br />
Question 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . 114<br />
Question 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . 115<br />
Module 2 : XML en tant que syntaxe pour les documents 117<br />
2.1 Aperçu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117<br />
2.1.1 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117<br />
2.1.2 Démarche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117<br />
2.2 Introduction au XHTML . . . . . . . . . . . . . . . . . . . . . . . . 118<br />
2.2.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118<br />
2.2.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118<br />
2.2.3 Qu’est-ce que le XHTML . . . . . . . . . . . . . . . . . . . 118<br />
2.2.4 La structure du document XHTML : head et body . . . . . . . 120<br />
2.2.5 Les paragraphes en HTML . . . . . . . . . . . . . . . . . . . 120<br />
2.2.6 Les listes en HTML . . . . . . . . . . . . . . . . . . . . . . 122<br />
2.2.7 Les tableaux en HTML . . . . . . . . . . . . . . . . . . . . . 123<br />
2.2.8 Les caractères italiques et gras . . . . . . . . . . . . . . . . . 125<br />
2.2.9 Les listes de définitions . . . . . . . . . . . . . . . . . . . . . 125<br />
2.2.10 Les lignes horizontales . . . . . . . . . . . . . . . . . . . . . 126<br />
2.2.11 Les images . . . . . . . . . . . . . . . . . . . . . . . . . . . 126<br />
2.2.12 Les hyperliens . . . . . . . . . . . . . . . . . . . . . . . . . 127<br />
2.2.13 Les abbréviations . . . . . . . . . . . . . . . . . . . . . . . . 127<br />
2.2.14 Les adresses . . . . . . . . . . . . . . . . . . . . . . . . . . 127<br />
2.2.15 Les indices et exposants . . . . . . . . . . . . . . . . . . . . 128<br />
2.2.16 Le code et les exemples . . . . . . . . . . . . . . . . . . . . 128<br />
2.2.17 Les citations . . . . . . . . . . . . . . . . . . . . . . . . . . 128<br />
2.2.18 Les révisions . . . . . . . . . . . . . . . . . . . . . . . . . . 128<br />
2.2.19 La langue . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128<br />
2.2.20 Les commentaires . . . . . . . . . . . . . . . . . . . . . . . 129<br />
2.2.21 Séparation du contenu et de la présentation . . . . . . . . . . 129<br />
2.2.22 SVG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129<br />
2.2.23 MathML . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131<br />
2.2.24 Convertir du HTML mal formé . . . . . . . . . . . . . . . . . 131<br />
2.2.25 Spécification Relax NG . . . . . . . . . . . . . . . . . . . . . 131<br />
2.2.26 HTML 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138<br />
2.2.27 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . 139<br />
2.2.28 Livres de référence . . . . . . . . . . . . . . . . . . . . . . . 139<br />
2.2.29 Activité d’autoévaluation . . . . . . . . . . . . . . . . . . . . 140<br />
2.3 XML comme format de documents . . . . . . . . . . . . . . . . . . . 140<br />
2.3.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140<br />
2.3.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140<br />
2.3.3 Le SGML (Standardized General Markup Language) . . . . . 140<br />
2.3.4 Le XML comme format de documents . . . . . . . . . . . . . 141<br />
2.3.5 Le format DocBook . . . . . . . . . . . . . . . . . . . . . . 142<br />
2.3.6 L’ODF (Open Document Format) . . . . . . . . . . . . . . . 147<br />
2.3.7 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 148<br />
2.3.8 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153<br />
CC BY-NC-SA
vii<br />
2.4 XML sur le web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155<br />
2.4.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155<br />
2.4.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155<br />
2.4.3 Le XHTML et le web . . . . . . . . . . . . . . . . . . . . . 155<br />
2.4.4 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 157<br />
2.4.5 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163<br />
2.5 Travail noté 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164<br />
2.5.1 Objectifs et pondération . . . . . . . . . . . . . . . . . . . . 164<br />
2.5.2 Consignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165<br />
En cas de panne . . . . . . . . . . . . . . . . . . . . . . . . . 166<br />
Pistes de discussion . . . . . . . . . . . . . . . . . . . . . . . 166<br />
2.5.3 Critères de correction et de notation . . . . . . . . . . . . . . 166<br />
2.6 Travail noté 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167<br />
2.6.1 Objectifs, pondération et critères de correction . . . . . . . . 167<br />
2.6.2 Description du travail . . . . . . . . . . . . . . . . . . . . . . 167<br />
2.6.3 Consignes . . . . . . . . . . . . . . . . . . . . . . . . . . . 168<br />
Annexe 1. Document XSLT . . . . . . . . . . . . . . . . . . 170<br />
Module 3 : Technologies XML 173<br />
3.1 Aperçu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173<br />
3.1.1 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173<br />
3.1.2 Démarche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173<br />
3.2 XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174<br />
3.2.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174<br />
3.2.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174<br />
3.2.3 Un regard critique . . . . . . . . . . . . . . . . . . . . . . . 174<br />
3.2.4 Les machines de Turing et la technologie XML . . . . . . . . 174<br />
3.2.5 Qu’est-ce que le XSLT . . . . . . . . . . . . . . . . . . . . . 175<br />
3.2.6 Les langages déclaratifs . . . . . . . . . . . . . . . . . . . . 176<br />
3.2.7 Les fichiers XSLT . . . . . . . . . . . . . . . . . . . . . . . 176<br />
3.2.8 « Éléments xsl:template » . . . . . . . . . . . . . . . . . . . 178<br />
3.2.9 « Éléments xsl:value-of » . . . . . . . . . . . . . . . . . . . . 179<br />
3.2.10 Arithmétique en XPath . . . . . . . . . . . . . . . . . . . . . 180<br />
3.2.11 Manipulations des chaînes de caractères en XPath . . . . . . . 181<br />
3.2.12 Chemins XPath plus sophistiqués . . . . . . . . . . . . . . . 182<br />
3.2.13 Modularité avec les éléments « xsl:apply-templates » . . . . . 184<br />
3.2.14 Chemins XPath pour la sélection des attributs . . . . . . . . . 187<br />
3.2.15 Expression XPath « . » . . . . . . . . . . . . . . . . . . . . . 189<br />
3.2.16 Spécifier les valeurs d’attributs . . . . . . . . . . . . . . . . . 190<br />
3.2.17 Expression XPath « .. » . . . . . . . . . . . . . . . . . . . . . 190<br />
3.2.18 Expression XPath « // » . . . . . . . . . . . . . . . . . . . . 191<br />
3.2.19 Expression XPath « * » . . . . . . . . . . . . . . . . . . . . 191<br />
3.2.20 Expression XPath avec « | » . . . . . . . . . . . . . . . . . . 191<br />
3.2.21 Expression XPath pour le nom d’un élément . . . . . . . . . 192<br />
3.2.22 Notion de nœuds XSLT . . . . . . . . . . . . . . . . . . . . . 192<br />
3.2.23 Expressions XPath pour compter et additionner les éléments . 194<br />
CC BY-NC-SA
viii<br />
3.2.24 Utilisation de l’attribut « mode » . . . . . . . . . . . . . . . . 195<br />
3.2.25 Fonction « generate-id » . . . . . . . . . . . . . . . . . . . . 197<br />
3.2.26 Utilisation des tests . . . . . . . . . . . . . . . . . . . . . . . 198<br />
3.2.27 Tester le contenu des chaînes de caractères . . . . . . . . . . 199<br />
3.2.28 Accès aux éléments d’un ensemble d’éléments . . . . . . . . 200<br />
3.2.29 Utiliser XSLT comme base de données et éléments « for-each » 201<br />
3.2.30 Obtenir l’aggrégation avec la fonction « generate-id » . . . . . 204<br />
3.2.31 Un peu plus de performance avec la function XSLT « key » . 208<br />
3.2.32 Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . 209<br />
3.2.33 Les paramètres . . . . . . . . . . . . . . . . . . . . . . . . . 210<br />
3.2.34 Générer un commentaire . . . . . . . . . . . . . . . . . . . . 212<br />
3.2.35 Créer des éléments dynamiquement avec « xsl:element » . . . 212<br />
3.2.36 Copier des nœuds avec « xsl:copy » et « xsl:copy-of » . . . . 213<br />
3.2.37 Union, intersection et différence en XSLT . . . . . . . . . . . 214<br />
3.2.38 Espaces de noms . . . . . . . . . . . . . . . . . . . . . . . . 215<br />
3.2.39 Les axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216<br />
3.2.40 L’étude d’un exemple: docbook.xslt . . . . . . . . . . . . . . 217<br />
3.2.41 Activité suggérée . . . . . . . . . . . . . . . . . . . . . . . . 220<br />
3.2.42 Autres moteurs XSLT . . . . . . . . . . . . . . . . . . . . . 220<br />
3.2.43 Pour voir le résultat de la transformation XSLT . . . . . . . . 220<br />
3.2.44 SVG et XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . 221<br />
3.2.45 XPath, XPointer et XLink . . . . . . . . . . . . . . . . . . . 221<br />
3.2.46 XPath 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222<br />
3.2.47 XLT 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223<br />
3.2.48 XQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223<br />
3.2.49 XPath versus XSLT . . . . . . . . . . . . . . . . . . . . . . . 227<br />
3.2.50 En terminant . . . . . . . . . . . . . . . . . . . . . . . . . . 227<br />
3.2.51 Livres de référence . . . . . . . . . . . . . . . . . . . . . . . 227<br />
3.2.52 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 228<br />
3.2.53 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243<br />
3.3 CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249<br />
3.3.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249<br />
3.3.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249<br />
3.3.3 Qu’est-ce que les CSS . . . . . . . . . . . . . . . . . . . . . 249<br />
3.3.4 Point de vue critique . . . . . . . . . . . . . . . . . . . . . . 250<br />
3.3.5 Notions de base . . . . . . . . . . . . . . . . . . . . . . . . . 250<br />
3.3.6 Contenu en ligne ou en bloc . . . . . . . . . . . . . . . . . 253<br />
3.3.7 Centrer un élément . . . . . . . . . . . . . . . . . . . . . . . 253<br />
3.3.8 Les commentaires . . . . . . . . . . . . . . . . . . . . . . . 254<br />
3.3.9 Sélectionner le premier caractère ou la première ligne . . . . . 254<br />
3.3.10 Ajouter du contenu avant et après un élément . . . . . . . . . 254<br />
3.3.11 Qu’est-ce qu’un pseudo-élément . . . . . . . . . . . . . . . 254<br />
3.3.12 Sélecteurs d’intéraction . . . . . . . . . . . . . . . . . . . . . 255<br />
3.3.13 Règles par défaut . . . . . . . . . . . . . . . . . . . . . . . . 255<br />
3.3.14 L’astérisque . . . . . . . . . . . . . . . . . . . . . . . . . . . 257<br />
3.3.15 Sélection sur la base des attributs . . . . . . . . . . . . . . . 257<br />
CC BY-NC-SA
ix<br />
3.3.16 Les espaces de noms . . . . . . . . . . . . . . . . . . . . . . 258<br />
3.3.17 Sélection de la langue . . . . . . . . . . . . . . . . . . . . . 258<br />
3.3.18 Sélection de plusieurs éléments . . . . . . . . . . . . . . . . 258<br />
3.3.19 Sélection sur la base de la relation entre les éléments . . . . . 258<br />
3.3.20 Sélection d’élément par valeur ID . . . . . . . . . . . . . . . 260<br />
3.3.21 Mais que se passe-t-il en cas de conflit . . . . . . . . . . . . 261<br />
3.3.22 Le modèle de boîte CSS . . . . . . . . . . . . . . . . . . . . 263<br />
3.3.23 Quand le contenu excède le contenant . . . . . . . . . . . . . 265<br />
3.3.24 Encodage des caractères . . . . . . . . . . . . . . . . . . . . 265<br />
3.3.25 Différentes règles pour différents média . . . . . . . . . . . . 265<br />
3.3.26 Inclure d’autres fichiers CSS . . . . . . . . . . . . . . . . . . 265<br />
3.3.27 Indentation de la première ligne d’un paragraphe . . . . . . . 266<br />
3.3.28 Modifier la casse du texte . . . . . . . . . . . . . . . . . . . 266<br />
3.3.29 Autres variantes des polices . . . . . . . . . . . . . . . . . . 266<br />
3.3.30 Ajouter des compteurs . . . . . . . . . . . . . . . . . . . . . 266<br />
3.3.31 Traitement des retours de chariot . . . . . . . . . . . . . . . . 267<br />
3.3.32 Des nouveautés en CSS 3 . . . . . . . . . . . . . . . . . . . 267<br />
3.3.33 Optimisation des fichiers CSS . . . . . . . . . . . . . . . . . 268<br />
3.3.34 En terminant . . . . . . . . . . . . . . . . . . . . . . . . . . 269<br />
3.3.35 Livres de référence . . . . . . . . . . . . . . . . . . . . . . . 269<br />
3.3.36 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 270<br />
3.3.37 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274<br />
3.4 Travail noté 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276<br />
3.4.1 Objectifs et pondération . . . . . . . . . . . . . . . . . . . . 276<br />
3.4.2 Consignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276<br />
3.4.3 Exercice 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 276<br />
3.4.4 Exercice 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277<br />
3.4.5 Exercice 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278<br />
3.4.6 Exercice 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279<br />
3.4.7 Exercice 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279<br />
Module 4 : Traitement du XML en Java 281<br />
4.1 Aperçu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281<br />
4.1.1 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281<br />
4.1.2 Démarche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282<br />
4.2 Modèles de programmation . . . . . . . . . . . . . . . . . . . . . . . 282<br />
4.2.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282<br />
4.2.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282<br />
4.2.3 Traitement du XML comme du texte . . . . . . . . . . . . . . 283<br />
4.2.4 Traitement événementiel . . . . . . . . . . . . . . . . . . . . 284<br />
4.2.5 Traitement avec itérateurs . . . . . . . . . . . . . . . . . . . 287<br />
4.2.6 Traitement avec modèle en arbre . . . . . . . . . . . . . . . . 288<br />
4.2.7 Transformations . . . . . . . . . . . . . . . . . . . . . . . . 289<br />
4.2.8 XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290<br />
4.2.9 XML comme extension d’un langage . . . . . . . . . . . . . 290<br />
4.2.10 Traitement par abstraction . . . . . . . . . . . . . . . . . . . 291<br />
CC BY-NC-SA
x<br />
4.2.11 Sérialisation XML . . . . . . . . . . . . . . . . . . . . . . . 291<br />
4.2.12 Services web . . . . . . . . . . . . . . . . . . . . . . . . . . 293<br />
4.2.13 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 297<br />
4.2.14 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298<br />
4.3 Rappel sur la programmation Java . . . . . . . . . . . . . . . . . . . 299<br />
4.3.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299<br />
4.3.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299<br />
4.3.3 Définitions . . . . . . . . . . . . . . . . . . . . . . . . . . . 299<br />
Notion d’objet . . . . . . . . . . . . . . . . . . . . . . . . . 299<br />
Notion de classe . . . . . . . . . . . . . . . . . . . . . . . . 300<br />
Notion de méthode . . . . . . . . . . . . . . . . . . . . . . . 300<br />
Notion d’interface . . . . . . . . . . . . . . . . . . . . . . . 300<br />
Notion d’héritage . . . . . . . . . . . . . . . . . . . . . . . . 300<br />
Notion d’encapsulation . . . . . . . . . . . . . . . . . . . . . 300<br />
4.3.4 Exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300<br />
4.3.5 Exemples avancés . . . . . . . . . . . . . . . . . . . . . . . 301<br />
4.3.6 Lecture de fichiers . . . . . . . . . . . . . . . . . . . . . . . 302<br />
4.3.7 Astuces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302<br />
4.3.8 Retour sur l’activité . . . . . . . . . . . . . . . . . . . . . . . 302<br />
4.4 Tutoriel sur DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303<br />
4.4.1 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303<br />
4.4.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303<br />
4.4.3 Le tutoriel pour se familiariser avec le DOM . . . . . . . . . 303<br />
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . 303<br />
4.4.4 Notions de base . . . . . . . . . . . . . . . . . . . . . . . . . 303<br />
4.4.5 Point de vue critique . . . . . . . . . . . . . . . . . . . . . . 304<br />
4.4.6 Un document XML . . . . . . . . . . . . . . . . . . . . . . . 304<br />
4.4.7 Charger un document XML en Java . . . . . . . . . . . . . . 304<br />
4.4.8 Accès à l’élément-racine . . . . . . . . . . . . . . . . . . . . 305<br />
4.4.9 L’interface « Node » . . . . . . . . . . . . . . . . . . . . . . 306<br />
4.4.10 Création de documents . . . . . . . . . . . . . . . . . . . . . 311<br />
4.4.11 Modifier un « Document » . . . . . . . . . . . . . . . . . . . 314<br />
4.4.12 Les espaces de noms . . . . . . . . . . . . . . . . . . . . . . 316<br />
4.4.13 Deux problèmes avec solution . . . . . . . . . . . . . . . . . 317<br />
Problème 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 317<br />
Solution du problème 1 . . . . . . . . . . . . . . . . . . . . . 318<br />
Problème 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 319<br />
Solution du problème 2 . . . . . . . . . . . . . . . . . . . . . 319<br />
4.4.14 DOM et ECMAScript . . . . . . . . . . . . . . . . . . . . . 321<br />
4.4.15 Asynchronous JavaScript And XML (AJAX) . . . . . . . . . 322<br />
4.4.16 DOM et autres langages . . . . . . . . . . . . . . . . . . . . 327<br />
4.4.17 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . 327<br />
4.4.18 Livres de référence . . . . . . . . . . . . . . . . . . . . . . . 327<br />
4.5 DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327<br />
4.5.1 Objectif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327<br />
4.5.2 Activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327<br />
CC BY-NC-SA
xi<br />
4.5.3 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 328<br />
4.5.4 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329<br />
4.6 Travail noté 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330<br />
4.6.1 Objectifs et pondération . . . . . . . . . . . . . . . . . . . . 330<br />
4.6.2 Consignes générales . . . . . . . . . . . . . . . . . . . . . . 330<br />
4.6.3 Exercice 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331<br />
4.6.4 Exercice 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332<br />
4.6.5 Exercice 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333<br />
4.6.6 Exercice 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335<br />
4.6.7 Exercice 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335<br />
Module 5 : Resource Description Framework (RDF) 337<br />
5.1 Aperçu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337<br />
5.1.1 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337<br />
5.1.2 Représentation des connaissances et graphes . . . . . . . . . 337<br />
5.1.3 Démarche . . . . . . . . . . . . . . . . . . . . . . . . . . . 338<br />
5.1.4 Préparation à l’examen . . . . . . . . . . . . . . . . . . . . 339<br />
5.1.5 Évaluation du cours . . . . . . . . . . . . . . . . . . . . . . 339<br />
5.2 Introduction au RDF . . . . . . . . . . . . . . . . . . . . . . . . . . 339<br />
5.2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 339<br />
5.2.2 Point de vue critique . . . . . . . . . . . . . . . . . . . . . . 339<br />
5.2.3 Notions de base . . . . . . . . . . . . . . . . . . . . . . . . . 340<br />
5.2.4 Le RDF en XML . . . . . . . . . . . . . . . . . . . . . . . . 344<br />
5.2.5 Les classes en RDF . . . . . . . . . . . . . . . . . . . . . . . 348<br />
5.2.6 Et s’il n’y a pas de symbole « # » dans l’URI . . . . . . . . . 349<br />
5.2.7 Des objets qui sont eux-mêmes des sujets . . . . . . . . . . . 350<br />
5.2.8 Les contenants en RDF . . . . . . . . . . . . . . . . . . . . . 353<br />
5.2.9 RDFa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355<br />
5.2.10 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . 355<br />
5.3 Questionnaire d’autoévaluation : Introduction au RDF . . . . . . . . . 355<br />
5.3.1 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 356<br />
5.3.2 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359<br />
5.4 Le RDF par l’exemple . . . . . . . . . . . . . . . . . . . . . . . . . 361<br />
5.4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 361<br />
5.4.2 Un exemple : Dublin Core . . . . . . . . . . . . . . . . . . . 361<br />
5.4.3 Un exemple : Creative Commons . . . . . . . . . . . . . . . 365<br />
5.4.4 Un exemple : FOAF . . . . . . . . . . . . . . . . . . . . . . 369<br />
5.4.5 Un exemple : RSS/RDF . . . . . . . . . . . . . . . . . . . . . 371<br />
5.4.6 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . 373<br />
5.5 Questionnaire d’autoévaluation : Le RDF par l’exemple . . . . . . . 374<br />
5.5.1 Questions d’auto-évaluation . . . . . . . . . . . . . . . . . . 374<br />
5.5.2 Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376<br />
5.6 Travail noté 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377<br />
5.6.1 Objectifs et pondération . . . . . . . . . . . . . . . . . . . . 377<br />
5.6.2 Consignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377<br />
5.6.3 Exercice 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378<br />
CC BY-NC-SA
xii<br />
5.6.4 Exercice 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378<br />
5.6.5 Exercice 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378<br />
5.6.6 Exercice 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379<br />
5.6.7 Exercice 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379<br />
5.6.8 Exercice 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379<br />
Avant de réaliser l’exercice... . . . . . . . . . . . . . . . . . 379<br />
Exercice à réaliser... . . . . . . . . . . . . . . . . . . . . . . 381<br />
5.6.9 Exercice 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382<br />
Annexe A : Glossaire 383<br />
Annexe B : Webographie XML 387<br />
1 Blogues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387<br />
2 Cours en ligne, en français . . . . . . . . . . . . . . . . . . . . . . . 387<br />
3 Cours en ligne, en anglais . . . . . . . . . . . . . . . . . . . . . . . . 387<br />
4 Liens généraux, en français . . . . . . . . . . . . . . . . . . . . . . . 387<br />
5 Articles, en français . . . . . . . . . . . . . . . . . . . . . . . . . . . 388<br />
6 Articles, en anglais . . . . . . . . . . . . . . . . . . . . . . . . . . . 388<br />
7 Références tirées du site Wikipedia (anglais) . . . . . . . . . . . . . . 388<br />
7.1 Spécification XML . . . . . . . . . . . . . . . . . . . . . . . 388<br />
7.2 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388<br />
7.3 Ressources pour les développeurs . . . . . . . . . . . . . . . 388<br />
8 Liens vers des livres portant sur le XML, en anglais . . . . . . . . . . 389<br />
Annexe C : Pense-bête DTD 391<br />
Annexe D : Pense-bête HTML 393<br />
Annexe E : Pense-bête XSLT 395<br />
Bibliographie 399<br />
CC BY-NC-SA
Guide d’étude<br />
Introduction<br />
Bienvenue dans le cours <strong>INF</strong> <strong>6450</strong> Gestion de l’information avec XML. Mon nom est<br />
Daniel Lemire et je suis le professeur de ce cours. J’anime un blogue sur le XML à<br />
l’adresse http://www.daniel-lemire.com/ blogue/category/xml/.<br />
Avertissement: le site web du cours utilise une technique HTML qui rend l’utilisation<br />
du bouton « Reculer d’une page » hasardeuse.<br />
Ce document contient toutes les informations utiles à votre démarche dans le cours.<br />
Je vous suggère, avant de commencer l’étude du premier module, de prendre connaissance<br />
des objectifs du cours, de son contenu, de sa problématique, de son organisation<br />
en modules, des caractéristiques médiatiques de son environnement, ainsi que des propositions<br />
de répartition de votre temps d’étude pendant les quinze semaines du cours.<br />
Normalement, vous étudierez les modules de façon séquentielle; des indications plus<br />
précises sont fournies dans chaque module quant aux liens entre les différentes activités.<br />
L’installation du navigateur Firefox est obligatoire pour suivre ce cours; c’est d’ailleurs<br />
la première activité du module 1.<br />
Objectifs<br />
Le but de ce cours est de vous donner tous les outils nécessaires pour utiliser le XML<br />
dans un projet en technologie de l’information, que ce soit un projet de développement<br />
logiciel, un projet scientifique, ou dans le cadre d’un système d’informations. Il est<br />
aussi une préparation utile pour des travaux en gestion des connaissances, recherche<br />
d’informations, bibliothéconomie, e-Learning, génie logiciel, web sémantique, etc.<br />
Les objectifs du cours sont :<br />
– Utiliser un « vocabulaire » ou une application XML pour présenter des informations<br />
en format XML.<br />
1
Guide d’étude 2<br />
– Déterminer si un document XML est bien formé ou valable.<br />
– Apprécier les coûts de développement de solutions XML au sein d’une organisation.<br />
– Appliquer la méthodologie orientée objet pour l’utilisation, la fusion et le filtrage<br />
des fichiers XML.<br />
– Produire et interpréter des fichiers XML : des fichiers les plus simples aux fichiers<br />
RDF.<br />
– Utiliser des transformations XSLT et des instructions CSS.<br />
– Traduire, au sein de son organisation, sa compréhension du XML dans la gestion des<br />
informations.<br />
– Interpréter un fichier RDF comme un tableau sujet/verbe/objet.<br />
Contenu<br />
Dans ce cours, nous traiterons des points suivants :<br />
– Historique, raisons qui ont entraîné la création du XML, comparaison avec HTML<br />
et SGML<br />
– Le document XML : syntaxe, éléments, attributs et entités<br />
– Documents bien formés<br />
– Documents valables : Document Type Definitions (DTD), XML Schema, Relax NG,<br />
Schematron et Examplotron<br />
– Vocabulaires et espaces de noms<br />
– Le XML comme format de document: XHTML, SVG, MathML, Open Document<br />
Format et DocBook.<br />
– Modélisation de l’information en XML<br />
– XML, XSLT, XPath, XLink, XPointer, XQuery, CSS<br />
– Utilisation du XML à partir de langages orientés objets (Java, JavaScript, C++)<br />
– Modèle objet XML (DOM)<br />
– Asynchronous JavaScript And XML (AJAX)<br />
– Filtrage, fusion et extraction du XML en Java<br />
– Métadonnées en XML : Resource Description Framework (RDF), Dublin Core,<br />
Creative Commons, FOAF, RSS 1.0, web sémantique.<br />
Le cours ne traite pas en profondeur des technologies propriétaires telles que celles<br />
d’Oracle ou de Microsoft. Le cours n’en demeure pas moins axée sur la pratique : tous<br />
les concepts introduits dans le cours sont mis en application. Parce que le cours se veut<br />
une préparation à l’utilisation du XML dans des projets concrets, les avantages et les<br />
inconvénients des diverses techniques sont présentés.<br />
Problématique<br />
La gestion des connaissances se fait de plus en plus en utilisant la technologie du web,<br />
qui se tourne elle-même vers les données semi-structurées et la syntaxe XML, en<br />
CC BY-NC-SA
Problématique 3<br />
particulier. Le XML (Extensible Markup Language) est la norme dans l’échange des<br />
données sur le web et au sein des organisations, tout en étant un des piliers du web<br />
sémantique. Les applications et outils supportant le XML, que ce soit pour l’analyse<br />
syntaxique, le filtrage ou autres activités, sont maintenant très sophistiqués, nombreux<br />
et s’appliquent à des domaines variés. Pour s’en convaincre, il suffit de voir la liste des<br />
acronymes et les sujets auxquels ils correspondent : OWL (ontologies), RDF (description<br />
des ressources), XSL (transformations et présentation), RuleML (logique), etc.<br />
Dans une organisation, le XML joue un rôle sur au moins trois plans :<br />
1. Découplement des informations;<br />
2. Interopérabilité;<br />
3. Flexibilité et évolution des schémas de données.<br />
Découplement des informations<br />
Dans la gestion des connaissances, le XML joue souvent un rôle dans le découplement<br />
des informations : métadonnées versus données, présentation versus contenu, implémentation<br />
versus logique, etc. L’ubiquité du XML et des outils le supportant permet,<br />
par exemple, de découpler de façon pratique le système d’exploitation et le logiciel<br />
de traitement de texte utilisé : les fichiers Open Office et les nouveaux fichiers Microsoft<br />
Office sont en format XML, permettant ainsi, en principe, à n’importe quelle<br />
plateforme logicielle d’aller chercher le contenu, le texte. Cette interopérabilité n’était<br />
pas possible avec le format binaire « traditionnel » que Microsoft utilisait dans les<br />
années 90. Le nouveau format utilisé par Microsoft Word distingue nettement la présentation<br />
du contenu. De la même manière, le format XHTML permet de laisser le<br />
contenu textuel semi-structuré dans le fichier lui-même et de placer la présentation<br />
dans un fichier CSS. D’autre part, tout fichier XHTML peut être facilement traité par<br />
un analyseur de syntaxe XML générique, peu importe la plateforme avec laquelle il a<br />
été produit. Au contraire, le HTML « traditionnel » exige des analyseurs de syntaxe<br />
spécifiques au HTML et de conception très robuste.<br />
XML et interopérabilité<br />
Pour une organisation, le fait de stocker, ou du moins de pouvoir transformer, les informations<br />
et les connaissances en XML rend beaucoup plus facile qu’auparavant le<br />
partage de ces mêmes informations et connaissances. En principe, n’importe qui peut<br />
traiter les fichiers XML provenant de n’importe quelle organisation en utilisant un logiciel<br />
générique. Dans une certaine mesure, on se met à l’abri du blocage de la part<br />
d’un fournisseur (vendor locking), ce qui a tant nui à plusieurs organisations dans le<br />
passé. Par exemple, c’était le cas d’une entreprise qui utilisait, pour une fonction stratégique,<br />
un logiciel conçu par une société qui devait fermer ou qui refusait de fournir<br />
une fonction particulière pourtant nécessaire. Si les informations sont en format XML,<br />
il est possible, du moins en théorie, pour une organisation d’extraire avec précision<br />
CC BY-NC-SA
Guide d’étude 4<br />
l’information et de la traiter; il lui suffit d’utiliser n’importe quel analyseur de syntaxe<br />
XML et de comprendre l’application XML utilisée.<br />
Pensons à une entreprise distribuée qui, pour collaborer, doit non seulement s’entendre<br />
sur une ontologie commune entre ses différentes constituantes, mais aussi définir un<br />
protocole d’échange des informations et connaissances. Comme le XML s’est imposé<br />
en tant que norme, le problème est simplifié : il suffit maintenant de « seulement »<br />
s’entendre sur un vocabulaire. Le XML fournit non seulement la syntaxe, mais aussi<br />
les outils nécessaires pour vérifier qui respecte ou ne respecte pas la syntaxe. Les outils<br />
pour modifier, traiter, fusionner le XML ne sont plus spécifiques aux besoins d’une<br />
entreprise ou d’un type d’entreprise : tous partagent les mêmes outils de base, car tous<br />
utilisent la même syntaxe. Les problèmes d’intégration sont donc plus faciles à résoudre<br />
et on passe moins de temps à faire de la rétro-ingénierie (reverse-engineering). Il faut<br />
évidemment toujours bien documenter et comprendre les vocabulaires, mais un lot de<br />
problèmes purement techniques sont balayés.<br />
Pensons également aux projets récents portant sur les objets d’apprentissage sur lesquels<br />
travaille la Télé-université. La plupart de ces projets sont constitués en réseaux :<br />
on désire échanger des objets d’apprentissage entre des individus qui ne se rencontrent<br />
jamais. Ainsi, en utilisant, par exemple, l’application XML IEEE LOM pour décrire<br />
aux clients potentiels nos objets, nous savons que le récipiendaire, peu importe sa plateforme<br />
logicielle, pourra au minimum traiter la syntaxe. Le XML n’est donc pas un<br />
progrès ou une nouveauté technologique : la théorie de la syntaxe des fichiers textes est<br />
un sujet bien développé. Le XML s’impose davantage comme progrès social : le web<br />
a amené les gens à s’entendre une fois pour toute sur une syntaxe suffisamment simple<br />
et universelle pour les documents semi-structurés.<br />
Le cours <strong>INF</strong> <strong>6450</strong> Gestion de l’information avec XML ne porte donc pas uniquement<br />
sur la technologie elle-même; il envisage plutôt le XML comme une norme, mais aussi<br />
comme un ensemble de normes, incluant RDF, qui ont toutes en commun d’avoir un<br />
lien fort avec le web et la gestion de l’information et des connaissances.<br />
Flexibilité et évolution des schémas de données<br />
Un autre rôle du XML dans l’organisation : se substituer aux modèles relationnels<br />
dans lesquels on impose des champs de données fixes. Par exemple, on décrit chaque<br />
étudiant par un numéro de matricule, un nom et une date de naissance; on peut aussi<br />
associer l’étudiant à une liste de cours suivis. Bien que le modèle relationnel puisse<br />
sembler très flexible, il n’est pas toujours idéal : le web n’est pas une base de données<br />
relationnelles et, en fait, ce n’est pas du tout une base de données. S’il fallait convertir<br />
les pages web HTML en un schéma de base de données relationnelles, on constaterait<br />
rapidement qu’il s’agit d’un travail fastidieux, voire impossible.<br />
D’un autre côté, les pages web, les documents Microsoft Word et d’autres formes de<br />
données non structurées possèdent aussi leurs inconvénients. Supposons que j’accède<br />
au bottin de la <strong>Téluq</strong> par le web. En principe, je peux écrire un programme qui va<br />
automatiquement chercher le numéro de téléphone de « Richard Hotte ». En pratique<br />
CC BY-NC-SA
Les modules du cours 5<br />
cependant, comme le HTML est avant tout un format de présentation de l’information,<br />
cette approche est fragile et peu pratique : les machines ont tout simplement beaucoup<br />
de mal à extraire de l’information précise à partir de documents non structurés, contrairement<br />
aux êtres humains qui peuvent très bien reconnaître que telle page web présente<br />
bel et bien le numéro de téléphone de « Richard Hotte ».<br />
Ainsi, le XML se situe un peu entre les bases de données et les formats sans sémantique<br />
: on parle d’information semi-structurée. On garde une grande partie de la flexibilité<br />
qui a permis au web de devenir l’outil unique de gestion de l’information que l’on<br />
connaît. En même temps, on permet aux systèmes informatiques d’interagir avec toute<br />
cette information de façon automatique. De plus, avec le XML, il n’est pas du tout problématique<br />
de concevoir des schémas d’information ou de les réutiliser. En somme, le<br />
XML représente un compromis à la fois sémantique et flexible.<br />
Les modules du cours<br />
Le cours comporte 5 modules. Le premier module introduit au XML proprement dit :<br />
sa syntaxe et ses capacités de modélisation. Le module 2 porte sur le XML en tant que<br />
format pour les documents; on y présente la notion de séparation du contenu et de la<br />
présentation. Les modules 3, 4 et 5 portent respectivement sur l’ensemble de ce que l’on<br />
nomme parfois les « technologies XML » incluant XSLT, CSS, etc., sur le traitement<br />
du XML en utilisant un langage de programmation comme Java et, finalement, sur le<br />
RDF en tant que langage pour la description des ressources.<br />
Pour chaque module, nous avons rédigé des textes d’appoint et préparé des questionnaires<br />
d’autoévaluation qui vous permettront de vérifier votre maîtrise du contenu, au<br />
fur et à mesure de votre apprentissage. En outre, pour nous permettre de vous évaluer,<br />
vous réaliserez un travail noté par module.<br />
Il est préférable de procéder à l’étude des modules de façon séquentielle : en effet,<br />
il faut d’abord savoir interpréter la syntaxe XML avant de pouvoir aborder le XML<br />
comme format pour les documents. En outre, il faut une connaissance du XML comme<br />
format de document pour comprendre l’utilité des « technologies XML » et faire du<br />
traitement en Java. Finalement, le RDF exige une maîtrise suffisante de l’ensemble du<br />
XML, parce que la syntaxe peut sembler rébarbative à quelqu’un peu expérimenté. Il<br />
est cependant possible d’aborder les modules 3 et 4 de front.<br />
En résumé, le cours comporte les cinq modules suivants :<br />
– Module 1 : Introduction à XML (extensibilité, DTD, Relax NG, XML Schema, espaces<br />
de noms)<br />
– Module 2 : XML en tant que syntaxe pour les documents (XHTML, SVG, MathML,<br />
DocBook, ODF)<br />
– Module 3 : Technologies XML (XSLT, CSS, XPath, XQuery, XLink)<br />
– Module 4 : Traitement du XML en Java (DOM, SAX, Itérateurs, Sérialisation,<br />
AJAX, Services web)<br />
CC BY-NC-SA
Guide d’étude 6<br />
– Module 5 : Resource Description Framework (RDF) (Dublin Core, Creative Commons,<br />
FOAF, RSS 1.0, Atom)<br />
Caractéristiques médiatiques<br />
L’environnement du cours est un site web réalisé entièrement en XML. Les figures<br />
sont en SVG (un format XML couvert dans le cours). Vous pouvez faire vos lectures<br />
(textes, consignes, etc.) sur le site, mais aussi en utilisant un document imprimé, (<strong>Manuel</strong><br />
<strong>INF</strong> <strong>6450</strong>) généré à partir du site web par une transformation XSLT (sujet couvert<br />
dans le cadre du cours). Le cours contient de nombreux exemples de code en XML et<br />
Java : vous devriez être capable, à la fin du cours, de lire sans mal du XML en ligne,<br />
sans coloration syntaxique. Tous les modules comprennent des activités d’autoévaluation<br />
sous la forme de questionnaires (rédigés eux-même en XML) visant à vérifier<br />
la compréhension de vos lectures; vous répondrez à ces questionnaires sur le site, en<br />
ligne, car leur efficacité est optimisée par les possibilités du web. Un va-et-vient entre<br />
lectures et questionnaires d’autoévaluation s’imposera, mais à votre rythme.<br />
En outre, sur le site web, se trouvent la documentation touchant l’installation et l’utilisation<br />
du logiciel Firefox nécessaire au cours, diverses activités de création et de validation<br />
de documents XML, les consignes pour les travaux notés, les pense-bêtes qui,<br />
comme leur nom l’indique, vous seront utiles à différents moments. Vous y avez accès<br />
par des hyperliens dans la colonne de gauche de la page-écran, et ce pour chaque<br />
module.<br />
Les étudiants qui désirent un livre de référence pour ce cours peuvent acheter « XML en<br />
concentré : <strong>Manuel</strong> de référence » d’Elliotte Rusty Harold, W-Scott Means, Philippe<br />
Ensarguet (traducteur), Frédéric Laurent (traducteur) chez O’Reilly paru le 21 avril<br />
2005 (ISBN : 2841773531). En outre, un des auteurs de ce livre de référence, Elliotte<br />
Rusty Harold a une page d’actualité sur le XML: Cafe con Leche XML News and<br />
Resources.<br />
Par ailleurs, nous avons préparé une feuille de route qui donne un aperçu de la démarche,<br />
un glossaire définissant quelques termes importants du cours et une webographie<br />
contenant plusieurs liens en français et en anglais. Ils sont accessibles en tout<br />
temps à partir des modules, par des boutons placés dans la partie supérieure de la pageécran.<br />
Encadrement<br />
L’encadrement, assuré par une personne tutrice que vous assigne l’Université, se fait<br />
par courriel. Ainsi, toutes vos interrogations sur le cours ou sur l’environnement d’apprentissage<br />
doivent lui être adressées par courriel; celle-ci y répondra dans les plus<br />
CC BY-NC-SA
L’évaluation 7<br />
brefs délais. Par ailleurs, nous vous demandons d’inscrire « [<strong>INF</strong><strong>6450</strong>] » dans l’objet<br />
de tous vos messages. En ce qui concerne les travaux notés que vous transmettrez<br />
également par courriel à votre personne tutrice pour qu’elle les corrige, vous<br />
devrez en plus indiquer, dans l’objet du message, le numéro du travail, par exemple<br />
« [<strong>INF</strong><strong>6450</strong>][TRAVAIL5] »; dans le message de transmission, vous indiquerez également<br />
votre nom, votre numéro d’étudiant (8 chiffres), la date de remise de votre travail<br />
et le nom de votre personne tutrice. Des consignes précises sont fournies dans chaque<br />
travail noté.<br />
L’évaluation<br />
Pour évaluer vos apprentissages dans ce cours, nous avons préparé 6 travaux notés et<br />
un examen en salle. Le tableau qui suit les présente sommairement.<br />
Activités notées Modules Pondération<br />
Travail noté 1 (questionnaire)<br />
Module 1 10 %<br />
Travail noté 2 (discussion Modules 2-5 5 %<br />
et compte rendu)<br />
Travail noté 3 (rédaction) Module 2 10 %<br />
Travail noté 4 (programmation)<br />
Module 3 10 %<br />
Travail noté 5 (programmation)<br />
Module 4 15 %<br />
Travail noté 6 (programmation)<br />
Module 5 10 %<br />
Examen en salle Modules 1-5 40 %<br />
Total 100 %<br />
Les travaux notés<br />
Les travaux notés 1, 3, 4, 5 et 6 sont associés à un module et vérifient l’atteinte des<br />
objectifs de ce module. Le travail noté 1 prend la forme d’un questionnaire, le travail<br />
noté 3 consiste à rédiger un document en XML; les travaux notés 4, 5 et 6 comportent<br />
des exercices qui exigent de la programmation. Je vous recommande de réaliser ces<br />
travaux notés après avoir effectué les lectures et les activités d’autoévaluation du module<br />
en question. Il n’est pas nécessaire de faire les travaux dans l’ordre qu’ils apparaissent<br />
dans le cours; en effet, le travail noté 3 peut être fait après les autres travaux,<br />
par exemple. Cependant, le travail noté 1 doit être fait avant les autres et le travail<br />
noté 6, après les travaux notés 4 et 5.<br />
Quant au travail noté 2, la discussion dans le forum du cours, il peut commencer dès<br />
le début du module 2 et vous avez toute la durée du cours pour le réaliser. Avant de<br />
commencer cette activité, nous vous suggérons fortement d’avoir terminé l’étude du<br />
CC BY-NC-SA
Guide d’étude 8<br />
module 1, car il faut bien comprendre les définitions et concepts de base du XML.<br />
Notez que l’évaluation du travail 2 porte sur le compte rendu que vous rédigerez à la<br />
suite de votre participation dans le forum. Tous les travaux doivent être transmis à la<br />
personne tutrice par courriel.<br />
Examen en salle<br />
L’examen en salle compte pour 40 % de la note du cours. Il s’agit d’un examen de<br />
3 heures comportant 5 questions, lesquels portent sur le contenu couvert par les travaux<br />
1, 3, 4, 5 et 6. Un examen factice est disponible dans le dernier module pour vous<br />
permettre de vérifier si vous êtes prêt. La correction de l’examen est rigoureuse : vous<br />
devez décrire le comportement exact des programmes et pouvoir répondre aux questions<br />
de façon aussi précise que durant les travaux. Il est important d’avoir lu tous les<br />
textes et d’avoir fait toutes les activités d’autoévaluation du cours pour réussir l’examen.<br />
Aucune documentation n’est permise durant l’examen.<br />
Vers la douzième semaine du cours, l’Université vous informera de la date, de l’heure<br />
et de l’endroit de passation de l’examen.<br />
Gestion du temps et pondération<br />
Dans le tableau qui suit, nous indiquons le temps à prévoir pour chaque activité, ainsi<br />
que la pondération associée à chacune. Le temps consacré à la lecture inclut la lecture<br />
des textes conçus pour le cours. L’ordre dans lequel les activités sont présentées est<br />
l’ordre suggéré.<br />
Activités Temps suggéré Pondération<br />
Introduction au cours 2 heures Aucune<br />
Lectures et questionnaires<br />
15 heures Aucune<br />
du module 1<br />
(incluant l’installation<br />
logicielle)<br />
Travail noté 1 (questionnaire)<br />
5 heures 10 %<br />
Lectures et questionnaires<br />
10 heures Aucune<br />
du module 2<br />
Travail noté 2 (discussion 5 heures 5 %<br />
dans le forum et compte<br />
rendu)<br />
Travail noté 3 (rédaction) 15 heures 10 %<br />
Lectures et questionnaires<br />
10 heures Aucune<br />
du module 3<br />
(incluant la programmation<br />
XSLT et CSS)<br />
CC BY-NC-SA
Gestion du temps et pondération 9<br />
Activités Temps suggéré Pondération<br />
Travail noté 4 (programmation)<br />
20 heures 10 %<br />
Lectures et questionnaires<br />
10 heures Aucune<br />
du module 4<br />
(incluant la programmation<br />
Java)<br />
Travail noté 5 (programmation)<br />
20 heures 15 %<br />
Lectures et questionnaires<br />
5 heures Aucune<br />
du module 5<br />
Travail noté 6 (programmation)<br />
15 heures 10 %<br />
Examen 3 heures 40 %<br />
Total 135 heures 100 %<br />
Un deuxième tableau répartit les activités selon les semaines, en comptant une moyenne<br />
de 9 heures de travail par semaine, pendant 15 semaines. La participation au forum<br />
s’étale sur plusieurs semaines (environ les deux tiers du cours).<br />
Semaine<br />
Activités<br />
1 Présentation du cours, lectures et questionnaires<br />
(module 1)<br />
2 Lectures et questionnaires (module 1)<br />
3 Travail noté 1, lectures et questionnaires<br />
(module 2)<br />
4 Lectures et questionnaires (module 2),<br />
travail noté 2: forum<br />
5 Travail noté 3<br />
6 Forum, travail noté 3, lectures et questionnaires<br />
(module 3)<br />
7 Forum, lectures et questionnaires (module<br />
3)<br />
8 Forum, travail noté 4<br />
9 Forum, travail noté 4<br />
10 Forum, travail noté 4, lectures et questionnaires<br />
(module 4)<br />
11 Forum, lectures et questionnaires (module<br />
4), travail noté 5<br />
12 Forum, travail noté 5<br />
13 Forum, travail noté 5, lectures et questionnaires<br />
(module 5)<br />
14 Forum, lectures et questionnaires (module<br />
5), travail noté 6<br />
15 Forum, travail noté 6<br />
CC BY-NC-SA
Guide d’étude 10<br />
Semaine<br />
Activités<br />
Examen en salle<br />
À partir du tableau précédent, nous vous proposons un tableau semaine/module. Un<br />
« X » indique que des activités du module en question sont prévues pour une semaine<br />
donnée. L’astérisque signifie que vous devriez terminer le travail noté prévu pour ce<br />
module durant la semaine marquée.<br />
Semaine Module 1 Module 2 Module 3 Module 4 Module 5<br />
1 X<br />
2 X<br />
3 X* X<br />
4 X<br />
5 X<br />
6 X* X<br />
7 X<br />
8 X<br />
9 X<br />
10 X* X<br />
11 X<br />
12 X<br />
13 X* X<br />
14 X<br />
15 * Forum X*<br />
Version PDF du cours<br />
Le cours est non seulement disponible en XML sur le web, mais aussi en format PDF.<br />
En effet, un des avantages de la séparation du contenu et de sa présentation, tel qu’on<br />
l’enseigne dans le cours, c’est qu’on peut ensuite présenter l’information selon plusieurs<br />
formats. Dans ce cours, nous avons utilisé XSLT pour transformer le XML en<br />
PDF. La version papier que vous avez reçue, intitulée <strong>Manuel</strong> <strong>INF</strong> <strong>6450</strong> (version pdf),<br />
est une version pdf écourtée du cours; elle comprend le guide d’étude qui présente le<br />
cours, le contenu de chaque module et le travail noté qui lui est associé, ainsi que le<br />
glossaire, la webographie et les trois pense-bêtes, mais pas les questionnaires d’autoévaluation;<br />
ce manuel compte plus de 200 pages.<br />
Vous pouvez y accéder par le lien qui suit :<br />
– <strong>Manuel</strong> <strong>INF</strong> <strong>6450</strong> (1,2 Mo).<br />
Vous pouvez aussi accéder au manuel <strong>complet</strong> du cours par ce lien :<br />
– <strong>Manuel</strong> <strong>INF</strong> <strong>6450</strong> <strong>complet</strong> (1,6 Mo).<br />
CC BY-NC-SA
Remerciements 11<br />
Remerciements<br />
Le cours <strong>INF</strong> <strong>6450</strong> Gestion de l’information avec XML a été conçu par le professeur<br />
Daniel Lemire avec la collaboration de Kamel Aouiche, assistant de recherche, de Lucie<br />
Moulet, assistante de recherche, et du concepteur associé Jean-François Savard.<br />
Le professeur Lemire les remercie vivement; il remercie également les professeurs<br />
Koné Mamadou Tadiou (Université Laval), Richard Hotte (UQAM) et Marc Couture<br />
(UQAM), ainsi que le spécialiste en sciences de l’éducation Robert Ippersiel, qui ont<br />
effectué une lecture critique de la documentation du cours. Un des étudiants du cours,<br />
monsieur Dosseh Abiassi, a signalé plusieurs pages de coquilles.<br />
En outre, le professeur remercie chaleureusement Renée Dumas, spécialiste en communication<br />
écrite, pour son apport à la qualité linguistique du cours, pour son sens<br />
pédagogique de la communication et pour sa complicité dans cette aventure. Il remercie<br />
également l’équipe de production multimédia, dirigée par Jean-Charles Dormeux,<br />
pour leur sollicitude et leur professionnalisme.<br />
CC BY-NC-SA
Module 1 : Introduction à XML<br />
1.1 Aperçu<br />
1.1.1 Objectifs<br />
À la fin de ce module, vous devriez avoir une bonne idée de ce qu’est le XML et pouvoir<br />
facilement lire et écrire du XML simple. Les objectifs spécifiques du module sont :<br />
– Utiliser un vocabulaire ou une application XML pour présenter des informations en<br />
format XML;<br />
– Déterminer si un document XML est bien formé ou valable;<br />
– Interpréter des fichiers XML utilisant des espaces de noms.<br />
Avant d’entreprendre votre démarche dans ce module, nous vous invitons à lire le texte<br />
qui suit pour avoir un aperçu de ce qu’est le XML.<br />
1.1.2 Qu’est-ce que le XML<br />
Le XML ou Extensible Markup Language est une syntaxe générique utilisée pour formater<br />
des données avec des balises simples et lisibles. Par exemple, pour décrire un<br />
étudiant, une syntaxe XML possible serait :<br />
<br />
Tremblay<br />
Jean<br />
849490234<br />
<br />
Par la suite, si nous désirions décrire l’ensemble des étudiants inscrits à un cours, nous<br />
pourrions utiliser la syntaxe suivante :<br />
<br />
Introduction au traitement de texte<br />
13
Module 1 : Introduction à XML 14<br />
<strong>Téluq</strong><br />
<br />
<br />
Tremblay<br />
Jean<br />
849490234<br />
<br />
<br />
Hotte<br />
Richard<br />
8443444<br />
<br />
<br />
<br />
Dans ces exemples, observez la présence de texte entre les signes < et > : il s’agit de<br />
balises. Une balise marque le début ou la fin d’un élément. La balise marque<br />
le début de l’élément « cours », alors que la balise en marque la fin. Notez<br />
qu’un élément peut contenir d’autres éléments, et ainsi de suite.<br />
Cette nouvelle syntaxe a émergé dans les années 90, avec le développement du web.<br />
Depuis, le XML est devenu très courant dans l’industrie informatique et fait partie des<br />
notions de base que les informaticiens doivent maîtriser, au même titre que les bases<br />
de données ou la programmation orientée objet. Elle est caractérisée par la simplicité<br />
d’abord : le HTML et le XML ont un parent commun, le SGML qui était complexe<br />
et difficile à maîtriser; on a donc voulu « réparer » le SGML, en proposant des solutions<br />
plus simples. Entre autres choses, le web a permis d’observer que les technologies<br />
simples pouvaient être très puissantes; c’est ce qui en a fait toute la force : une technologie<br />
accessible, ouverte et avec un minimum de complexité.<br />
D’ailleurs, l’inventeur du web, Tim Berners-Lee a rapidement adopté le XML et en<br />
propose, depuis, une nouvelle vision qui repose entièrement sur le XML : le web sémantique.<br />
La prémisse étant que, si l’on sépare le contenu de la présentation, le web<br />
n’en sera que plus riche. En effet, on observe que les formats qui confondent la présentation<br />
et le contenu, tels que Microsoft Word ou le HTML, limitent la capacité de nos<br />
logiciels. Par exemple, il peut être difficile pour un logiciel de trouver automatiquement<br />
la deuxième section d’un texte placé sur le web et de la reformater automatiquement,<br />
pour qu’on puisse l’inclure dans un rapport annuel.<br />
1.1.3 Démarche<br />
Vous devez étudier et maîtriser le contenu de ce module avant de passer aux autres, car<br />
il est de base : il définit ce qu’est le XML et vous permet d’apprendre sa terminologie<br />
propre. Selon les sections de ce module, lisez les textes proposés, faites les activités<br />
suggérées, répondez aux questionnaires d’autoévaluation. Lorsque vous maîtrisez le<br />
CC BY-NC-SA
Installation de Mozilla Firefox 15<br />
contenu du module, réalisez la première activité d’application, le travail noté 1, avant<br />
de passer au module suivant.<br />
Nous vous suggérons d’étudier le module dans l’ordre suivant :<br />
– Installation de Mozilla Firefox<br />
– Création de documents XML, avec un éditeur de texte<br />
– Introduction à XML<br />
– Principes de XML<br />
– Définition de type de document (DTD), Relax NG et XML Schema<br />
– Validation des documents XML<br />
– Espaces de noms<br />
Le pense-bête présente quelques symboles importants sur les DTD et leur signification;<br />
dans la version imprimée du cours, il se trouve en annexe.<br />
1.2 Installation de Mozilla Firefox<br />
1.2.1 Objectif<br />
Installer le logiciel Firefox; l’utiliser pour naviguer dans le web ou ouvrir des documents<br />
sur votre ordinateur.<br />
1.2.2 Activité<br />
Si le système d’exploitation de votre ordinateur est Windows, vous utilisez sans doute<br />
Internet Explorer (IE), le navigateur internet fourni d’office avec ce système. Malheureusement,<br />
ce navigateur ne supporte pas pleinement le XML et XHTML et, pour ce<br />
cours, étant donné qu’une partie du contenu est en XML et XHTML, il est nécessaire<br />
d’utiliser un navigateur qui le supporte parfaitement. Nous vous demandons de télécharger<br />
un autre navigateur, soit Mozilla Firefox, dont le téléchargement est gratuit.<br />
Pour la version française de Mozilla Firefox, rendez-vous à l’adresse http://frenchmozilla.sourceforge.net/firefox/;<br />
lisez les informations, sélectionnez le fichier correspondant<br />
à votre système d’exploitation et téléchargez-le; lancez ensuite la procédure d’installation<br />
et suivez bien les directives données. Sous Windows, il est possible que vous<br />
deviez faire redémarrer votre ordinateur après l’installation. Il est nécessaire d’avoir<br />
Firefox 2.0 ou mieux pour suivre ce cours: vous pouvez vérifier la version que vous<br />
avez en tapant « about: » dans la boîte de saisie des URL.<br />
Quand l’installation sera terminée, vérifiez que vous pouvez utiliser Firefox pour naviguer<br />
dans le web avant de poursuivre le cours.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 16<br />
1.2.3 Installation de polices de caractères optionnelles<br />
Il se peut que votre navigateur vous avertisse de l’absence de certaines polices optionnelles<br />
la première fois que vous chargez une page contenant du MathML. Vous pouvez<br />
ignorer ces avertissements. Si vous le désirez, afin d’éviter ces avertissements, vous<br />
pouvez installer des polices de caractères supplémentaires qui sont sur le site du projet<br />
MathML de la fondation Mozilla. Ce n’est pas nécessaire dans le cadre de ce cours.<br />
1.2.4 Avertissement<br />
Firefox est constamment mis à jour par son équipe de développement. Il est possible<br />
que vous constatiez parfois des différences entre ce qui est annoncé dans le cours et le<br />
comportement de votre version de Firefox.<br />
1.2.5 Autres navigateurs<br />
Outre Firefox, les navigateurs Opera et Camino sont aussi compatibles avec les normes<br />
XML utilisées dans ce cours. Cependant, pour les fins des activités notées utilisant le<br />
navigateur et certaines fonctions du site web, il est nécessaire d’utiliser Firefox.<br />
1.2.6 Retour<br />
Avez-vous pu installer Firefox et naviguer dans le web Si oui, passez aux prochaines<br />
activités, sinon contactez votre personne tutrice ou cherchez encore un peu.<br />
1.3 Création de documents XML<br />
1.3.1 Objectif<br />
Créer des documents XML et les ouvrir avec le navigateur Firefox.<br />
1.3.2 Activité<br />
Il est facile de créer des documents XML sous Windows; il faut d’abord ouvrir un<br />
éditeur de texte. Tout éditeur de texte ferait l’affaire, mais avec Windows, Microsoft<br />
fournit par défaut Bloc-notes (NotePad). Pour ouvrir le Bloc-notes, il suffit d’aller dans<br />
le menu « Démarrer », sous « Accessoires », et de cliquer sur l’icône du Bloc-notes. Si<br />
vous utilisez un autre système d’exploitation que Windows, une petite recherche vous<br />
permettra de trouver rapidement un éditeur de texte déjà installé sur votre machine.<br />
Vous n’avez plus qu’à taper du code XML. Comme exercice, tapez le texte suivant :<br />
CC BY-NC-SA
Création de documents XML 17<br />
<br />
Ceci est mon premier document XML.<br />
<br />
Enregistrez-le ensuite sous le nom « premier.xml ». Malheureusement, le Bloc-notes<br />
a la fâcheuse habitude de toujours ajouter l’extension « .txt » à la fin des noms de<br />
fichiers. Donc, à chaque enregistrement, vous devrez sélectionner « Tous » dans la liste<br />
déroulante de « Type » de fichier, comme le montre la figure qui suit.<br />
Bloc-note<br />
opte par défaut pour le jeu de caractères (ou codage) ANSI ce qui, pour les fins de<br />
ce cours, correspond au jeu de caractères ISO-8859-1. Sous Windows XP ou mieux, on<br />
peut aussi sélectionner le jeu de caractères UTF-8.<br />
Ouvrez maintenant le fichier « premier.xml » dans Firefox, un navigateur qui sait reconnaître<br />
le XML; vous verrez alors apparaître votre document XML tel que vous l’avez<br />
tapé. Si vous avez fait une faute de syntaxe XML, Firefox vous l’indiquera.<br />
Le XML ressemble beaucoup au code HTML avec lequel sont créées les pages web.<br />
Nous reviendrons plus tard sur le HTML, après avoir étudié plus à fond le XML. Le<br />
module 2 comporte une activité d’introduction au HTML. Pour l’instant, retenez seulement<br />
qu’il est possible d’écrire le HTML comme du XML bien formé. L’exemple qui<br />
suit est un document HTML qui est aussi du XML bien formé.<br />
<br />
<br />
Bonjour<br />
<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 18<br />
Comme exercice facultatif, recopiez le texte précédent commençant par et se<br />
terminant par dans un fichier, en utilisant un éditeur de texte comme le Blocnotes,<br />
que l’on trouve dans les accessoires de Windows. Enregistrez le fichier sous le<br />
nom « test.html »; n’oubliez pas de sélectionner « Tous » dans la liste déroulante de<br />
« Type » de fichier, dans la boîte de dialogue d’enregistrement. Ensuite, ouvrez votre<br />
fichier avec le navigateur Firefox; vous devriez voir le texte « Bonjour » s’afficher.<br />
Ces quelques exemples montrent comment il est simple d’utiliser et de créer des fichiers<br />
XML. Le XML permet toutefois de faire beaucoup plus, comme d’échanger des<br />
messages entre des applications ou de décrire à un ordinateur le contenu d’un document.<br />
De la même façon, en utilisant le Bloc-notes, on peut créer des documents DTD (chapitre<br />
3 du module 1). Nous verrons que les documents DTD sont aussi des fichiers au<br />
format texte servant à spécifier, dans une certaine mesure, ce qui est permis et ce qui<br />
ne l’est pas dans un document XML.<br />
Autres éditeurs pour le XML<br />
Un produit commercial très recherché pour l’édition du XML est XMLSpy, en anglais<br />
seulement. C’est probablement l’éditeur XML le plus puissant sur le marché; il en<br />
existe une version d’essai gratuite.<br />
Un autre excellent éditeur pour le XML, gratuit et en anglais seulement, est jEdit.<br />
Comme cet éditeur est un programme Java, il faut installer une machine virtuelle Java<br />
au préalable, tel le SDK J2SE. En outre, on peut ajouter à jEdit le plugiciel XML<br />
qui permet de naviguer dans les documents XML et d’en assurer la validité. Le plugiciel<br />
XSLT permet aussi de tester des documents XSLT et des expressions XPath<br />
(module 3 du cours).<br />
Finalement, pour Windows seulement, Cooktop est un éditeur XML gratuit créé par<br />
Victor Pavlov. Il permet d’éditer des fichiers XML, DTD, et XSLT, en plus de manipuler<br />
des expressions XPath.<br />
Sous MacOS, l’éditeur gratuit Smultron est recommandé.<br />
1.3.3 Retour<br />
Avez-vous pu créer un document XML avec l’extension XML Est-ce qu’il s’est ouvert<br />
dans Firefox sans erreur Si oui, passez aux autres activités, sinon contactez votre<br />
personne tutrice ou cherchez encore un peu.<br />
CC BY-NC-SA
Introduction à XML 19<br />
FIG. .1 – Tim Bray en mai 2007 (photographie par Lou Springer).<br />
1.4 Introduction à XML<br />
1.4.1 Objectif<br />
Connaître les notions de base du XML.<br />
1.4.2 Activité<br />
Lisez le texte qui suit, puis répondez au questionnaire d’autoévaluation. Ce texte place<br />
la technologie XML dans son contexte.<br />
1.4.3 Quelques notions du XML<br />
Le XML est un « métalangage » permettant d’échanger de l’information, principalement<br />
sur le web. Il a été conçu par Tim Bray, Jon Bosak et de nombreux autres collaborateurs,<br />
entre 1996 et 1999. On dit que c’est un « métalangage » parce qu’il est une<br />
façon pratique de créer de nouveaux langages pour échanger des informations, mais<br />
qu’il ne constitue pas un langage en soi. Le XML n’essaie pas, par lui-même, de résoudre<br />
tous les problèmes : il fournit par contre les outils nécessaires pour que, dans<br />
tous les domaines, des individus puissent résoudre leurs problèmes. Ainsi, on dit que<br />
le XML est « extensible » (peut être étendu) et que c’est un métalangage : les deux<br />
affirmations vont dans le même sens et notent la capacité du XML à s’adapter à des<br />
besoins différents.<br />
I looked at it and I saw that the markup said what the information is,<br />
not what it looks like. Why isn’t everything this way I still basically am<br />
asking that question. (Tim Bray)<br />
Un document XML est essentiellement du texte contenant des balises. Une balise est<br />
un segment de texte commençant par < et se terminant par >, comme . Voici<br />
un exemple simple de document XML :<br />
CC BY-NC-SA
Module 1 : Introduction à XML 20<br />
<br />
Jean<br />
42<br />
<br />
Le XML est très présent sur le web et les documents XML peuvent être affichés par<br />
certains navigateurs récents, comme Internet Explorer et Firefox. On échange aussi le<br />
XML entre des logiciels et des serveurs sur le web, et le XML est de plus en plus utilisé<br />
en bureautique, comme format pour les traitements de texte par exemple. Comme un<br />
document XML est avant tout du texte, il n’est pas avantageux d’utiliser le XML pour<br />
stocker des informations de type multimédia (vidéo, musique); le champ d’application<br />
du XML demeure toutefois très vaste.<br />
Le XML définit une grammaire stricte et relativement simple de manière que les outils<br />
XML génériques puissent traiter tous les documents XML, peu importe leur domaine<br />
d’application. On dit d’un document qui respecte cette grammaire qu’il est bien formé.<br />
Ainsi, il n’est pas nécessaire d’utiliser des outils coûteux et propriétaires pour faire du<br />
XML.<br />
L’application la plus commune du XML correspond au scénario suivant. Un groupe de<br />
personnes travaillant dans un domaine particulier, disons l’industrie de la construction,<br />
ont besoin d’échanger des informations, par exemple le prix et la description des matériaux.<br />
Elles doivent s’entendre sur un format informatique commun de manière que<br />
tous les logiciels, écrits ou utilisés par les différents participants, puissent communiquer<br />
entre eux, sans problème. L’information pourra ainsi être transmise sans intervention<br />
humaine.<br />
Concrètement, on utilise le XML dans le contexte d’une application XML. Une application<br />
XML est un jeu de balises et son utilisation dans un domaine particulier, par<br />
exemple la musique ou la cuisine. On peut définir un jeu de balises et, dans une certaine<br />
mesure, son utilisation en se servant d’un document DTD, Relax NG ou XML<br />
Schema (sujets que nous étudierons plus tard dans le cours). Dans un sens, une application<br />
XML forme un langage. On dit d’un document XML qui respecte les normes<br />
d’une application XML donnée qu’il est valable : un document valable est bien formé.<br />
En théorie, on pourrait penser que l’importance du XML est mineure. En effet, n’est-il<br />
pas facile de s’entendre sur des formats communs L’expérience montre que ce n’est<br />
pas si facile. D’abord, définir avec rigueur un format de données est complexe. D’autre<br />
part, le développement de logiciels particuliers à chaque format est coûteux : avec un<br />
métalangage comme XML, on peut réutiliser souvent les mêmes librairies logicielles.<br />
Finalement, l’individu qui acquiert une expérience avec XML dans le contexte de l’industrie<br />
de la construction pourra facilement réutiliser cette expertise dans le domaine<br />
de la mode, par exemple. Il est plus facile de trouver des experts en XML que des<br />
experts dans un format de données, format particulier à un domaine pointu.<br />
Le XML n’est pas un langage de programmation bien qu’on puisse l’utiliser avec des<br />
langages comme Java (module 4). On se sert par contre de plus en plus du XML pour<br />
CC BY-NC-SA
Introduction à XML 21<br />
les fichiers de configuration des logiciels. Par exemple, il est probable que, si vous utilisez<br />
un serveur web dans votre entreprise, ce serveur ait des fichiers de configuration<br />
en XML. Un document XML ne fait rien : ce n’est qu’une source passive d’informations,<br />
comme n’importe quel document, comme des pages web.<br />
1.4.4 La philosophie du XML<br />
Le XML met à profit un principe essentiel à l’architecture du web : be conservative<br />
in what you do, be liberal in what you accept from others (soyez strict dans ce que<br />
vous produisez, mais généreux dans ce que vous acceptez). En d’autres mots, le XML<br />
fonctionne parce que les gens tentent le plus possible de produire du XML de qualité<br />
(bien formé et valable), mais ils acceptent que les autres fassent des entorses aux règles.<br />
C’est, en partie, ce qu’on entend lorsqu’on dit que le XML est « extensible ». Cette<br />
règle est parfois appelée la loi de Postel parce qu’elle fut rédigée par Jon Postel dans la<br />
spécification RFC 793.<br />
Par exemple, supposons que vous écriviez un logiciel qui s’attend à recevoir des commandes<br />
ayant la forme suivante.<br />
<br />
papier<br />
2<br />
<br />
Supposons maintenant que le logiciel qui émet les commandes est mis à jour et qu’il<br />
vous transmet dorénavant les commandes sous le format suivant.<br />
<br />
papier<br />
2<br />
oui<br />
<br />
Selon les principes du XML, votre logiciel doit continuer à fonctionner, il doit ignorer<br />
le nouvel élément qu’il ne connaît pas. En d’autres mots, votre logiciel doit être<br />
généreux et ne pas exiger une conformité parfaite. Tant qu’il dispose des informations<br />
dont il a besoin, votre logiciel doit continuer à fonctionner. C’est ce principe fondateur<br />
qui permet à des millions de personnes d’utiliser le XML pour s’échanger des données<br />
sans le moindre arbitrage. Plus généralement, les technologies XML tentent de fonctionner<br />
le plus correctement possible même si les données ne correspondent pas à ce<br />
qu’on attendait.<br />
Plus généralement, le XML respecte plusieurs principes fondamentaux qui lui accorde<br />
plusieurs bénéfices.<br />
– Il est facile d’entretenir et modifier au fil du temps une application basée sur XML.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 22<br />
– Le XML est modulaire : on peut décomposer les applications en plusieurs fichiers,<br />
on peut traiter séparément différents morceaux d’un même document XML.<br />
– Les spécifications XML minimisent la redondance sans la réduire à néant : il y a<br />
plusieurs façons de faire une même chose en XML, mais ce nombre est généralement<br />
limité. On a souvent le choix entre plusieurs stratégies, mais pas un trop grand<br />
nombre.<br />
– Les technologies XML tiennent compte des personnes ayant des handicaps, notamment<br />
parce que plusieurs modes de présentation sont possibles.<br />
– Le XML ne dépend pas d’une plate-forme particulière : que vous utilisiez Linux,<br />
Mac OS ou Windows, vous pouvez travailler avec le XML.<br />
– Le XML est international : le XML supporte toutes les langues, pas seulement l’anglais.<br />
– Le XML est extensible : on peut facilement faire évoluer les formats sans avoir à<br />
réécrire tous nos logiciels.<br />
– Il est facile d’apprendre le XML.<br />
– Il est facile pour un humain de lire du XML.<br />
– Le XML est efficace : un ordinateur peu puissant peut traiter du XML rapidement.<br />
– Le XML est un format textuel.<br />
– Le XML est simple.<br />
– Le XML assure la pérennité des informations.<br />
– Le XML permet l’interopérabilité des systèmes.<br />
– Un document XML peut être réutilisé facilement à plusieurs fins.<br />
– Le XML est stable : les spécifications ne changent pas trop souvent.<br />
– Le XML est universel : c’est un métalangage qui s’applique à un grand nombre de<br />
problèmes.<br />
1.4.5 Conclusion<br />
Le XML n’est pas une nouveauté scientifique. Le XML représente, par contre, un pas<br />
en avant parce que c’est un des rares méta-langages universel. Le XML est aussi fondé<br />
sur des principes importants comme la pérennité, la simplicité, etc. qui ne sont pas<br />
toujours présents en technologie de l’information.<br />
1.4.6 Questions d’auto-évaluation<br />
1. Parmi les affirmations suivantes, lesquelles s’appliquent à un document XML<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) Contient du texte.<br />
(b) Contient des balises.<br />
(c) Peut être affiché par certains navigateurs.<br />
(d) Exige des logiciels conçus spécifiquement pour le XML.<br />
2. Parmi les applications suivantes, lesquelles peuvent s’effectuer efficacement avec<br />
le XML Choisissez toutes les réponses qui s’appliquent.<br />
CC BY-NC-SA
Introduction à XML 23<br />
(a) Incorporer de la musique ou des vidéos.<br />
(b) L’échange de données entre les serveurs Internet.<br />
(c) Servir de format pour les logiciels de traitement de texte.<br />
3. Qu’est-ce qu’on veut dire quand on affirme que le XML est un métalangage<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) On peut l’utiliser aussi bien en anglais qu’en français.<br />
(b) On peut l’utiliser aussi bien avec Java, Perl, Python, C, C# ou C++.<br />
(c) Il n’y a pas d’ensemble de balises prédéfinies.<br />
4. Que signifie le « X » de XML Choisissez la bonne réponse parmi les choix<br />
suivants.<br />
(a) eXtraordinaire.<br />
(b) eXtensible.<br />
(c) eXceptionnel.<br />
5. Quelles affirmations s’appliquent à un document XML bien formé Choisissez<br />
toutes les réponses qui s’appliquent.<br />
(a) Il peut être lisible : un être humain peut plus facilement en comprendre le<br />
contenu que s’il était mal formé.<br />
(b) Il respecte la grammaire XML.<br />
(c) Il peut être lu par n’importe quel parseur XML générique.<br />
6. Laquelle des affirmations suivantes décrit une application XML Choisissez la<br />
bonne réponse parmi les choix suivants.<br />
(a) Il s’agit d’un programme logiciel utilisant XML.<br />
(b) Un jeu de balises favorisant l’interopérabilité.<br />
(c) Une application XML est nécessairement un document XML.<br />
7. Parmi ces affirmations, lesquelles s’appliquent à un document XML valable<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) Cela signifie seulement qu’il est bien formé.<br />
(b) Il correspond à une application XML.<br />
(c) Un document XML valable a reçu une certification par le W3C.<br />
(d) Les documents XML doivent être valables.<br />
(e) Il est bien formé.<br />
(f) Il respecte toutes les contraintes d’une application XML.<br />
8. Un document XML peut... Choisissez toutes les réponses qui s’appliquent.<br />
(a) Communiquer avec un serveur.<br />
(b) Être transmis à un serveur.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 24<br />
(c) Servir de fichier de configuration.<br />
(d) Servir de base de données.<br />
9. Le XML vise à remplacer le HTML. Choisissez la bonne réponse parmi les choix<br />
suivants.<br />
(a) Vrai.<br />
(b) Faux<br />
10. Je suis un des auteurs du XML... Choisissez toutes les réponses qui s’appliquent.<br />
(a) Tim Bray<br />
(b) Tim Berners-Lee<br />
(c) Jon Bosak<br />
(d) Jon Dvorak<br />
(e) Jim Gray<br />
11. Que signifie XML Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Example Markup Language.<br />
(b) Extra Markup Language<br />
(c) eXtensible Markup Language.<br />
1.4.7 Solutions<br />
1. (a) (Bonne réponse) Un fichier XML est essentiellement un fichier texte.<br />
(b) (Bonne réponse) Le XML se caractérise par des balises, par exemple<br />
, , , .<br />
(c) (Bonne réponse) En particulier, Mozilla Firefox supporte très bien les diverses<br />
spécifications XML.<br />
(d) Comme le XML est un format texte, tout logiciel qui supporte le format<br />
texte, tel le Bloc-notes de Microsoft, peut être utilisé avec le XML.<br />
2. (a) Un document XML étant un document de texte, il n’est pas efficace de<br />
stocker de la musique ou des vidéos dans un format XML.<br />
(b) (Bonne réponse) Le XML est idéal pour permettre aux serveurs et aux logiciels<br />
de communiquer entre eux. Le XML n’est pas limité aux documents,<br />
il peut aussi servir de format pour des données.<br />
(c) (Bonne réponse) Le XML est un excellent choix de format pour les documents<br />
en bureautique; les nouvelles versions de Microsoft Office ou d’<br />
Open Office utilisent maintenant le XML.<br />
3. (a) Ce n’est pas ce qu’on veut dire, mais il est vrai que le XML est international.<br />
(b) Ce n’est pas ce qu’on veut dire, mais il est vrai qu’on peut utiliser XML<br />
avec Java, Perl, Python, C, C# ou C++.<br />
CC BY-NC-SA
Introduction à XML 25<br />
(c) (Bonne réponse) C’est ce qu’on veut dire. Le choix des balises dépend<br />
entièrement de l’application. Ainsi, un scientifique utilisera peut-être des<br />
balises comme , , , alors qu’un comptable<br />
utilisera peut-être les balises , , .<br />
4. (a) Non.<br />
(b) (Bonne réponse) Oui. XML est l’acronyme de eXtensible Markup Language.<br />
Cela signifie que le XML peut être étendu et appliqué à toutes sortes<br />
de situations.<br />
(c) Non.<br />
5. (a) Non. Un document bien formé n’est pas nécessairement plus lisible par un<br />
humain.<br />
(b) (Bonne réponse) Oui. Le XML est doté d’une grammaire, ce qui signifie<br />
qu’on peut déterminer avec précision ce qui est permis et ce qui ne l’est<br />
pas dans un document XML.<br />
(c) (Bonne réponse) Oui. C’est là un des grands avantages du XML : un document<br />
XML bien formé peut être lu par n’importe quel logiciel XML<br />
générique.<br />
6. (a) Non.<br />
(b) (Bonne réponse) Oui. Le plus souvent, il s’agit d’un groupe d’utilisateurs<br />
du XML qui s’entendent sur le même ensemble de balises. Par exemple,<br />
les cuisiniers du monde pourrait s’entendre sur des balises servant à décrire<br />
des recettes; il s’agirait là d’une application XML.<br />
(c) Non.<br />
7. (a) Non. Un document valable sera bien formé, mais un document bien formé<br />
n’a pas à être valable.<br />
(b) (Bonne réponse) Oui. Un document valable doit respecter une définition de<br />
type de document qui documente une application XML spécifique.<br />
(c) Non.<br />
(d) Non. Un grand nombre de documents XML ne sont pas valables; par<br />
contre, ils doivent être bien formés.<br />
(e) (Bonne réponse) Oui, puisque tout document XML doit être bien formé,<br />
alors les documents XML valables doivent être bien formés.<br />
(f) Non, pas nécessairement. Être valable signifie seulement que le document<br />
répond à certains critères de base de l’application XML.<br />
8. (a) Non. Un document XML n’est qu’un document. Ce n’est pas un programme<br />
capable d’agir.<br />
(b) (Bonne réponse) Oui. On utilise beaucoup le XML pour transporter des<br />
données d’un serveur à un autre. Le XML étant une syntaxe neutre, qui ne<br />
dépend pas d’un logiciel particulier, tout le monde pourra le comprendre.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 26<br />
(c) (Bonne réponse) Oui, absolument. De plus en plus d’applications logicielles<br />
utilisent le XML à cette fin : un programme peut utiliser le XML<br />
pour y enregistrer de nombreuses informations, comme les options choisies.<br />
(d) Non. Le XML n’est qu’un format de fichier. On peut utiliser le XML dans<br />
une base de données relationnelles, par exemple, mais le XML ne possède<br />
pas en soi les capacités d’une base de données.<br />
9. (a) Faux, même s’il est possible d’écrire le HTML en XML.<br />
(b) (Bonne réponse) Vrai.<br />
10. (a) (Bonne réponse) Oui. Il a d’ailleurs un site web (anglais).<br />
(b) Non. Berners-Lee est l’inventeur du web; il s’intéresse beaucoup au XML,<br />
mais il a plutôt utilisé le SGML dans l’élaboration du web.<br />
(c) (Bonne réponse) Oui. Il a d’ailleurs un site web (anglais).<br />
(d) Non. Jon Dvorak est un journaliste américain qui n’a pas contribué au<br />
XML.<br />
(e) Non. Jim Gray est chercheur chez Microsoft, mais n’est pas l’un des créateurs<br />
du XML.<br />
11. (a) Non.<br />
(b) Non.<br />
(c) (Bonne réponse) Effectivement.<br />
1.5 Principes de XML<br />
1.5.1 Objectif<br />
Découvrir les grands principes du XML<br />
1.5.2 Activité<br />
Lisez le texte qui suit, puis répondez au questionnaire d’autoévaluation. Ce texte porte<br />
sur la syntaxe de base du XML. Les notions importantes sont la balise, l’élément,<br />
l’élément-racine et l’attribut.<br />
1.5.3 Quelques principes et notions importantes du XML<br />
Rappelons qu’une balise est un segment de texte commençant par < et se terminant<br />
par >. Par exemple, est une balise qui marque le début de l’élément vie. Une<br />
balise commençant par
Principes de XML 27<br />
Le nom XML de la balise est le texte suivant le symbole < (ou
Module 1 : Introduction à XML 28<br />
<br />
http://www.google.com<br />
Un moteur de recherche<br />
<br />
Dans ce document, il y a trois éléments. Tout d’abord, il y a l’élément-racine qui comprend<br />
tout ce qui est entre les balises et . La première balise marque<br />
le début de l’élément-racine. Tout document XML bien formé doit avoir un élémentracine<br />
et un seul élément-racine. Tous les autres éléments doivent être contenus dans<br />
cet élément-racine. Dans notre exemple, cet élément a deux sous-éléments :<br />
http://www.google.com<br />
et<br />
Un moteur de recherche<br />
On peut ajouter un attribut à un des éléments de la façon suivante :<br />
et <br />
Le texte date="aujourd’hui" est un attribut de l’élément-racine avec pour nom « date »<br />
et comme valeur d’attribut « aujourd’hui ».<br />
Tout le texte qui ne se trouve pas dans une balise, mais qui se trouve dans l’élémentracine<br />
se décompose en nœuds de texte. Par exemple, le document suivant contient un<br />
élément contenant un nœud de texte.<br />
mon texte<br />
1.5.4 Points importants dans la syntaxe de base<br />
Un document XML ne doit avoir qu’un et un seul élément appelé « élément-racine »,<br />
qui doit contenir tous les autres éléments.<br />
Il faut correctement ouvrir et fermer les éléments en séquence, ainsi <br />
n’a aucun sens en XML, il faut plutôt écrire ou alors<br />
.<br />
Les éléments peuvent eux aussi avoir des attributs, par exemple ,<br />
mais il faut obligatoirement mettre la valeur de l’attribut entre guillemets (") ou apostrophes<br />
(’).<br />
CC BY-NC-SA
Principes de XML 29<br />
1.5.5 Dans l’ordre ou dans le désordre<br />
Dans un document XML, l’ordre dans lequel les éléments sont présentés importe. Par<br />
exemple, les deux documents XML suivants ne sont pas équivalents.<br />
<br />
http://www.google.com<br />
Un moteur de recherche<br />
<br />
<br />
Un moteur de recherche<br />
http://www.google.com<br />
<br />
Par contre, l’ordre dans lequel les attributs sont présentés est sans importance. Les deux<br />
documents XML suivants sont donc équivalents.<br />
<br />
<br />
1.5.6 Appels d’entités<br />
Un élément peut contenir du texte, mais ne peut contenir le symbole <br />
" "<br />
' ’<br />
Ainsi, si le nom de votre compagnie est John&Smith, vous ne devrez pas utiliser un<br />
élément comme ceci John&Smith; il vous faudra plutôt utiliser<br />
John&Smith.<br />
Le texte « ]]> » s’écrit « ]]> ».<br />
CC BY-NC-SA
Module 1 : Introduction à XML 30<br />
On utilise aussi les appels d’entités pour noter les valeurs des attributs. Supposons que<br />
la valeur d’un attribut est un guillemet suivi d’une apostrophe ("’). Les deux choix<br />
possibles ne sont pas valables. Dans ce cas, il faudra<br />
écrire ,
Principes de XML 31<br />
La syntaxe d’une telle instruction de traitement est simple. L’instruction débute par <<br />
et se termine par >; immédiatement après
Module 1 : Introduction à XML 32<br />
1.5.10 La déclaration XML<br />
La déclaration XML ressemble à s’y méprendre à une instruction de traitement et prend<br />
la forme . Une déclaration XML n’est pas une balise ou un élément. Le<br />
contenu d’une déclaration XML comporte généralement au maximum trois attributs :<br />
version="...", encoding="..." et standalone="...". La version 1.0 du XML est la plus utilisée;<br />
bien que la version 1.1 existe, elle est fort peu utilisée. Selon l’un des inventeurs<br />
du XML, Tim Bray, il est peu probable qu’il y ait une version 2.0 du XML .<br />
Je ne pense pas qu’il y aura de XML 2.0. Les obstacles politiques seraient<br />
effrayants - tout le monde voudra sa part du gâteau -, et la base<br />
installée de logiciels qui reconnaissent XML comprend aujourd’hui à peu<br />
près tous les ordinateurs liés à Internet, donc une transition me semblerait<br />
trop onéreuse. (Interview de Tim Bray, JDN Développeurs, 29 janvier<br />
2007)<br />
On utilise souvent une déclaration XML avec « encoding="ISO-8859-1" » pour<br />
pouvoir utiliser les accents dans le document : les jeux de caractères Unicode ne<br />
sont pas toujours supporté par plusieurs outils logiciels n’ayant pas été mis à jour<br />
au vingt-et-unième siècle; l’utilisation des accents en français sans la déclaration<br />
« encoding="ISO-8859-1" » peut alors entraîner des problèmes. L’attribut « standalone<br />
» prend la valeur yes ou no, selon que l’on veut que la DTD externe soit lue ou<br />
non. Nous traiterons des DTD, plus tard.<br />
Dans ce cours, nous supposons que vous utilisez un éditeur de texte qui ne supporte<br />
pas les normes UTF-8 et UTF-16. En conséquence, le document XML suivant ne serait<br />
pas bien formé, car il utilise des accents :<br />
<br />
Jean<br />
<br />
Par contre, le document XML qui suit est bien formé :<br />
<br />
<br />
Jean<br />
<br />
La déclaration XML doit obligatoirement être au tout début du document ou être<br />
carrément absente : même un espace n’est pas permis.<br />
1.5.11 Les espaces<br />
En XML, les espaces entre les éléments comptent, qu’il s’agisse d’un retour de charriot,<br />
d’une tabulation ou d’un simple espace. Ainsi, le document suivant se décompose en<br />
CC BY-NC-SA
Principes de XML 33<br />
7 parties ou nœuds : un élément-racine nommé html qui contient d’abord un nœud de<br />
texte (le retour de charriot) suivi d’un élément produit contenant le nœud de texte « 1 »,<br />
suivi d’un autre nœud de texte (le retour de charriot), suivi d’un élément serie (vide),<br />
suivi d’un troisième nœud de texte (le retour de charriot).<br />
<br />
1<br />
<br />
<br />
Par contre ce document ne contient que 4 nœuds (3 éléments et 1 nœud de texte) :<br />
1<br />
En effet, comme il n’y a pas d’espace ou de retour de charriot entre les balises, il n’y a<br />
qu’un seul nœud de texte. Si on omet les attributs, les nœuds débutent et se terminent<br />
généralement avec les balises.<br />
On peut indiquer que les espaces entre les éléments sont significatifs avec l’attribut<br />
xml:space qui peut prendre la valeur default ou la valeur preserve. Dans cet exemple,<br />
on souhaite indiquer que les espaces sont significatifs :<br />
<br />
1<br />
<br />
<br />
1.5.12 Les fins de ligne<br />
Les fichiers de texte sont souvent organisés en lignes. Selon le système d’exploitation,<br />
il y a plusieurs façon de représenter une fin de ligne. Les systèmes d’exploitation Microsoft<br />
utilisent deux caractères (« retour de charriot » et « nouvelle ligne ») à la fin de<br />
chaque ligne. Les autres système utilisent généralement un seul caractère (« nouvelle<br />
ligne »). Les processeurs XML sont requis de normaliser la situation et de remplacer<br />
les deux caractères utilisés par les systèmes Microsoft par un seul caractère lors de la<br />
lecture du fichier. Ainsi, peu importe comment l’on note les fins de ligne, un processeur<br />
XML ne vera qu’un caractère « nouvelle ligne ».<br />
1.5.13 Les hyperliens<br />
Il arrive fréquemment qu’on utilise des hyperliens dans les documents XML. On distingue<br />
deux types d’hyperliens : les hyperliens contenant une adresse absolue (telle<br />
que http://domaine.ca/pong.png) et les hyperliens contenant des adresses relatives<br />
(pong.png). On reconnaît les adresses relatives parce qu’elles ne débutent pas par un<br />
protocole tel que http ou ftp. Pour compléter les adresses relatives et les transformer<br />
CC BY-NC-SA
Module 1 : Introduction à XML 34<br />
en adresses absolues, on utilise fréquemment l’adresse du document. Ainsi, si le document<br />
suivant se trouve à l’adresse http://domaine.ca/fichier.xml, alors un logiciel pourra<br />
charger une image située à l’adresse http://domaine.ca/pong.png :<br />
<br />
adresse relative:<br />
<br />
<br />
Le XML permet de spécifier un attribut xml:base qui sert à interpréter les adresses relatives<br />
remplaçeant l’adresse du document. Le document suivant pointe vers une image<br />
à l’adresse http://domaine.ca/image/pong.png :<br />
<br />
<br />
<br />
<br />
<br />
1.5.14 Documents bien formés<br />
Un document XML qui respecte ces règles de base est dit « bien formé ». Pour éviter<br />
la confusion, il ne faut pas utiliser des synonymes comme « correct ».<br />
La terminologie utilisée peut sembler très aride. Cependant, la rigueur qu’exige le XML<br />
est aussi garante de la cohérence. Comme tous les termes sont bien définis, il est plus<br />
facile de s’entendre entre experts. Comme le XML est surtout utilisé pour la communication<br />
entre les logiciels, la rigueur évitera plus tard les bogues et les incompréhensions.<br />
Pouvoir reconnaître un document XML bien formé ou comprendre pourquoi un document<br />
n’est pas bien formé, permet de s’assurer qu’un logiciel pourra traiter les informations,<br />
et qu’on saura quoi faire en cas de problème.<br />
1.5.15 Questions d’auto-évaluation<br />
1. Quelles sont les différences entre un attribut et un élément Choisissez toutes les<br />
réponses qui s’appliquent.<br />
(a) Un élément peut contenir d’autres éléments, mais un attribut ne peut contenir<br />
que du texte.<br />
(b) Tout document XML doit avoir au moins un attribut.<br />
(c) L’attribut est associé à un élément qu’il vient décrire.<br />
2. Quelles sont les balises du document suivant <br />
CC BY-NC-SA
Principes de XML 35<br />
<br />
http://www.google.com<br />
Un moteur de recherche<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) http://www.google.com, Un moteur de recherche.<br />
(b) , , , , , <br />
(c) http://www.google.com, Un moteur de recherche<br />
3. Lesquels de ces documents sont bien formés (syntaxe élémentaire) Choisissez<br />
toutes les réponses qui s’appliquent.<br />
(a)<br />
<br />
http://www.google.com<br />
Un moteur de recherche<br />
<br />
(b)<br />
<br />
http://www.google.com<br />
Un moteur de recherche<br />
<br />
(c)<br />
<br />
http://www.google.com<br />
<br />
<br />
(d)<br />
<br />
http://www.google.com<br />
<br />
<br />
4. Lesquels de ces documents sont bien formés (attributs) Choisissez toutes les<br />
réponses qui s’appliquent.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 36<br />
(a)<br />
(b)<br />
(c)<br />
(d)<br />
<br />
http://www.google.com<br />
un engin de recherche<br />
<br />
<br />
http://www.google.com<br />
un engin de recherche<br />
<br />
<br />
http://www.google.com<br />
un engin de recherche<br />
<br />
<br />
http://www.google.com<br />
un engin de recherche<br />
<br />
5. Lesquels de ces documents sont bien formés (sujets avancés) Choisissez toutes<br />
les réponses qui s’appliquent.<br />
(a)<br />
(b)<br />
(c)<br />
<br />
http://www.google.com<br />
un engin de recherche<br />
<br />
<br />
http://www.google.com<br />
un engin de recherche<br />
<br />
<br />
<br />
(d)<br />
CC BY-NC-SA
Principes de XML 37<br />
<br />
<br />
(e)<br />
(f)<br />
(g)<br />
(h)<br />
(i)<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
6. Voici un document XML.<br />
<br />
JeanLaroche<br />
<br />
GaetanRoche<br />
<br />
<br />
Choisissez l’arbre qui représente le mieux ce document. Choisissez la bonne<br />
réponse parmi les choix suivants.<br />
(a) classe<br />
– Etudiant<br />
– prenom<br />
– Jean<br />
– nom<br />
– Laroche<br />
– Etudiant<br />
– prenom<br />
– Gaetan<br />
CC BY-NC-SA
Module 1 : Introduction à XML 38<br />
– nom<br />
– Roche<br />
(b) classe<br />
– etudiant<br />
– prenom<br />
– Jean<br />
– nom<br />
– Laroche<br />
– etudiant<br />
– prenom<br />
– Gaetan<br />
– nom<br />
– Roche<br />
(c) classe<br />
– prenom<br />
– etudiant<br />
– Jean<br />
– etudiant<br />
– Gaetan<br />
– nom<br />
– etudiant<br />
– Roche<br />
– etudiant<br />
– Laroche<br />
7. Quels sont les noms des attributs dans le document suivant<br />
<br />
http://www.google.com<br />
Un moteur de recherche<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) categorie, type<br />
(b) "recherche", "court texte"<br />
(c) pageweb, lien, description<br />
(d) , , , , , <br />
8. Quelles sont les balises du document suivant<br />
<br />
http://www.google.com<br />
Un moteur de recherche<br />
<br />
CC BY-NC-SA
Principes de XML 39<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) categorie, type<br />
(b) "recherche", "court texte"<br />
(c) pageweb, lien, description<br />
(d) , , , , , <br />
9. Quels sont les noms des éléments du document suivant<br />
<br />
http://www.google.com<br />
Un moteur de recherche<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) categorie, type<br />
(b) "recherche", "court texte"<br />
(c) pageweb, lien, description<br />
(d) , , , , , <br />
10. Je suis un appel d’entité propre à tous les documents XML.<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) <<br />
(b) &<br />
(c) &pluspetit;<br />
(d) ><br />
(e) "<br />
(f) &guillemet;<br />
(g) '<br />
11. Pourquoi a-t-on besoin d’appel d’entités en XML<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Parce qu’on ne pourrait pas utiliser le symbole < dans le contenu textuel<br />
d’un élément; en effet, il marque le début d’une balise.<br />
(b) Parce qu’on ne pourrait pas utiliser le symbole > dans le contenu textuel<br />
d’un élément; en effet, il marque la fin d’une balise.<br />
(c) Parce que les caractères , ’, ", & sont interdits dans le contenu textuel<br />
d’un élément.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 40<br />
12. Lesquels de ces documents sont bien formés Choisissez toutes les réponses qui<br />
s’appliquent.<br />
(a)<br />
(b)<br />
(c)<br />
(d)<br />
<br />
caissier<br />
>10,000$<br />
<br />
<br />
5 mois ou "presque"<br />
10,000$<br />
<br />
<br />
magasinier<br />
>Daniel Lemire<br />
professeur<br />
<br />
<br />
Daniel Lemire<br />
professeur<br />
<br />
CC BY-NC-SA
Principes de XML 41<br />
(c)<br />
(d)<br />
(e)<br />
(f)<br />
<br />
Daniel Lemire<br />
professeur<br />
<br />
<br />
Daniel Lemire<br />
professeur<br />
<br />
<br />
Daniel Lemire --><br />
professeur<br />
<br />
<br />
<br />
Daniel Lemire<br />
professeur<br />
<br />
14. Lesquels de ces documents contenant des instructions de traitement sont bien<br />
formés (Rappelons qu’en XML, une instruction de traitement prend la forme<br />
avec la contrainte que le nom de l’instruction de traitement<br />
ne peut commencer par xml.<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a)<br />
(b)<br />
<br />
Daniel Lemire<br />
professeur<br />
<br />
<br />
DanielLemire<br />
professeur<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 42<br />
(c)<br />
<br />
<br />
Daniel Lemire<br />
professeur<br />
<br />
15. Lesquels de ces documents contenant une déclaration sont bien formés (Rappelons<br />
qu’en XML, la déclaration prend une forme similaire à une instruction de<br />
traitement, mais débute par xml, comme ceci . L’attribut<br />
version indique la version du métalangage XML utilisée et, dans ce cours, nous<br />
utilisons toujours la version 1.0.) Choisissez toutes les réponses qui s’appliquent.<br />
(a)<br />
(b)<br />
(c)<br />
<br />
<br />
Daniel Jacques<br />
bibliothéconomie<br />
<br />
<br />
<br />
<br />
Daniel Jacques<br />
bibliothéconomie<br />
<br />
<br />
<br />
<br />
Daniel Jacques<br />
bibliothéconomie<br />
<br />
16. Quelle forme doit prendre la déclaration XML Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) <br />
(b) <br />
(c) <br />
17. Est-ce que ce document est bien formé<br />
CC BY-NC-SA
Principes de XML 43<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
18. Un élément ne peut pas être vide en XML<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
19. Lequel de ces noms n’est pas permis pour un élément en XML<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) x1<br />
(b) 1x<br />
(c) Nx<br />
20. Lequel de ces noms est permis pour un élément en XML<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) xmlcourse<br />
(b) 7eleven<br />
(c) Joe Louis<br />
(d) Aucune de ces réponses<br />
21. Le XML préserve les espaces entre les éléments. Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
22. Combien de nœuds de texte contient le document suivant <br />
<br />
<br />
<br />
Daniel Jacques<br />
bibliothéconomie<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 44<br />
(a) 2<br />
(b) 5<br />
23. Il peut y avoir des nœuds de texte avant le début de l’élément-racine.<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
24. Il peut y avoir des nœuds de texte après la fin de l’élément-racine.<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
25. Un document qui comporte 12 balises doit avoir 6 éléments.<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
26. Considérons un document qui ne comporte que des élements et du texte, sans<br />
entités, sans instructions XML, etc. S’il comporte 12 balises, il peut avoir 12<br />
nœuds de texte<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
1.5.16 Solutions<br />
1. (a) (Bonne réponse) Correct. Dans ce sens, on peut dire qu’un élément est un<br />
concept plus général et plus riche.<br />
(b) C’est faux. Le document XML suivant n’a pas d’attribut:<br />
<br />
http://www.google.com<br />
Un moteur de recherche<br />
<br />
(c) (Bonne réponse) Correct. Un attribut dépend d’un élément donné, alors<br />
qu’un élément peut n’appartenir à aucun autre élément, s’il est l’élémentracine.<br />
2. (a) Non. Il s’agit là du contenu de deux éléments.<br />
(b) (Bonne réponse) Effectivement!<br />
CC BY-NC-SA
Principes de XML 45<br />
(c) Non. Il s’agit là de deux éléments.<br />
3. (a) (Bonne réponse) C’est un document XML valable.<br />
(b) Non. La balise de fermeture a une casse différente de la balise<br />
d’ouverture .<br />
(c) (Bonne réponse) La balise indique qu’il n’y a pas de<br />
contenu pour l’élément description ce qui est équivalent à .<br />
(d) (Bonne réponse) L’élément indique qu’il n’y<br />
a pas de contenu pour l’élément description, ce qui est équivalent à .<br />
4. (a) (Bonne réponse) Le texte categorie=’recherche’ signifie que l’élément possède<br />
l’attribut categorie ayant la valeur "recherche".<br />
(b) Le texte categorie=recherche n’est pas valable parce que la valeur d’attribut<br />
n’est pas entre guillemets ou apostrophes.<br />
(c) Une balise de fermeture, comme , ne<br />
peut avoir d’attribut.<br />
(d) (Bonne réponse) Le texte categorie="recherche" signifie que l’élément pageweb<br />
possède l’attribut categorie ayant la valeur "recherche", alors que le<br />
texte categorie="url" signifie que l’élément lien possède l’attribut categorie<br />
ayant la valeur "url".<br />
5. (a) (Bonne réponse) Effectivement. On peut avoir plusieurs attributs pour un<br />
élément.<br />
(b) Non. On ne peut avoir deux attributs portant le même nom pour un élément.<br />
(c) Non. Le symbole « $ » n’est pas permis dans le nom d’un attribut.<br />
(d) (Bonne réponse) Oui. On peut utiliser n’importe quelle chaîne de caractères<br />
comme valeur d’attribut.<br />
(e) Le symbole « » n’est pas permis dans le nom des attributs.<br />
(f) (Bonne réponse) Oui. Le symbole point (.) est permis dans le nom des<br />
attributs, en autant qu’il ne soit pas le premier caractère.<br />
(g) Le symbole point (.) est permis dans le nom des attributs, en autant qu’il<br />
ne soit pas le premier caractère.<br />
(h) (Bonne réponse) Oui. Les chiffres sont permis dans le nom des attributs, en<br />
autant qu’ils ne soient pas les premiers caractères.<br />
(i) Non. Les chiffres sont permis dans le nom d’un attribut en autant qu’ils<br />
ne soient pas les premiers caractères.<br />
6. (a) Non. Le document XML a un élément « etudiant », pas « Etudiant ». La<br />
casse est importante en XML.<br />
(b) (Bonne réponse) Oui!<br />
(c) Non. La structure du document XML est classe -> etudiant -> nom/prenom.<br />
7. (a) (Bonne réponse) Effectivement!<br />
CC BY-NC-SA
Module 1 : Introduction à XML 46<br />
(b) Non. Il s’agit là de la valeur des attributs.<br />
(c) Non. Il s’agit là du nom des éléments.<br />
(d) Non. Il s’agit là du nom des balises.<br />
8. (a) Non. Il s’agit là du nom des attributs.<br />
(b) Non. Il s’agit là de la valeur des attributs.<br />
(c) Non. Il s’agit là du nom des éléments.<br />
(d) (Bonne réponse) Oui. Il s’agit là du nom des balises.<br />
9. (a) Non. Il s’agit là du nom des attributs.<br />
(b) Non. Il s’agit là de la valeur des attributs.<br />
(c) (Bonne réponse) Oui. Il s’agit là du nom des éléments.<br />
(d) Non. Il s’agit là du nom des balises.<br />
10. (a) (Bonne réponse) Oui. Je représente le caractère .<br />
(e) (Bonne réponse) Oui. Je représente le caractère ".<br />
(f) Non. Les guillemets sont représentés par " .<br />
(g) (Bonne réponse) Oui. Je représente le caractère ’.<br />
11. (a) (Bonne réponse) Oui. Cet élément n’est pas bien formé : .<br />
(c) Non. Seuls les caractères < et & sont interdits.<br />
12. (a) (Bonne réponse) Oui. Le symbole > est permis.<br />
(b) (Bonne réponse) Oui. Les guillemets sont permis.<br />
(c) Non. Il faut remplacer < par <.<br />
(d) Non. Il faut remplacer & par &.<br />
13. (a) Non. Il n’est pas permis d’avoir un commentaire dans une balise.<br />
(b) (Bonne réponse) Oui. La partie est un commentaire.<br />
(c) (Bonne réponse) Oui. La partie est un commentaire<br />
où le symbole < est permis.<br />
(d) Non. Il n’est pas permis d’avoir deux tirets dans un commentaire.<br />
(e) Non. Il n’est pas permis d’avoir un commentaire dans un commentaire.<br />
(f) (Bonne réponse) Oui. Il est permis d’avoir un commentaire avant la première<br />
balise (début de l’élément-racine).<br />
CC BY-NC-SA
Principes de XML 47<br />
14. (a) Non. Il n’est pas permis d’avoir une instruction de traitement dans une<br />
balise.<br />
(b) (Bonne réponse) Oui. On peut mettre une instruction de traitement au sein<br />
d’un élément XML.<br />
(c) (Bonne réponse) Oui. On peut mettre une instruction de traitement avant la<br />
première balise (début de l’élément-racine).<br />
15. (a) (Bonne réponse) Oui. Observez que l’attribut « encoding » nous permet de<br />
spécifier la norme ISO-8859-1 qui, en pratique, signifie qu’on peut utiliser<br />
tous les caractères de la langue française, même dans les noms de balise.<br />
Par défaut, seuls les caractères de la langue anglaise sont permis (pas d’accent).<br />
(b) Non. Une seule déclaration XML est permise.<br />
(c) Non. La déclaration doit apparaître au tout début du document.<br />
16. (a) Non.<br />
(b) Non.<br />
(c) (Bonne réponse) Effectivement.<br />
17. (a) Non. La valeur de l’attribut doit être entre guillemets.<br />
(b) (Bonne réponse) Effectivement.<br />
18. (a) Non. Il peut être vide.<br />
(b) (Bonne réponse) Effectivement. Il peut être vide.<br />
19. (a) Oui, c’est permis.<br />
(b) (Bonne réponse) Ce n’est pas permis parce qu’il début par un chiffre.<br />
(c) C’est permis.<br />
20. (a) Un nom d’élément ne peut débuter par xml.<br />
(b) Ce n’est pas permis parce qu’il début par un chiffre.<br />
(c) Les espaces ne sont pas permis.<br />
(d) (Bonne réponse) Effectivement.<br />
21. (a) (Bonne réponse) Effectivement.<br />
(b) Les espaces peuvent avoir beaucoup d’importance en XML.<br />
22. (a) Il y en a davantage.<br />
(b) (Bonne réponse) En effet, il faut compter un nœud après le début de l’élément<br />
étudiant, mais avant le début de l’élément nom. Puis, il y a le texte<br />
Daniel Jacques. Ensuite, il y a un nœud de texte après la fin de l’élément<br />
nom et avant le début de l’élément cours. Puis, il y a le texte bibliothéconomie.<br />
Finalement, il y a un nœud de texte après l’élément cours, mais avant<br />
la fin du document.<br />
23. (a) Non, ce n’est pas possible.<br />
(b) (Bonne réponse) Effectivement.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 48<br />
24. (a) Non, ce n’est pas possible.<br />
(b) (Bonne réponse) Effectivement.<br />
25. (a) Non. Il pourrait y avoir jusqu’à 12 éléments vides.<br />
(b) (Bonne réponse) Effectivement.<br />
26. (a) Non. Un nœud de texte doit apparaître entre deux balises. On ne peut donc<br />
avoir plus de 11 nœud de texte.<br />
(b) (Bonne réponse) Effectivement.<br />
1.6 Définition de type de document<br />
1.6.1 Objectif<br />
Comprendre la notion de type de document et son rôle dans la définition de document<br />
valable.<br />
1.6.2 Activité<br />
Lisez le texte qui suit, puis répondez au questionnaire d’autoévaluation. Ce texte traite<br />
des définitions de type de document (DTD) qui servent à définir les documents XML<br />
valables.<br />
1.6.3 Document XML valable<br />
Nous avons vu ce qu’était un document XML bien formé : un seul élément-racine, les<br />
éléments ne se chevauchent pas, les noms XML ne commencent pas par un chiffre, et<br />
ainsi de suite. De plus, un document XML bien formé peut contenir n’importe quel élément<br />
et dans n’importe quel ordre, et tous les éléments peuvent contenir des attributs,<br />
et peu importe ceux-ci.<br />
En pratique, il est souvent suffisant pour les documents XML d’être bien formés, mais<br />
il arrive qu’on veuille imposer des contraintes supplémentaires aux éléments et attributs<br />
pouvant être utilisés. Par exemple, un élément « étudiant » pourrait posséder un<br />
numéro d’étudiant, mais pas l’inverse : un élément « numéro d’étudiant » ne pouvant<br />
contenir qu’un numéro et pas d’autres éléments. On peut aussi vouloir contraindre le<br />
contenu d’un document XML pour des raisons d’interopérabilité. Par exemple, si un<br />
groupe d’experts s’entendent sur un format XML pour un type de données, il est utile<br />
de pouvoir vérifier si un fichier XML donné correspond bien à ce sur quoi on s’est entendu.<br />
Un document XML qui est bien formé et qui respecte les contraintes définissant<br />
son type de document est dit valable (ou valide).<br />
CC BY-NC-SA
Définition de type de document 49<br />
En d’autres mots, un document XML qui est bien formé et qui, en plus, satisfait aux<br />
contraintes dictant quels éléments et attributs peuvent être utilisés, et dans quel ordre<br />
et avec quel contenu, est dit valable.<br />
1.6.4 Normes de définition de type de document<br />
Il y a plusieurs façons de définir des types de documents XML. L’approche la plus<br />
répandue, la plus ancienne et la plus simple, est la norme de définition de type de<br />
document (DTD). C’est la seule approche présentée dans ce cours. Les deux autres<br />
possibilités émergentes les plus répandues sont XML Schema et Relax NG.<br />
On fait généralement deux reproches à l’approche DTD : un document DTD n’est pas<br />
du XML et la norme n’est pas assez riche pour spécifier le contenu des documents<br />
XML avec finesse. En effet, L’approche DTD ne permet pas de déclarer qu’un contenu<br />
textuel doit être une date ou un nombre, et il n’y a pas de support pour les espaces de<br />
noms, sujet que nous traiterons plus loin dans ce module.<br />
D’un autre côté, la norme DTD est très répandue et tous les logiciels qui supportent<br />
XML supportent maintenant cette norme, incluant Java et Firefox. Les nouveaux formats<br />
comme XHTML 2.0 sont toujours publiés avec une spécification DTD. Les autres<br />
possibilités, comme XML Schema, Relax NG, Schematron et Examplotron, sont moins<br />
bien supportées.<br />
La norme XML Schema permet de définir avec une grande finesse des types de données<br />
comme une date ou un code de langue (« fr », « en »). Cette norme est très utile si on<br />
veut spécifier avec beaucoup de détail le format de nos documents XML. Comme vous<br />
pouvez le constater dans l’exemple suivant, la norme XML Schema permet non seulement<br />
de spécifier le nom des éléments et des attributs (« shipTo », « billTo », « comment<br />
», « items », « orderDate »), mais aussi leur type (« xsd:string », « xsd:decimal »,<br />
« xsd:date »).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 50<br />
<br />
<br />
<br />
La norme XML Schema est supportée en Java depuis la version 1.5. Il n’est pas nécessaire<br />
d’utiliser une librairie spécialisée.Elle est cependant sujette à des critiques très<br />
sévères de la part des experts en XML tels que Tim Bray (co-inventeur du XML) qui<br />
écrivait en novembre 2006 sur son blogue :<br />
Everybody who actually touches the technology has known the truth<br />
for years, and it’s time to stop sweeping it under the rug. W3C XML Schemas<br />
(XSD) suck. They are hard to read, hard to write, hard to understand,<br />
have interoperability problems, and are unable to describe lots of things<br />
you want to do all the time in XML. Schemas based on Relax NG, also<br />
known as ISO Standard 19757, are easy to write, easy to read, are backed<br />
by a rigorous formalism for interoperability, and can describe immensely<br />
more different XML constructs.<br />
En somme, XML Schema est trop difficile à utiliser et à comprendre. Tim Bray, ainsi<br />
que de nombreux autres experts, préconisent plutôt l’utilisation de Relax NG. Cette<br />
norme, comme XML Schema, possède plusieurs avantages sur la norme DTD : elle<br />
permet de spécifier des types de données (comme une date ou un nombre), supporte<br />
les espaces de noms, etc. De plus, la norme Relax NG est plus élégante techniquement<br />
et parfois plus simple que la norme XML Schema. Des formats importants comme<br />
l’Open Document Format, DocBook (format XML), TEI, XHTML 2.0 et Atom sont<br />
définis par RelaxNG plutôt que par XML Schema. (Une définition XML Schema sera<br />
sans doute produite pour le format XHTML 2.0.) Relax NG dispose aussi d’une syntaxe<br />
« compacte », qui n’est pas en XML contrairement au format par défaut de Relax NG,<br />
et que nous allons utiliser dans nos exemples. Voici un exemple de Relax NG :<br />
element addressBook {<br />
element card {<br />
element name { text },<br />
element email { text }<br />
}*<br />
}<br />
Cet exemple spécifie que le document XML doit avoir comme élément racine un élément<br />
« addressBook », contenant zéro ou plus éléments « card ». Un élément « card »<br />
doit obligatoirement contenir un élément « name » suivi d’un élément « email ». On<br />
trouve facilement des tutoriels de qualité sur Relax NG. L’un meilleur tutoriel est en<br />
anglais à l’adresse http://relaxng.org/compact-tutorial-20030326.html.<br />
Tout en étant plus élégante que la norme DTD, le format Relax NG est plus limitée que<br />
XML Schema puisqu’il ne permet que quatre types de contraintes sur le nombre d’occurences<br />
d’un élément (zeroOrMore comme dans notre exemple, optional, un nombre<br />
précis (comme une seule fois) et oneOrMore) alors que le XML Schema permet des<br />
contraintes beaucoup plus spécifiques. Cependant, la richesse de la norme XML Schema<br />
CC BY-NC-SA
Définition de type de document 51<br />
a un coût : il s’agit d’une norme beaucoup plus difficile à utiliser et à apprendre en pratique.<br />
On peut valider un document XML par rapport à une définition RelaxNG avec la librairie<br />
Jing (http://www.thaiopensource.com/relaxng/jing.html).<br />
On peut passer automatiquement d’un document DTD à un document XML Schema ou<br />
Relax NG avec un outil comme NekoDTD (http://people.apache.org/ andyc/neko/doc/<br />
dtd/conversions.html).<br />
En somme, la norme DTD n’est sans doute pas ce qui se fait de mieux, mais c’est<br />
de loin la norme la plus utilisée historiquement, et c’est celle que nous allons étudier<br />
en détail. Pour certaines applications, la norme DTD demeure supérieure aux alternatives<br />
mentionnées précédemment: la définition d’entités n’est pas possible en XML<br />
Schema ou Relax NG, par exemple. Si vous maîtrisez la norme DTD, vous n’aurez<br />
aucun mal à utiliser une autre norme comme Relax NG puisque les principes essentiels<br />
sont les mêmes. Notez que la webographie contient quelques liens vers les normes<br />
XML Schema et Relax NG.<br />
1.6.5 Documents valables utilisant la norme DTD<br />
Un document valable commence par une déclaration XML, comme celle qui suit :<br />
<br />
Elle est suivie d’une déclaration de type de document sous la forme , où l’on remplace les premiers trois points par le<br />
nom XML de l’élément-racine que le document doit avoir, et les deuxièmes<br />
trois points par une URL vers le document DTD. L’URL peut être absolue,<br />
comme « http://www.google.com/mydtd.dtd », ou locale, comme « madtd.dtd »<br />
ou « ../dtd/madtd.dtd ». Dans le second cas, il faut que le fichier DTD soit sur<br />
le disque, à l’endroit indiqué par rapport au fichier XML. Ainsi, dans l’exemple<br />
« ../dtd/madtd.dtd », il faudrait que le fichier « madtd.dtd » soit dans le répertoire<br />
« dtd », voisin du répertoire où se trouve le fichier XML. Ainsi, immédiatement après<br />
la déclaration XML, on pourrait avoir le texte suivant :<br />
<br />
où « baliseracine » est le nom de l’élément-racine du document, alors que le chemin<br />
« http://www.mondomain.com/madtd.dtd » nous dit où trouver le document DTD.<br />
Rappelons que l’attribut « encoding » nous donne le jeu des caractères. On choisit<br />
souvent « ISO-8859-1 », mais par défaut, XML utilise un jeu de caractères Unicode<br />
(UTF-8). Si le contenu est en français (avec les accents), il est essentiel que le fichier<br />
soit enregistré avec le jeu de caractères déclaré sinon on pourra constater des messages<br />
d’erreurs ou des accents manquants. L’attribut « standalone » permet au logiciel de<br />
décider, s’il est nécessaire, d’aller chercher la DTD externe avant de lire le fichier XML,<br />
CC BY-NC-SA
Module 1 : Introduction à XML 52<br />
même si, très souvent, un logiciel tel Mozilla Firefox ignore la consigne et ne va pas<br />
chercher la DTD externe. En gros, s’il y a une DTD externe, on utilisera l’attribut<br />
« standalone="no" », autrement on utilise « standalone="yes" ».<br />
1.6.6 La syntaxe des documents DTD<br />
Les documents DTD contiennent des instructions de la forme . Bien<br />
que celle-ci ait l’apparence d’une balise XML, ce n’est pas du XML. Dans une instruction,<br />
on met d’abord un nom XML qui correspond à un nom d’élément : par exemple,<br />
l’instruction « » définira ce qui peut être contenu dans<br />
un élément de nom « montant ». Tout ce qui suit le nom de l’élément dicte ce que<br />
l’élément peut contenir. Le plus souvent, on place la description du contenu entre parenthèses<br />
(« »), sauf pour les cas particuliers<br />
(« ANY » et « EMPTY ») définis plus loin. De façon courante, on définit le contenu<br />
d’un élément par une liste de noms XML, correspondant à des noms d’élément et séparés<br />
par des virgules. Par exemple, l’instruction « » nous informe qu’un élément « montant » doit contenir un élément « devise » suivi<br />
d’un élément « valeur ». Notons que l’ordre des éléments importe et que les instructions<br />
« » et « » ne sont pas équivalentes.<br />
Bien qu’on ne puisse exprimer toutes les possibilités, la syntaxe DTD permet tout de<br />
même de spécifier un grand nombre de règles. Par exemple, le symbole « » permet de<br />
spécifier qu’un élément peut être présent ou non (élément optionnel). Ainsi, l’instruction<br />
« » signifie que l’élément « montant »<br />
peut contenir un élément « devise » (ou non) et doit contenir un élément « valeur ».<br />
Si jamais l’élément « devise » apparaît, il doit apparaître avant l’élément « valeur ».<br />
Si jamais on veut qu’un élément soit optionnel et que, s’il apparaît, il puisse apparaître<br />
plus d’une fois, on utilise le symbole « * ». Ainsi, l’instruction « » signifie qu’on peut avoir zéro, un ou plusieurs éléments « devise »,<br />
puis un élément « valeur ». De la même façon, le symbole « + » est utilisé pour spécifier<br />
qu’un élément doit être présent, mais peut apparaître plus d’une fois.<br />
Au lieu d’utiliser la virgule, on peut utiliser le symbole « | » pour spécifier qu’un élément<br />
ou un autre peut apparaître. Ainsi, l’instruction « » signifie que l’élément « montant » peut contenir soit l’élément « devise<br />
», soit l’élément « valeur » (l’un ou l’autre, mais pas les deux ou aucun des deux).<br />
Finalement, on peut combiner le tout; par exemple, l’instruction « » signifie que l’élément « montant » peut contenir au moins un<br />
élément « devise » (et rien d’autre) ou alors, aucun, 1 ou plusieurs éléments « valeur ».<br />
Si jamais on veut qu’un élément puisse contenir du texte, on utilise le terme technique<br />
« #PCDATA » dans l’instruction DTD. Par exemple, l’instruction « » signifie que l’élément « montant » contient du texte et seulement<br />
du texte (pas d’éléments). Supposons maintenant qu’on veut permettre du contenu<br />
mixte, comme dans l’exemple qui suit :<br />
CC BY-NC-SA
Définition de type de document 53<br />
<br />
Ceci est du contenu mixte<br />
parce qu’il s’agit de mélange de texte et de<br />
balises.<br />
<br />
On pourrait penser que l’instruction « »<br />
permettra du texte ou des éléments « important », et c’est vrai; mais elle permet l’un<br />
(juste du texte) ou l’autre (juste un élément « important »), mais pas un mélange des<br />
deux. Pour pouvoir obtenir le résultat désiré, soit un mélange d’éléments « important »<br />
et de texte, il faut permettre la répétition du choix, comme dans l’instruction « ». Il s’agit de la seule façon de spécifier qu’on<br />
permet un mélange de texte et d’éléments (contenu mixte).<br />
Voyons un autre exemple de contenu mixte. Considérons l’instruction « ». Ce qu’elle signifie exactement, c’est que les éléments<br />
« montant » peuvent contenir un mélange de texte et des éléments « devise », comme<br />
l’exemple qui suit :<br />
<br />
Le montant est spécifié en dollars.<br />
<br />
On peut aussi utiliser « ANY » pour spécifier qu’un élément peut contenir n’importe<br />
quoi (n’importe quelle séquence d’éléments déclarés dans la DTD et du texte) ou<br />
« EMPTY » pour spécifier qu’un élément doit être vide (sans même un seul espace).<br />
C’est le seul cas où l’on n’utilise pas de parenthèses lors de la définition du contenu,<br />
comme dans ces exemples : et .<br />
Un document DTD prendra donc la forme d’un fichier en format texte contenant une<br />
suite d’instructions comme :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 54<br />
Notez qu’on écrit rarement de nouvelles DTD : dans un domaine particulier, il existera<br />
souvent des DTD déjà utilisées; sinon, on fera l’effort de les créer, mais qu’une seule<br />
fois. L’important demeure toutefois de pouvoir lire et comprendre les DTD.<br />
1.6.7 Exemple supplémentaire<br />
Pour s’assurer de bien comprendre, voyons un autre exemple :<br />
<br />
<br />
<br />
<br />
Cette DTD nous spécifie que l’élément « lettre » contient du mélange de texte et d’éléments<br />
« personne » (contenu mixte), alors que l’élément « personne » doit contenir un<br />
élément « age », suivi d’un élément « nom ».<br />
Par exemple, ce document XML serait valable :<br />
<br />
<br />
<br />
<br />
]><br />
<br />
Ceci est une lettre pour<br />
51Jean.<br />
<br />
Assurez-vous de bien comprendre pourquoi ce document est valable avant de continuer.<br />
1.6.8 Les attributs<br />
Par défaut, aucun élément n’est autorisé à avoir un attribut. Pour permettre d’ajouter un<br />
attribut à un élément, il faut une instruction de la forme qui spécifie que l’élément recipiendaire peut avoir un attribut « age ». On permet généralement<br />
aux valeurs d’attribut de contenir n’importe quel texte, ce qu’on représente<br />
par « CDATA ». Hormis le contenu, il existe deux types d’attributs : les attributs obligatoires<br />
(« #REQUIRED ») et les attributs optionnels (« #IMPLIED »). Par exemple,<br />
l’instruction « » signifie qu’on<br />
CC BY-NC-SA
Définition de type de document 55<br />
peut (ou pas) accorder à un élément « recipiendaire » un attribut nommé « age » pouvant<br />
contenir n’importe quel texte. Si l’on désire que l’attribut soit obligatoire, on utilise<br />
une instruction comme « ».<br />
Si l’on veut permettre à un élément d’avoir plusieurs attributs, on peut le faire en utilisant<br />
plusieurs instructions comme dans « »; on peut aussi<br />
combiner les instructions dans une seule : « ». Cependant, il n’est pas possible de spécifier<br />
l’ordre dans lequel les attributs doivent apparaître, les instructions « » et « » sont<br />
équivalentes.<br />
L’attribut « xml:lang » utilisé pour définir la langue d’un texte, peut être déclaré comme<br />
ceci : « ». L’attribut xml:space<br />
peut être déclaré comme ceci : « ».<br />
On peut également spécifier qu’un élément donné a toujours un attribut donné (indiqué<br />
ou non dans le XML) comme ceci : « ». Dans ce dernier exemple, tous les éléments « recipiendaire » ont l’attribut<br />
« age="40 ans" », même si on omet de l’indiquer dans la balise de départ de l’élément<br />
« recipiendaire ».<br />
Plus simplement, on peut spécifier une valeur par défaut qui ne prendra effet que si<br />
l’on n’a pas explicitement indiqué l’attribut. Par exemple, l’instruction « » signifie que l’élément « recipiendaire » aura<br />
l’attribut « age="40 ans" », à moins qu’on ne spécifie autre chose dans le XML.<br />
Il peut être utile de donner une liste de valeurs que pourra prendre un attribut. Par<br />
exemple, une pièce de monnaie est soit sur « face », soit sur « pile » : il n’y a que<br />
deux choix. Si la liste de choix est composée de textes sans espace ou ponctuation,<br />
sauf la barre du soulignement ( _ ), le trait d’union ( - ) et le point ( . ), alors on peut<br />
faire une énumération comme dans l’exemple suivant : « ». On peut aussi spécifier une valeur par défaut, si l’on suppose,<br />
jusqu’à preuve du contraire, que la pièce est dans la position « face », comme<br />
ceci « »<br />
On peut également spécifier qu’un attribut servira à identifier un élément de façon<br />
unique. Pour ce faire, on utilise une instruction comme « ». Il n’est pas possible, pour deux attributs de type ID, d’avoir la même valeur<br />
dans un même document XML. En somme, si l’on donne une valeur « ID », elle devrait<br />
correspondre de façon unique à un élément et un seul. Un attribut de type « ID » doit<br />
avoir comme valeur un « nom XML », c’est-à-dire un texte sans espace ou ponctuation,<br />
sauf la barre du soulignement ( _ ), le trait d’union ( - ) et le point ( . ), et qui ne<br />
commence pas par un chiffre, un trait d’union ou un point.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 56<br />
On peut faire référence aux attributs de type « ID » avec des attributs de<br />
type « IDREF ». La valeur d’un attribut « IDREF » doit non seulement être un<br />
nom XML, mais doit aussi avoir un attribut de type « ID » qui possède cette même<br />
valeur quelque part dans le document XML. Par exemple, si on a l’instruction « », on pourra ensuite faire référence à l’élément ayant<br />
une valeur d’attribut « code » particulière, avec une instruction comme « ».<br />
Dans ce contexte, le document XML qui suit n’est pas valable :<br />
<br />
<br />
<br />
<br />
<br />
Par contre, l’exemple qui suit est valable :<br />
<br />
<br />
<br />
<br />
<br />
Il existe d’autres types d’attributs, mais ils sont peu utilisés.<br />
1.6.9 Les entités<br />
Vous vous rappelez sans doute que le XML définit quelques entités par défaut, « < »,<br />
par exemple. On peut toutefois définir ses propres entités avec une instruction DTD<br />
comme celle-ci :<br />
<br />
La signification de ce dernier exemple, c’est que partout où « &monentite; » apparaît<br />
dans un document, il sera remplacé par le texte « Introduction à XML ». Ce remplacement<br />
s’applique aussi aux valeurs par défaut des attributs de la DTD.<br />
On peut mettre des éléments et des attributs dans une entité comme dans cet exemple :<br />
<br />
Il n’est cependant pas permis de ne mettre qu’une partie d’un élément comme ceci :<br />
<br />
CC BY-NC-SA
Définition de type de document 57<br />
Une entité peut faire appel à une autre entité :<br />
<br />
<br />
Une entité ne peut cependant pas faire appel à elle même de manière récursive, directement<br />
ou indirectement. Cet exemple n’est donc pas valable :<br />
<br />
<br />
1.6.10 DTD interne et externe<br />
Normalement, on fait référence à un document DTD à l’aide d’une URL, c’est ce qu’on<br />
appelle la DTD externe. Mais il est possible d’ajouter ses propres instructions DTD<br />
directement dans le document XML, en ajoutant une DTD interne qui est lue avant la<br />
DTD externe.<br />
Prenons l’exemple suivant, soit un document XML qui débute par :<br />
<br />
<br />
Dans ce cas, tout ce passe comme si on ajoutait la ligne « » à la DTD externe. Normalement, il ne devrait jamais y avoir de conflit entre<br />
les deux DTD (interne et externe); on ne peut pas redéfinir un élément, mais on peut<br />
y définir des éléments!<br />
Par contre, les entités peuvent être redéfinies et la définition trouvée dans le DTD interne<br />
l’emporte.<br />
On peut même omettre complètement la DTD externe comme dans l’exemple suivant :<br />
<br />
<br />
<br />
]><br />
CC BY-NC-SA
Module 1 : Introduction à XML 58<br />
1.6.11 Les entités paramètres<br />
On peut aussi définir des entités particulières qui ne s’appliquent que dans le contexte<br />
de la DTD, et non pas dans le document XML. Pour ces entités, au lieu d’utiliser<br />
l’esperluette ( & ), on utilise plutôt le symbole du pourcentage ( % ). Ainsi, l’instruction<br />
suivante :<br />
<br />
signifie que partout, dans la DTD externe, où se trouve le texte « %monentite; », il sera<br />
remplacé par « #PCDATA|age* »; on appelle ces entités des « entités paramètres ». On<br />
peut définir une entité paramètre dans la DTD interne, mais on ne peut pas l’y utiliser;<br />
elle doit être utilisée dans la DTD externe. Si l’entité paramètre « %monentite; » est<br />
définie, à la fois dans la DTD interne et dans la DTD externe, la DTD interne a préséance.<br />
En somme, les entités paramètres ne s’appliquent que dans la DTD externe;<br />
elles ne s’appliquent ni dans le document XML, ni dans le DTD interne, soit la partie<br />
de la DTD définie dans le document XML.<br />
1.6.12 Commentaires dans les fichiers DTD<br />
Pour rendre un fichier DTD plus compréhensible, on peut ajouter des commentaires.<br />
La syntaxe est la même que pour les fichiers XML comme le montre l’exemple suivant.<br />
<br />
<br />
<br />
<br />
<br />
<br />
Les commentaires dans les fichiers Relax NG non-textuel sont obtenus en débutant une<br />
ligne par le symbole « # » comme dans cet exemple.<br />
element addressBook {<br />
# les éléments addressBook contiennent 0, 1, ou plusieurs<br />
# éléments card<br />
element card {<br />
# les éléments card contiennent un élément<br />
# name et un élément email<br />
element name { text },<br />
element email { text }<br />
}*<br />
}<br />
CC BY-NC-SA
Définition de type de document 59<br />
1.6.13 Une comparaison entre Relax NG et DTD<br />
Une fois qu’on connaît bien le format DTD, il est facile d’apprendre Relax NG. Prenons<br />
d’abord un de nos exemples de fichier DTD.<br />
<br />
<br />
<br />
<br />
Une étude attentive vous permettra de constater que ce fichier est très similaire au<br />
fichier Relax NG suivant, qui lui est essentiellement équivalent.<br />
element lettre {<br />
# un élément lettre contient<br />
# du texte et des éléments<br />
# personne<br />
(text<br />
| element personne {<br />
# un élément personne<br />
# contient un élément age<br />
# suivi d’un élément nom<br />
element age {text},<br />
element nom {text},<br />
}<br />
)*<br />
}<br />
Pour bien comprendre, prenons un autre exemple, plus complexe cette fois-ci. Voici un<br />
autre fichier DTD discuté précédemment.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Voici l’équivalent en Relax NG. Si vous l’étudiez avec soin, vous verrez qu’encore une<br />
fois, le format Relax NG est très similaire au format DTD.<br />
element problemset {<br />
CC BY-NC-SA
Module 1 : Introduction à XML 60<br />
(<br />
element title { text } ,<br />
element recall {<br />
( text<br />
| element section {text}<br />
| element codexml {text}) *<br />
} ,<br />
element item {<br />
element question {text},<br />
element choice {<br />
element response { text},<br />
element feedback {text}<br />
}+<br />
} *<br />
)*<br />
}<br />
Prenons maintenant un exemple de fichier DTD contenant un attribut.<br />
<br />
<br />
<br />
<br />
<br />
<br />
L’équivalent Relax NG est, encore une fois, assez compréhensible comme vous pourrez<br />
le constater, l’instruction ATTLIST étant remplacée par l’instruction « attribute ».<br />
element lettre {<br />
# un élément lettre contient<br />
# du texte et des éléments<br />
# personne<br />
(text<br />
| element personne {<br />
# une élément personne<br />
# contient un élément age<br />
# suivi d’un élément nom<br />
# et, optionnellement, d’un<br />
# élément estunhomme qui est<br />
# obligatoirement vide,<br />
# l’élément personne peut aussi<br />
# avoir un attribut nas<br />
attribute nas {text},<br />
element age {text},<br />
CC BY-NC-SA
Définition de type de document 61<br />
}<br />
)*<br />
element nom {text},<br />
element estunhomme {empty}<br />
}<br />
Lorsqu’on utilise l’instruction attribute, la présence de l’attribut est requise à moins<br />
d’ajouter le point d’interrogation (« ») à la suite de l’instruction.<br />
Le format Relax NG permet aussi de définir des motifs qui peuvent être réutilisés.<br />
Prenons ce fichier DTD simple.<br />
<br />
<br />
L’équivalent en Relax NG donne ceci.<br />
carte = element carte { page }<br />
page = element page { carte }<br />
Le format Relax NG a cependant plusieurs avantages. Par exemple, l’esperluette (&)<br />
permet de spécifier que des éléments puissent être inclus dans n’importe quel ordre. Il<br />
n’y a pas d’équivalent en DTD. Considérons l’exemple suivant.<br />
element addressBook {<br />
element card {<br />
element name { text }<br />
& element email { text }<br />
}*<br />
}<br />
On peut alors permettre le XML suivant. Il n’est pas possible de spécifier le contenu de<br />
l’élément card avec une instruction DTD similaire.<br />
<br />
Jeanl@c<br />
l@cJean<br />
<br />
Supposons maintenant qu’un élément puisse avoir soit l’attribut nas, soit à la fois les<br />
attributs nas1 et nas2. Alors qu’il n’est pas possible de représenter cette condition en<br />
DTD, c’est une chose facile en Relax NG.<br />
element homme {<br />
( attribute nas {text} |<br />
(<br />
attribute nas1 {text},<br />
CC BY-NC-SA
Module 1 : Introduction à XML 62<br />
}<br />
)<br />
)<br />
attribute nas2 {text}<br />
Vous êtes invité à poursuivre vos lectures sur le format Relax NG en faisant des recherches<br />
sur le web.<br />
1.6.14 Une approche plus modulaire<br />
En pratique, les fichiers DTD et Relax NG peuvent devenir complexes. On souhaite<br />
donc souvent les diviser en plusieurs fichiers plus petits. Par exemple, pour une spécification<br />
portant des ventes et achats de biens, on pourra avoir un fichier portant sur<br />
la description des biens, un fichier portant sur la description des acheteurs, et ainsi de<br />
suite. Une approche modulaire, avec de petits fichiers, a aussi l’avantage qu’on peut<br />
réutiliser les fichiers dans plus d’une spécification.<br />
À titre d’exemple, reprenons le fichier DTD portant sur la définition de l’élément « problemset<br />
». Au lieu de définir tout d’un seul coup, on peut commencer par un fichier<br />
DTD qui ne définit que l’élément « choice » :<br />
<br />
<br />
<br />
Pour les fins de notre exemple, supposons que ce dernier fichier porte le nom de<br />
« choice.dtd » et se trouve à l’adresse « http://www.mondomaine.com/choice.dtd ».<br />
On pourra alors en importer le contenu dans un autre fichier externe avec une « entité<br />
paramètre externe ». À la différence d’une entité paramètre usuelle, une entité paramètre<br />
externe pointe vers un autre document que le logiciel devra traiter. On définit<br />
l’entité paramètre externe avec l’instruction « SYSTEM » suivie d’une adresse web<br />
comme dans cet exemple :<br />
<br />
Pour inclure le contenu du fichier externe (« choice.dtd » dans notre exemple), il suffit<br />
tout simplement de faire appel à l’entité comme ceci :<br />
<br />
%monentite;<br />
Dans ce cas, tout se déroule comme si le contenu du fichier « choice.dtd » était inséré à<br />
l’endroit où se trouve l’appel (« %monentite; »). On peut définir l’élément « problemset<br />
» à l’aide du fichier DTD suivant :<br />
CC BY-NC-SA
Définition de type de document 63<br />
<br />
%monentite;<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
On peut obtenir le même résultat avec Relax NG, un peu plus simplement avec l’utilisation<br />
de l’instruction « include ». Créons d’abord un fichier « choice.rnc » avec le<br />
contenu suivant :<br />
choiceele = element choice {<br />
element response { text},<br />
element feedback {text}<br />
}<br />
On peut alors réutiliser le motif « choiceele » dans n’importe quel autre fichier Relax<br />
NG comme le montre cet exemple :<br />
include "choice.rnc"<br />
element problemset {<br />
(<br />
element title { text } ,<br />
element recall {<br />
( text<br />
| element section {text}<br />
| element codexml {text}) *<br />
} ,<br />
element item {<br />
element question {text},<br />
choiceele+<br />
} *<br />
)*<br />
}<br />
En bref, il est facile de diviser des spécifications Relax NG ou DTD en plusieurs fichiers<br />
plus petits, plus faciles à éditer, et qui peuvent être plus facilement réutilisés.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 64<br />
1.6.15 Définir l’élément-racine<br />
Avec une DTD, il n’est pas possible de définir l’élément-racine. Celui-ci est déclaré<br />
par l’instruction DOCTYPE qui se trouve dans le document XML. Avec Relax NG,<br />
on peut non seulement spécifier l’élément-racine avec le mot-clef start, mais on peut<br />
aussi permettre une certaine flexibilité. Par exemple, l’instruction « start = problemset<br />
| choice » placée dans un fichier Relax NG, nous indique qu’on peut utilisé l’élément<br />
problemset ou l’élément choice comme élément-racine.<br />
1.6.16 Définir le type de contenu en Relax NG<br />
Dans tous nos exemples de Relax NG, nous n’avons prévu que du contenu textuel (text)<br />
ou des éléments vides (empty). Relax NG permet de spécifier le contenu d’un élément<br />
ou d’un attribut d’une manière très fine. Il emprunte ici la spécification mise au point<br />
par XML Schema. En particulier, on peut spécifier un contenu textuel à l’aide d’une<br />
expression régulière. Voici quelques exemples.<br />
Type Explication Exemple<br />
xsd:date<br />
xsd:dateTime<br />
xsd:string pattern =<br />
"[ˆ:]+"<br />
xsd:string pattern =<br />
".+/.+"<br />
xsd:string pattern =<br />
".+@.+"<br />
Une date formattée avec<br />
la convention YYYY-<br />
MM-DD<br />
Un moment spécifique à<br />
la seconde près<br />
Une chaîne de caractères<br />
contenant au moins un<br />
caractère, à l’exclusion<br />
du symbole :<br />
Deux chaînes de caractères<br />
séparée par un caractère<br />
/<br />
Deux chaînes de caractères<br />
séparée par un caractère<br />
@<br />
2001-01-01 ou 1999-12-<br />
30<br />
2000-12-31T03:32:00<br />
maison<br />
01/01<br />
lala@to.com<br />
"text" | "html" text ou html text<br />
xsd:string min- Une chaîne caractères faisant<br />
monmotdepasse<br />
Length="7" max-<br />
entre 7 et 25 carac-<br />
Length="25"<br />
tères<br />
xsd:decimal minExclusive="0.0"<br />
Un nombre entre 0 et 10 5<br />
maxInclu-<br />
sive="10.0"<br />
xsd:decimal fractionDigits="3"<br />
Un nombre n’ayant pas 5.001<br />
plus de 3 chiffres après la<br />
virgule (le point)<br />
CC BY-NC-SA
Définition de type de document 65<br />
On déclare ensuite le contenu d’un élément ou d’un attribut comme ceci : element<br />
madate xsd:date.<br />
1.6.17 Est-ce qu’il existe un outil pour passer d’un format à l’autre<br />
(DTD, Relax NG, XML Schema)<br />
Oui, le programme Java Trang (http://www.thaiopensource.com/relaxng/trang.html)<br />
permet de passer facilement d’un format à l’autre.<br />
1.6.18 Est-ce qu’un document DTD est un document XML<br />
Absolument pas. Par contre, une DTD est un document textuel. Les fichiers<br />
XML Schema sont par contre toujours en XML, alors que les fichiers Relax NG sont<br />
parfois en XML, parfois en simple format textuel comme dans nos exemples.<br />
1.6.19 Pourquoi est-ce qu’il n’est pas suffisant d’utiliser des documents<br />
bien formés À quoi sert la validation<br />
Les documents XML sont faits pour être échangés et assurer la pérennité des informations.<br />
Si plusieurs individus ou plusieurs institutions s’entendent sur une DTD commune,<br />
il sera beaucoup plus facile d’échanger de l’information.<br />
1.6.20 Est-ce vraiment nécessaire d’avoir des documents valables<br />
Est-ce que je dois vraiment toujours travailler avec des fichiers<br />
DTD, XML Schema ou Relax NG<br />
En pratique, la validation n’est pas essentielle et une application logicielle ne devrait<br />
pas exiger des documents valables. Si vous concevez une application, la règle implicite<br />
est que toute balise ou attribut non prévue devrait être ignorée. Un navigateur qui sait<br />
lire et afficher du XML devrait pouvoir lire tout XML bien formé, même s’il n’est pas<br />
valable. Si vous inventez une nouvelle balise XHTML, le navigateur devrait tout simplement<br />
ne pas en tenir compte. Les concepteurs du XML n’ont pas inscrit la nécessité<br />
d’être valable à même la définition du XML et c’est un choix qui n’a jamais été remis<br />
en question par l’organisme de normalisation W3C.<br />
Il arrive, par exemple, qu’il soit inutilement complexe d’exiger que les documents<br />
soient bien formés. Si on se contraint à des documents bien formés, on peut même<br />
en arriver à des solutions qui sont techniquement inférieures. Pour quelques exemples,<br />
voir l’article (en anglais) « Must Ignore vs. Microformats » d’Elliotte Rusty Harold à<br />
l’adresse http://cafe.elharo.com/xml/must-ignore-vs-microformats/.<br />
Consultez le pense-bête DTD pour avoir une vue d’ensemble et pour réviser.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 66<br />
1.6.21 Livres de référence<br />
– Eric van der Vlist, Relax NG, O’Reilly Media, 2003, 486 pages.<br />
– Priscilla Walmsley, Definitive XML Schema, Prentice Hall Trade, 2001.<br />
1.6.22 Questions d’auto-évaluation<br />
1. Combien de DTD peut avoir un document XML Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) Une seule.<br />
(b) Autant qu’on veut.<br />
2. Il est nécessaire d’avoir une définition de type de document, par exemple un<br />
document DTD, pour déterminer si un document XML est valable. Choisissez la<br />
bonne réponse parmi les choix suivants.<br />
(a) Vrai.<br />
(b) Faux.<br />
3. Qu’est-ce qu’une DTD interne Choisissez la bonne réponse parmi les choix<br />
suivants.<br />
(a) Une DTD qui a été conçue à l’interne, dans une compagnie ou institution.<br />
(b) Une DTD qui apparaît dans le document XML entre des crochets.<br />
4. Quel symbole est utilisé dans les DTD pour signifier qu’un élément est optionnel,<br />
c’est-à-dire qu’on peut en trouver un ou aucun Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) <br />
(b) *<br />
(c) +<br />
(d) |<br />
5. Quel symbole est utilisé dans les DTD pour signifier qu’un élément peut ne pas<br />
apparaître, n’apparaître qu’une fois ou apparaître plusieurs fois Choisissez la<br />
bonne réponse parmi les choix suivants.<br />
(a) <br />
(b) *<br />
(c) +<br />
(d) |<br />
6. Quel symbole est utilisé dans les DTD pour signifier qu’un élément doit apparaître<br />
au moins une fois Choisissez la bonne réponse parmi les choix suivants.<br />
CC BY-NC-SA
Définition de type de document 67<br />
(a) <br />
(b) *<br />
(c) +<br />
(d) |<br />
7. Quel symbole est utilisé dans les DTD pour signifier qu’un élément ou un autre<br />
peut apparaître Choisissez la bonne réponse parmi les choix suivants.<br />
(a) <br />
(b) *<br />
(c) +<br />
(d) |<br />
8. Combien d’éléments « nom » peut contenir un document XML qui débute ainsi :<br />
<br />
<br />
<br />
<br />
<br />
]><br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Au moins un.<br />
(b) 1<br />
(c) 2<br />
(d) 3<br />
(e) 3 ou plus<br />
9. Soit le document DTD suivant, disponible à l’adresse<br />
« http://www.mondomain.com/madtd.dtd ». Dites quels documents XML<br />
sont valables.<br />
<br />
<br />
<br />
<br />
Choisissez toutes les réponses qui s’appliquent.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 68<br />
(a) <br />
<br />
<br />
<br />
<br />
(b) <br />
<br />
<br />
Jean B Pearson<br />
12<br />
Introduction aux ordinateurs<br />
<br />
(c) <br />
<br />
<br />
Jean Pearson<br />
12<br />
Introduction aux ordinateurs<br />
<br />
(d) <br />
<br />
Jean Pearson<br />
(e) <br />
<br />
<br />
Réjean Bougon<br />
3156<br />
Introduction à l’arithmétique<br />
Introduction aux ordinateurs<br />
<br />
(f) <br />
<br />
<br />
Introduction aux ordinateurs<br />
Réjean Bougon<br />
CC BY-NC-SA
Définition de type de document 69<br />
3156<br />
<br />
10. Soit le document DTD suivant, disponible à l’adresse<br />
« http://www.mondomain.com/madtd.dtd ». Dites quels documents XML<br />
sont valables.<br />
<br />
<br />
<br />
<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a)<br />
<br />
<br />
<br />
Jean Pearson<br />
12<br />
Introduction aux ordinateurs<br />
Introduction à l’informatique<br />
<br />
(b) <br />
<br />
<br />
<br />
<br />
(c) <br />
<br />
<br />
Jean Pearson<br />
12<br />
Introduction aux ordinateurs<br />
<br />
11. Soit le document DTD suivant, disponible à l’adresse<br />
« http://www.mondomain.com/madtd.dtd ». Dites quels documents XML<br />
sont valables.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 70<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) <br />
<br />
<br />
<br />
Palado<br />
Pierre<br />
<br />
<br />
Côté<br />
Yvon<br />
<br />
<br />
(b) <br />
<br />
<br />
<br />
Pierre<br />
Palado<br />
<br />
<br />
Yvon<br />
Côté<br />
<br />
<br />
(c) <br />
<br />
<br />
<br />
Pierre<br />
Palado<br />
<br />
CC BY-NC-SA
Définition de type de document 71<br />
<br />
Yvon<br />
Côté<br />
<br />
<br />
(d) <br />
<br />
<br />
<br />
Pierre<br />
Palado<br />
<br />
<br />
Jean<br />
Bertran<br />
<br />
<br />
Luc<br />
Fauche<br />
<br />
<br />
Yvon<br />
Côté<br />
<br />
<br />
(e) <br />
<br />
<br />
<br />
Pierre<br />
Palado<br />
<br />
<br />
Yvon<br />
Côté<br />
<br />
<br />
Jean<br />
Bertran<br />
<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 72<br />
Luc<br />
Fauche<br />
<br />
<br />
12. Soit le document DTD suivant, disponible à l’adresse<br />
« http://www.mondomain.com/madtd.dtd ». Dites quels documents XML<br />
sont valables.<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) <br />
<br />
<br />
<br />
Palado<br />
Pierre<br />
432432432<br />
<br />
<br />
(b) <br />
<br />
<br />
<br />
Palado<br />
Pierre<br />
Services récréatifs<br />
432432432<br />
<br />
<br />
(c) <br />
<br />
CC BY-NC-SA
Définition de type de document 73<br />
<br />
<br />
Palado<br />
Pierre<br />
Services récréatifs<br />
<br />
<br />
(d) <br />
<br />
<br />
<br />
Palado<br />
Pierre<br />
432-432-432444<br />
433-444-444444<br />
Services récréatifs<br />
<br />
<br />
13. Soit le document DTD suivant, disponible à l’adresse<br />
« http://www.mondomain.com/madtd.dtd ». Dites quels documents XML<br />
sont valables.<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) <br />
<br />
<br />
<br />
<br />
<br />
]><br />
CC BY-NC-SA
Module 1 : Introduction à XML 74<br />
<br />
<br />
Palado<br />
Pierre<br />
<br />
<br />
Côté<br />
Yvon<br />
<br />
<br />
(b) <br />
<br />
]><br />
<br />
<br />
50$<br />
<br />
<br />
Yvon<br />
Côté<br />
<br />
<br />
(c) <br />
<br />
<br />
<br />
Yvon<br />
Côté<br />
<br />
<br />
Yvon<br />
Côté<br />
<br />
<br />
50$<br />
<br />
<br />
CC BY-NC-SA
Définition de type de document 75<br />
14. Dites quels documents XML sont valables. Choisissez toutes les réponses qui<br />
s’appliquent.<br />
(a) <br />
<br />
<br />
<br />
]><br />
<br />
Jeu de la chandelle<br />
15-25 ans<br />
jeune adulte<br />
<br />
(b) <br />
<br />
<br />
<br />
]><br />
<br />
Jeu de la chandelle<br />
15-25 ans<br />
<br />
(c) <br />
<br />
<br />
<br />
]><br />
<br />
Jeu de la poudre<br />
25-35 ans<br />
universitaire<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 76<br />
(d) <br />
<br />
<br />
<br />
]><br />
<br />
Jeu de la poudre<br />
J’ai maintenant la balise age...<br />
25-35 ans<br />
suivie d’une balise niveau<br />
universitaire<br />
et je peux continuer<br />
<br />
(e) <br />
<br />
<br />
<br />
]><br />
<br />
Ceci est du XML avec contenu mixte<br />
Jeu de la poudre<br />
J’ai maintenant la balise age...<br />
25-35 ans<br />
suivie d’une balise niveau<br />
universitaire<br />
et je peux continuer<br />
<br />
15. Dites quels documents XML sont valables. Choisissez toutes les réponses qui<br />
s’appliquent.<br />
(a) <br />
<br />
<br />
<br />
CC BY-NC-SA
Définition de type de document 77<br />
<br />
<br />
<br />
]><br />
<br />
<br />
Jeu de la chandelle<br />
15-25 ans<br />
jeune adulte<br />
<br />
<br />
(b) <br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
Jeu de la chandelle<br />
<br />
15-25 ans<br />
<br />
<br />
<br />
<br />
<br />
(c) <br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
CC BY-NC-SA
Module 1 : Introduction à XML 78<br />
<br />
<br />
Jeu de la chandelle<br />
<br />
15-25 ans<br />
<br />
jeune adulte<br />
<br />
<br />
<br />
<br />
(d) <br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
Jeu de la chandelle<br />
15-25 ans<br />
<br />
J’ajoute une balise Mon nom est Bond<br />
<br />
(e) <br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
Jeu de la chandelle<br />
CC BY-NC-SA
Définition de type de document 79<br />
15-25 ans<br />
<br />
je peux tout me permettre<br />
<br />
16. Dites quels documents XML sont valables. Choisissez toutes les réponses qui<br />
s’appliquent.<br />
(a) <br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
Jean<br />
<br />
<br />
Martin<br />
<br />
10$<br />
<br />
(b) <br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
Jean<br />
<br />
<br />
Martin<br />
<br />
10$<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 80<br />
(c) <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
Jean<br />
<br />
<br />
Martin<br />
<br />
10$<br />
<br />
(d) <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
Jean<br />
<br />
<br />
Martin<br />
<br />
10$<br />
<br />
CC BY-NC-SA
Définition de type de document 81<br />
(e) <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
Jean<br />
<br />
<br />
Martin<br />
<br />
10$<br />
<br />
(f) <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
<br />
Jean<br />
<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 82<br />
Martin<br />
<br />
10$<br />
<br />
<br />
<br />
Jean<br />
<br />
<br />
Martin<br />
<br />
10$<br />
<br />
<br />
(g) <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
<br />
Jean<br />
<br />
<br />
Martin<br />
<br />
10$<br />
<br />
<br />
<br />
Jean<br />
<br />
CC BY-NC-SA
Définition de type de document 83<br />
<br />
Martin<br />
<br />
10$<br />
<br />
<br />
(h) <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
<br />
<br />
Jean<br />
<br />
<br />
Martin<br />
<br />
10$<br />
<br />
<br />
<br />
Jean<br />
<br />
<br />
Martin<br />
<br />
10$<br />
<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 84<br />
17. Dans une DTD, que signifie la ligne suivante<br />
<br />
Indice. Il s’agit d’une valeur d’attribut par défaut.<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Que les éléments « etudiant » doivent toujours avoir explicitement un attribut<br />
« universite » ayant comme valeur « Université du Québec à Montréal ».<br />
(b) Que les éléments « etudiant » ont toujours implicitement un attribut « universite<br />
» ayant comme valeur « Université du Québec à Montréal ».<br />
(c) Que les éléments « etudiant » ont implicitement un attribut « universite »<br />
ayant comme valeur « Université du Québec à Montréal », à moins que l’on<br />
fournisse une autre valeur de type CDATA.<br />
(d) Que les éléments « etudiant » ont implicitement un attribut « universite »<br />
ayant comme valeur « Université du Québec à Montréal » et que si l’on<br />
fournit explicitement l’attribut, il doit avoir comme valeur « Université du<br />
Québec à Montréal ».<br />
18. Dans une DTD, que signifie la ligne suivante<br />
<br />
Indice. Il s’agit d’une valeur d’attribut par défaut.<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Que les éléments « etudiant » doivent toujours avoir explicitement un attribut<br />
« universite » ayant comme valeur « Université du Québec à Montréal ».<br />
(b) Que les éléments « etudiant » ont toujours implicitement un attribut « universite<br />
» ayant comme valeur « Université du Québec à Montréal ».<br />
(c) Que les éléments « etudiant » ont implicitement un attribut « universite »<br />
ayant comme valeur « Université du Québec à Montréal », à moins que l’on<br />
fournisse une autre valeur de type CDATA.<br />
(d) Que les éléments « etudiant » ont implicitement un attribut « universite »<br />
ayant comme valeur « Université du Québec à Montréal », et que si l’on<br />
fournit explicitement l’attribut, il doit avoir comme valeur « Université du<br />
Québec à Montréal ».<br />
19. Dans une DTD, qu’est-ce qui décrit le mieux la ligne suivante<br />
CC BY-NC-SA
Définition de type de document 85<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Partout où le texte « universite » apparaît dans le document XML (mais pas<br />
dans la DTD), il est remplacé par « Université du Québec à Montréal ».<br />
(b) Partout où le texte « &universite; » apparaît dans le document XML (mais<br />
pas dans la DTD), il est remplacé par « Université du Québec à Montréal ».<br />
(c) Partout où le texte « &universite; » apparaît dans le document XML (mais<br />
pas dans la DTD et dans les valeurs par défaut des attributs), il est remplacé<br />
par « Université du Québec à Montréal ».<br />
20. Dans un document XML, que signifie la ligne suivante<br />
<br />
si le document XML commence par<br />
<br />
<br />
Indice. Il s’agit d’une entité paramètre.<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Partout dans le document XML où le texte « &administration; » apparaît,<br />
il est remplacé par « president,comptable,adjoint ».<br />
(b) Partout dans la DTD externe, le texte « %administration; » est remplacé par<br />
« president,comptable,adjoint ».<br />
(c) Partout dans la DTD externe, à supposer qu’elle ne définisse pas déjà l’entité<br />
« administration », le texte « %administration; » est remplacé par « president,comptable,adjoint<br />
».<br />
21. Choisissez les documents valables. Choisissez toutes les réponses qui s’appliquent.<br />
(a)<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 86<br />
<br />
]><br />
<br />
La mère souffre de la grippe.<br />
Le père est en santé.<br />
L’enfant de <br />
et de se porte bien.<br />
<br />
(b)<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
La mère souffre de la grippe.<br />
Le père est en santé.<br />
L’enfant de et<br />
de se porte bien.<br />
<br />
(c)<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
La mère souffre de la grippe.<br />
Le père est en santé.<br />
L’enfant de <br />
et de se porte bien.<br />
<br />
22. Trouvez le terme qui se distingue.<br />
CC BY-NC-SA
Définition de type de document 87<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) XML Schema<br />
(b) Relax NG<br />
(c) DTD<br />
(d) Schematron<br />
(e) XML<br />
(f) Examplotron<br />
23. Je dois définir des entités, quelle technologie est-ce que je dois utiliser<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) XML Schema<br />
(b) Relax NG<br />
(c) DTD<br />
24. Quelle est la signification de DTD Choisissez la bonne réponse parmi les choix<br />
suivants.<br />
(a) Document Type Definition<br />
(b) Document Type Declaration<br />
(c) Dynamic Type Definition<br />
25. Choisissez la meilleure réponse Choisissez la bonne réponse parmi les choix<br />
suivants.<br />
(a) La spécification DTD fait partie intégrante du XML.<br />
(b) Le nom des éléments doit être en minuscule.<br />
(c) Tous les documents doivent avoir une DTD.<br />
26. Choisissez la meilleure réponse Choisissez la bonne réponse parmi les choix<br />
suivants.<br />
(a) Toutes ces réponses sont vraies<br />
(b) Le XML est sensible à la casse des cararactères<br />
(c) Tous les documents XML doivent avoir un élément-racine.<br />
1.6.23 Solutions<br />
1. (a) (Bonne réponse) Par contre, il peut y avoir une partie interne à la DTD,<br />
c’est-à-dire une partie qui est écrite dans le document XML lui-même. Le<br />
tout (DTD externe et interne) forme une seule DTD.<br />
(b) Non.<br />
2. (a) (Bonne réponse) Un document est dit valable s’il est bien formé et respecte<br />
sa DTD.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 88<br />
(b) On peut seulement vérifier qu’il est bien formé.<br />
3. (a) Incorrect. La provenance de la DTD est sans conséquence.<br />
(b) (Bonne réponse) Correct.<br />
4. (a) (Bonne réponse) Oui.<br />
(b) Non.<br />
(c) Non.<br />
(d) Non.<br />
5. (a) Non.<br />
(b) (Bonne réponse) Oui.<br />
(c) Non.<br />
(d) Non.<br />
6. (a) Non.<br />
(b) Non.<br />
(c) (Bonne réponse) Oui.<br />
(d) Non.<br />
7. (a) Non.<br />
(b) Non.<br />
(c) Non.<br />
(d) (Bonne réponse) Oui.<br />
8. (a) Non.<br />
(b) Non.<br />
(c) (Bonne réponse) Effectivement. La déclaration de type de document nous<br />
indique que l’élément-racine est « cheque » et que l’élement « cheque »<br />
doit contenir exactement un élément « recipiendaire » et un élément « emetteur<br />
», chacun contenant exactement un élément « nom ».<br />
(d) Non.<br />
(e) Non.<br />
9. (a) (Bonne réponse) Oui. Ce document est valable, car l’astérisque (*) permet<br />
d’avoir zéro ou plusieurs balises « cours ».<br />
(b) Non, la balise ne peut contenir que du texte et aucune balise.<br />
(c) Non, la déclaration de type de document indique que la racine doit être une<br />
balise de type « nom ».<br />
(d) (Bonne réponse) Oui. On utilise bien l’élément « nom » comme élémentracine<br />
et il est défini dans la DTD.<br />
(e) (Bonne réponse) Oui. L’astérisque permet d’avoir plusieurs éléments<br />
« cours ».<br />
(f) Non. Il faut que les éléments apparaissent dans l’ordre : nom, numero et<br />
cours.<br />
CC BY-NC-SA
Définition de type de document 89<br />
10. (a) Non. La déclaration XML doit apparaître en premier dans un document<br />
XML.<br />
(b) Non. Le document n’est pas valable parce que le symbole « + » implique<br />
que l’élément « cours » doit apparaître au moins une fois.<br />
(c) (Bonne réponse) Oui. L’élément « cours » apparaît une fois, comme cela<br />
est exigé.<br />
11. (a) Non. Selon la DTD, il faut que les noms apparaissent après les prénoms.<br />
(b) (Bonne réponse) Oui. La compagnie a un comptable et un président,<br />
comme cela est demandé.<br />
(c) Non. Il faut au moins un comptable.<br />
(d) (Bonne réponse) Oui. On peut avoir plus d’un ingénieur.<br />
(e) Non. Les ingénieurs doivent apparaître avant les comptables.<br />
12. (a) Non. L’élément employé doit contenir au moins un élément « division ».<br />
(b) Non. L’élément employé doit contenir un élément « division », mais après<br />
l’élément « telephone ».<br />
(c) (Bonne réponse) Oui. L’élément « telephone est facultatif ».<br />
(d) Non. L’élément « telephone » peut ne pas apparaître ou apparaître une fois.<br />
13. (a) (Bonne réponse) Dans ce cas précis, la DTD à l’adresse<br />
« http://www.mondomain.com/madtd.dtd » n’est jamais utilisé. Il ne<br />
faut donc considérer que la DTD interne. Selon cette DTD, le document<br />
XML est valable.<br />
(b) (Bonne réponse) Pour traiter le document, il faut ici combiner les deux<br />
DTD; on voit que l’élément « taxe » utilise un élément « comptable » de la<br />
DTD externe. Cela est parfaitement valable.<br />
(c) Il n’est pas prévu dans la DTD externe que l’élément « compagnie »<br />
contienne un élément « montant », donc ce n’est pas permis. La DTD interne<br />
vient s’ajouter à la DTD externe, mais sans plus.<br />
14. (a) Non. La DTD interne stipule que l’élément « jeu » contient un élément<br />
« nom », suivi d’un élément « age » ou d’un élément « niveau », mais pas<br />
les deux.<br />
(b) (Bonne réponse) Oui. La DTD interne stipule que l’élément « jeu » contient<br />
un élément « nom », suivi d’un élément « age » ou d’un élément « niveau »,<br />
mais pas les deux.<br />
(c) (Bonne réponse) Oui. La DTD interne stipule que l’élément « jeu » contient<br />
un élément « nom » qui peut ou non être suivi de plusieurs éléments « age »<br />
ou éléments « niveau ».<br />
(d) (Bonne réponse) Oui. La DTD interne stipule que l’élément « jeu » contient<br />
un élément « nom », suivi de contenu mixte avec texte et choix de balises<br />
entre « age » et « niveau ».<br />
(e) Non. L’élément « jeu » doit commencer par une balise « nom ».<br />
CC BY-NC-SA
Module 1 : Introduction à XML 90<br />
15. (a) Le problème ici est qu’on peut avoir un élément « age » ou un élément<br />
« niveau », mais pas les deux. L’élément « activite » peut contenir tout<br />
élément déclaré dont « jeu ». L’élément « jeu » a une balise optionnelle<br />
« gratuit », qui est ici absente.<br />
(b) Non. L’élément « gratuit » doit être vide de tout, incluant les espaces et<br />
retours de chariot. Il faut donc utiliser la syntaxe ou,<br />
plus simplement, .<br />
(c) On utilise les éléments « age » et « niveau », alors qu’on doit choisir entre<br />
l’un ou l’autre, à cause de l’opérateur « | » (ou logique).<br />
(d) (Bonne réponse) Oui. L’élément « activite » peut contenir n’importe quel<br />
élément déclaré et du contenu mixte.<br />
(e) Non. L’élément « peuimporte » n’est pas prévu par la DTD; il n’est donc<br />
pas permis.<br />
16. (a) Non. Il n’est pas permis d’avoir un attribut non déclaré dans la DTD.<br />
(b) (Bonne réponse) Oui. L’élément « cheque » a bien un attribut « commentaire<br />
», comme cela est nécessaire.<br />
(c) Non. L’élément « emetteur » devrait avoir un attribut « commentaire ».<br />
(d) (Bonne réponse) Oui. L’élément « emetteur » n’a pas d’attribut « commentaire<br />
», mais c’est permis à cause de la mention « IMPLIED ».<br />
(e) Non. L’attribut « numero="1324" » doit avoir comme valeur un nom XML;<br />
en d’autres termes, il ne peut commencer par un chiffre.<br />
(f) Non. Nous avons ici deux attributs avec une valeur de type ID : il faut qu’ils<br />
aient des valeurs différentes. En XML, la valeur d’un attribut de type ID<br />
identifie un élément unique.<br />
(g) (Bonne réponse) Oui. Observez que tous les attributs ayant des valeurs de<br />
type ID ont des valeurs distinctes.<br />
(h) (Bonne réponse) Oui. Observez encore une fois que tous les attributs ayant<br />
des valeurs de type ID ont des valeurs distinctes.<br />
17. (a) Non.<br />
(b) Non.<br />
(c) (Bonne réponse) Oui.<br />
(d) Non.<br />
18. (a) Non. La valeur peut aussi être implicite.<br />
(b) C’est vrai, mais on peut aussi stipuler explicitement la valeur.<br />
(c) Non. La valeur de l’attribut est fixe.<br />
(d) (Bonne réponse) Oui.<br />
19. (a) Non.<br />
(b) C’est juste, mais légèrement in<strong>complet</strong>.<br />
(c) (Bonne réponse) Oui.<br />
CC BY-NC-SA
La validation des documents XML 91<br />
20. (a) Non. Ce serait toutefois le cas si nous avions la ligne<br />
<br />
(b) (Bonne réponse) Oui.<br />
(c) Non. La partie interne de la DTD a préséance sur la DTD externe.<br />
21. (a) La valeur d’un attribut de type « ID » ou « IDREF » doit être un nom XML<br />
valable, donc elle ne doit pas débuter par un chiffre.<br />
(b) Non. Toutes les valeurs d’attribut de type « IDREF » ne correspondent pas<br />
à une valeur d’attribut de type « ID ».<br />
(c) (Bonne réponse) Effectivement. Tous les valeurs d’attribut de type<br />
« IDREF » correspondent à une valeur d’attribut de type « ID ».<br />
22. (a) Non. XML Schema est une technologie permettant de valider du XML.<br />
(b) Non. Relax NG est une technologie permettant de valider du XML.<br />
(c) Non. DTD est une technologie permettant de valider du XML.<br />
(d) Non. Schematron est une technologie permettant de valider du XML.<br />
(e) (Bonne réponse) Non. Le XML n’est pas une technologie de validation.<br />
(f) Non. Examplotron est une technologie permettant de valider du XML.<br />
23. (a) Non. XML Schema ne permet pas de définir des entités.<br />
(b) Non. Relax NG ne permet pas de définir des entités.<br />
(c) (Bonne réponse) Effectivement. DTD permet la définition des entités.<br />
24. (a) (Bonne réponse) Effectivement.<br />
(b) Non.<br />
(c) Non.<br />
25. (a) (Bonne réponse) Effectivement.<br />
(b) Non.<br />
(c) Non.<br />
26. (a) (Bonne réponse) Effectivement.<br />
(b) Oui, mais ce n’est pas tout.<br />
(c) Oui, mais ce n’est pas tout.<br />
1.7 La validation des documents XML<br />
1.7.1 Objectif<br />
Valider des documents XML.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 92<br />
1.7.2 Activité de validation<br />
On peut facilement vérifier si un document XML est « bien formé ». Il suffit de lui<br />
donner l’extension « .xml » (ou « .xhtml ») et de l’ouvrir dans Mozilla Firefox, par<br />
exemple. Pour effectuer une telle vérification, il existe aussi des services en ligne, dont<br />
celui de la Brown University.<br />
Cependant, il arrive qu’on veuille vérifier que le document est non seulement bien<br />
formé, mais aussi valable par rapport à des documents DTD locaux. Apprenons donc à<br />
valider des documents XML, en exécutant les directives qui suivent, car cela vous sera<br />
très utile dans vos travaux en XML.<br />
La procédure que nous proposons suppose que vous connaissez bien les éléments de<br />
base d’un système d’exploitation, comme l’utilisation de la ligne de commande et<br />
l’exécution de programmes. Nous ne donnons la procédure que pour Windows, mais<br />
elle est très similaire sous MacOS ou Linux.<br />
Procédure pour valider des documents XML<br />
Avant de procéder à la validation, préparons notre environnement. Allez dans un répertoire,<br />
par exemple « C:\XML », et créez le fichier « monfichier.dtd » avec le contenu<br />
suivant, en utilisant le bloc-notes :<br />
<br />
<br />
<br />
Puis, créez un document appelé « mauvais.xml » avec le contenu suivant, toujours à<br />
l’aide du bloc-notes :<br />
<br />
<br />
12<br />
Il est important que les deux fichiers soient dans le même répertoire. En effet, la ligne<br />
dans le fichier « mauvais.xml »<br />
indique qu’il devrait y avoir un fichier « monfichier.dtd » dans le même répertoire.<br />
Vérifions maintenant si le fichier « mauvais.xml » est valable.<br />
1. D’abord, vous devez disposer d’une machine virtuelle Java récente (Java 1.4 ou<br />
mieux) sur votre ordinateur, incluant le compilateur Java : « javac ». Si vous<br />
n’en avez pas, il faut effectuer un téléchargement et une installation d’une telle<br />
machine. En outre, vous devez avoir sur votre ordinateur le SDK, pas uniquement<br />
le JRE. Sur la page qui se trouve à l’adresse http://java.sun.com/j2se/1.4.2/<br />
download.html, cliquez sur « Download J2SE SDK ». Le téléchargement peut<br />
prendre plusieurs minutes. Il suffit ensuite de lancer le fichier exécutable que<br />
CC BY-NC-SA
La validation des documents XML 93<br />
vous venez d’enregistrer sur votre ordinateur pour installer le SDK. Une fois le<br />
SDK installé, vous pouvez poursuivre l’activité de vérification.<br />
2. Placez le fichier Validateur.java dans le répertoire où se trouvent déjà vos fichiers<br />
« mauvais.xml » et « monfichier.dtd », soit dans « C:\XML ». Votre fichier « Validateur.java<br />
» devrait avoir le contenu suivant :<br />
//fichier Validateur.java<br />
import java.io.*;<br />
import org.xml.sax.*;<br />
import org.xml.sax.helpers.*;<br />
import javax.xml.parsers.*;<br />
/**<br />
* Ce programme est inspiré de Xerces-J. Il a été modifié<br />
* par Daniel Lemire pour le cours "Gestion de l’information<br />
* avec XML".<br />
*<br />
* Date de la première modification: 5 novembre 2004.<br />
*<br />
* Il suffit de compiler le programme avec<br />
* "javac Validateur.java".<br />
* On peut ensuite valider un document en faisant<br />
* "java Validateur monfichier.xml".<br />
*<br />
*/<br />
public class Validateur extends DefaultHandler {<br />
public Validateur() {<br />
}<br />
public void warning(SAXParseException ex)<br />
throws SAXException {<br />
printError("Avertissement", ex);<br />
}<br />
public void error(SAXParseException ex)<br />
throws SAXException {<br />
printError("Erreur", ex);<br />
}<br />
public void fatalError(SAXParseException ex)<br />
throws SAXException {<br />
printError("Erreur fatale", ex);<br />
}<br />
protected void printError(String type, SAXParseException ex) {<br />
System.err.print("[");<br />
CC BY-NC-SA
Module 1 : Introduction à XML 94<br />
}<br />
System.err.print(type);<br />
System.err.print("] ");<br />
if (ex== null) {<br />
System.out.println("!!!");<br />
}<br />
String systemId = ex.getSystemId();<br />
if (systemId != null) {<br />
int index = systemId.lastIndexOf(’/’);<br />
if (index != -1)<br />
systemId = systemId.substring(index + 1);<br />
System.err.print(systemId);<br />
}<br />
System.err.print(" ligne: ");<br />
System.err.println(ex.getLineNumber());<br />
System.err.println(", colonne: ");<br />
System.err.print(ex.getColumnNumber());<br />
System.err.print(", description: ");<br />
System.err.print(ex.getMessage());<br />
System.err.println();<br />
System.err.flush();<br />
}<br />
public static void main(String argv[])<br />
throws org.xml.sax.SAXException,<br />
javax.xml.parsers.ParserConfigurationException {<br />
Validateur counter = new Validateur();<br />
PrintWriter out = new PrintWriter(System.out);<br />
XMLReader parser = null;<br />
parser = SAXParserFactory.newInstance().newSAXParser().<br />
getXMLReader();<br />
parser.setContentHandler(counter);<br />
parser.setErrorHandler(counter);<br />
parser.setFeature("http://xml.org/sax/features/validation",<br />
true);<br />
parser.setFeature("http://xml.org/sax/features/namespaces",<br />
true);<br />
try {<br />
parser.parse(argv[0]);<br />
} catch (SAXParseException e) {<br />
} catch (Exception e) {<br />
System.err.println("erreur: Erreur de traitement -"<br />
+e.getMessage());<br />
}<br />
}<br />
CC BY-NC-SA
La validation des documents XML 95<br />
3. Ensuite, lancez la machine virtuelle Java avec une ligne de commande. Pour<br />
cela, il faut ouvrir une fenêtre de commande. Sous Windows XP, dans le menu<br />
« Démarrer », cliquez sur « Exécuter »; une fenêtre s’ouvre, tapez le nom de<br />
programme « cmd » pour ouvrir une fenêtre de commande. Notez qu’avec les<br />
versions plus anciennes de Windows, comme Windows 98, il faut taper « command.com<br />
». Une fenêtre s’ouvre alors avec un fond noir, c’est la fenêtre de<br />
commande. Vous allez pouvoir y taper des lignes de commande pour vérifier si<br />
votre document XML est valable. Les commandes de base sont : « dir » (affiche<br />
le contenu d’un répertoire), « cd » (change de répertoire), « cd .. » (répertoire parent),<br />
« mkdir » (création d’un nouveau répertoire), « copy » (copie d’un fichier),<br />
« move » (déplacement d’un fichier), et « del » (supprime un fichier).<br />
4. Testez l’installation de votre machine virtuelle en tapant « java » suivi du retour<br />
de chariot. Vous devriez recevoir un message qui commence par :<br />
Usage: java [-options] class [args...]<br />
(to execute a class)<br />
or<br />
java -jar [-options] jarfile [args...]<br />
(to execute a jar file)<br />
ou quelque chose de similaire. Testez aussi l’installation du compilateur en tapant<br />
« javac »; vous devriez voir un message qui commence par quelque chose<br />
comme :<br />
Usage: javac <br />
Si ce n’est pas le cas, nous vous conseillons de vérifier l’installation de votre<br />
machine virtuelle et de procéder à sa réinstallation au besoin. Si tout est bien<br />
installé et que ça ne fonctionne toujours pas, vous devrez indiquer le chemin<br />
pour trouver le compilateur en tapant la ligne de commande<br />
PATH=adresse_du_fichier_javac.exe<br />
Le fichier « javac.exe » se trouve dans le dossier « bin » du dossier où vous<br />
avez installé le SDK. Par défaut, ce fichier se trouve dans le « C: ». L’adresse<br />
du répertoire contenant le fichier « javac.exe » est donc « C:\j2sdk1.4.2_06\bin »<br />
ou « C:\Program Files\Java\jdk1.5.0\bin ». Si vous ne savez plus où est installé<br />
le SDK, vous pouvez faire une recherche, à partir du menu « Démarrer » de<br />
Windows. Une fois le chemin indiqué, retapez la commande « javac » et cette<br />
fois, tout devrait fonctionner. Comme il peut être lourd de modifier la variable<br />
d’environnement PATH chaque fois, il est possible de la modifier une fois pour<br />
toute : allez dans « Démarrer », choisissez « Paramètres », puis « Panneau de<br />
configuration », et ouvrez « Système », cliquez sur l’onglet « Avancé »; cliquez<br />
ensuite sur le bouton « Variables d’environnement », sélectionnez « PATH »<br />
dans la liste des variables, cliquez sur le bouton « Modifier » et ajoutez, à la<br />
fin du contenu de la variable, « ;adresse_du_fichier_javac.exe », par exemple<br />
« ;C:\Program Files\Java\jdk1.5.0\bin ».<br />
5. Ensuite, placez-vous dans le dossier où se trouvent votre fichier XML et sa DTD.<br />
Vous savez toujours où vous vous trouvez dans l’arborescence de votre ordinateur,<br />
puisque chaque ligne de commande commence par l’adresse où vous êtes.<br />
CC BY-NC-SA
Module 1 : Introduction à XML 96<br />
La commande pour se déplacer est « cd adresse ». Par exemple, si la ligne commence<br />
par « C:\Documents and Settings\lucie> », vous êtes dans le dossier de<br />
lucie. Pour aller au dossier XML qui se trouve sur le disque C, il faut taper :<br />
« cd C:\XML », puis faire le retour de chariot. Une nouvelle ligne apparaît et<br />
commence par : « C:\XML> ». Maintenant que vous êtes dans le dossier où se<br />
trouve votre fichier XML, vous pouvez vérifier s’il est valable.<br />
6. Faites « javac Validateur.java » pour compiler le petit programme qui pourra vous<br />
servir à vérifier la validité des documents XML. Vous ne devriez pas avoir de mal<br />
avec la compilation. Par exemple, vous pourriez voir à l’écran :<br />
C:\XML>javac Validateur.java<br />
Note: Validateur.java uses or overrides a deprecated API.<br />
Note: Recompile with -deprecation for details.<br />
Vous pouvez ignorer les avertissements vous incitant à utiliser l’option « -<br />
deprecation ».<br />
7. Tapez la ligne de commande « java Validateur mauvais.xml », puis faites un<br />
retour de chariot. Il est important de respecter la casse dans les lignes de commande.<br />
Si rien de significatif ne s’affiche, votre fichier est valable, sinon, une description<br />
des erreurs s’affichera (en anglais). Si la machine virtuelle quitte avec<br />
l’erreur « java.lang.NoClassDefFoundError » alors que vous êtes bien dans le<br />
bon répertoire, faites alors « java -cp . Validateur mauvais.xml ».<br />
8. Pour quitter, vous n’avez qu’à fermer la fenêtre de commande.<br />
Vérification de la procédure<br />
Après avoir tapé la commande « java Validateur mauvais.xml » pour vérifier si le fichier<br />
« mauvais.xml » est valable, vous devriez obtenir le message d’erreur suivant indiquant<br />
qu’il manque un élément « numero » (le message exact peut varier et il pourrait être en<br />
français) :<br />
> java Validateur mauvais.xml<br />
[Error] mauvais.xml:3:-1: Element "etudiant" does not allow "age" here.<br />
[Error] mauvais.xml:3:-1: Element "etudiant" requires additional elements.<br />
Pour vous assurer de bien comprendre, reprenez la procédure; créez un autre document<br />
appelé « bon.xml » avec le contenu suivant :<br />
<br />
<br />
112<br />
Cette fois-ci, vous devriez, en vérifiant que le document est valable, obtenir le message<br />
suivant :<br />
> java Validateur bon.xml<br />
CC BY-NC-SA
Espaces de noms 97<br />
1.7.3 Retour<br />
Est-ce que vous avez pu vérifier si les fichiers « mauvais.xml » et « bon.xml » étaient<br />
valables Si oui, passez aux autres activités, sinon contactez la personne tutrice ou<br />
cherchez encore un peu.<br />
1.8 Espaces de noms<br />
1.8.1 Objectif<br />
Utiliser les espaces de noms<br />
1.8.2 Activité<br />
Lisez le texte qui suit, puis répondez au questionnaire d’autoévaluation. Ce texte traite<br />
des espaces de noms auxquels il faut faire appel quand on utilise plusieurs « vocabulaires<br />
» XML, en même temps.<br />
1.8.3 Les vocabulaires XML<br />
Un « vocabulaire XML » est un ensemble de noms de balises et d’attributs ayant une<br />
signification donnée. Par exemple, les gens de la comptabilité au sein d’une entreprise<br />
pourraient avoir un vocabulaire XML pour décrire certaines transactions, alors que<br />
les ingénieurs pourraient avoir leur propre vocabulaire pour décrire certains processus<br />
techniques. Les deux équipes pourraient utiliser les mêmes noms d’élément, comme<br />
« échéance », mais avec des significations différentes. On dira alors que nous avons<br />
deux vocabulaires XML.<br />
Voyons un autre exemple. Imaginez que votre institution ait un vocabulaire XML pour<br />
les expéditions de marchandise et un vocabulaire XML pour la rédaction des factures.<br />
Un document XML combinant à la fois de l’information concernant une expédition et<br />
une facture devra utiliser deux vocabulaires.<br />
Un vocabulaire XML peut être associé à un document DTD; il peut aussi être associé<br />
à un espace de noms.<br />
1.8.4 Les identificateurs de ressources uniformes (URI)<br />
Un identificateur de ressources uniformes (Uniform Resource Identifier ou URI) est<br />
une adresse Internet composée d’un nom de protocole ou « schéma », comme file, http,<br />
ftp, news, mailto, gopher, urn, suivi d’un deux-points « : », lui-même suivi d’un chemin,<br />
comme « www.mondomain.com/fichier ». Un URI ne pointe pas nécessairement vers<br />
CC BY-NC-SA
Module 1 : Introduction à XML 98<br />
un fichier, mais peut très bien être une adresse purement fictive ou une adresse pointant<br />
vers une application logicielle sur un serveur.<br />
Par exemple, « http://www.mondomain.com/fichier » et<br />
« mailto:billg@microsoft.com » sont des URI. Les URI ne doivent pas contenir<br />
d’accents, et la casse est significative sauf pour ce qui est du nom du protocole<br />
(HTTP versus http) et du nom de domaine (xerox.com versus XEROX.COM). Nous<br />
reviendrons sur les URI dans le module 5.<br />
1.8.5 Les espaces de noms<br />
Un espace de noms est identifié par un URI; il y a correspondance unique entre<br />
les espaces de noms et les URI. Deux espaces de noms ayant le même URI<br />
sont identiques. Tous les utilisateurs d’un même vocabulaire XML devraient s’entendre<br />
sur un même URI. Par exemple, l’URI de l’espace de noms du XHTML est<br />
« http://www.w3.org/1999/xhtml ». L’URI agit un peu comme le numéro d’assurance<br />
sociale des vocabulaires XML. Il s’agit d’une analogie un peu étrange, voire<br />
originale, mais c’est ainsi.<br />
Évidemment, la notion d’espace de noms n’a de sens que si l’on considère plusieurs<br />
espaces de noms et, par conséquent, plusieurs vocabulaires.<br />
1.8.6 Les DTD et les espaces de noms<br />
Avant de préciser le lien entre les DTD et les espaces de noms, il importe de comprendre<br />
que les espaces de noms furent proposés après l’adoption des DTD. Il y a donc<br />
une certaine incompatibilité entre les DTD et les espaces de noms. C’est d’ailleurs<br />
l’une des raisons pour laquelle plusieurs organismes, dont OASIS et le W3C, tentent<br />
de proposer des solutions de remplacement pour les DTD.<br />
Rappelons que l’on donne une DTD à un document, en ajoutant une déclaration de type<br />
de document, immédiatement après la déclaration XML, et dont la forme est :<br />
<br />
C’est la même chose avec les espaces de noms. Si vous avez, par exemple, un vocabulaire<br />
pour les expéditions et un vocabulaire pour les factures, définis respectivement<br />
par des DTD situées à :<br />
http://www.mondomain.com/expedition.dtd<br />
et<br />
http://www.mondomain.com/facture.dtd,<br />
vous ne pourriez pas combiner les deux vocabulaires ainsi :<br />
CC BY-NC-SA
Espaces de noms 99<br />
<br />
Même si l’on pouvait combiner deux DTD de la sorte, cela aurait plusieurs inconvénients<br />
: quoi faire si les deux DTD définissent un élément « client », mais de façon<br />
différente La solution est de créer un nouveau vocabulaire XML qui combine les deux<br />
et traite chaque vocabulaire comme un « espace de noms ».<br />
Dans l’exemple qui suit, nous considérons deux vocabulaires, « facture » et « expedition<br />
» qui ont les DTD suivantes :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
1.8.7 Déclaration de l’espace de noms<br />
On peut utiliser le symbole « : » dans les noms XML, mais on ne l’utilise généralement<br />
qu’une seule fois dans un nom donné. Tout ce qui précède le deux-points est appelé le<br />
« préfixe ».<br />
On a vu qu’un espace de noms est identifié par un URI. À leur tour, les URI peuvent<br />
être associés à un « préfixe ». Tout attribut ou élément qui utilise un préfixe donné fait<br />
automatiquement partie de l’espace de noms identifié par l’URI. Seul l’URI identifie<br />
un espace de noms : le choix du préfixe est sans importance. Un document peut avoir<br />
un seul espace de noms, mais douze préfixes différents.<br />
On définit un « préfixe » à l’aide d’un attribut ayant comme préfixe « xmlns ». La<br />
définition du préfixe est alors valable pour l’ensemble de l’élément, y compris la balise<br />
où se situe l’attribut « xmlns: ». Ainsi, dans le document XML suivant :<br />
<br />
<br />
10$<br />
Jean<br />
<br />
on reconnaît que l’élément « fact:facture » et tout son contenu utilisent l’espace de<br />
noms « http://www.domaine.com/facture » que nous avons décrit par une DTD plus<br />
CC BY-NC-SA
Module 1 : Introduction à XML 100<br />
haut. Le préfixe « fact » est ici associé à l’URI « http://www.domaine.com/facture »<br />
et tous les éléments et attributs ayant le préfixe « fact » sont considérés faire partie de<br />
l’espace de noms « http://www.domaine.com/facture ».<br />
Il est « illégal » d’utiliser un préfixe qui n’a pas été défini... Ainsi, le document suivant<br />
est bien formé, mais il ne respecte pas les conventions des espaces de noms :<br />
<br />
<br />
10$<br />
Jean<br />
<br />
Avez-vous remarqué que ces derniers documents n’ont pas de déclaration de type de<br />
document et ne peuvent donc pas être des documents XML valables La plupart des<br />
documents XML utilisant les espaces de noms sont dans ce cas. Si jamais nous avions<br />
une déclaration de type de document, il faudrait une DTD qui contiennent les éléments<br />
« fact:facture », « fact:montant » et « fact:nom ». En d’autres mots, ce nouveau document<br />
XML ne peut utiliser la DTD facture décrite plus haut. Nous ne traiterons pas de<br />
cette approche ici, car on combine rarement les DTD de la sorte.<br />
Le choix du préfixe « fact: » est arbitraire. On peut changer le nom du préfixe, car<br />
seul l’URI identifie de façon unique l’espace de noms. Par exemple, le document XML<br />
suivant est équivalent à celui que nous venons de décrire.<br />
<br />
<br />
10$<br />
Jean<br />
<br />
On peut aussi redéfinir un préfixe comme dans l’exemple qui suit :<br />
<br />
<br />
<br />
10$<br />
Jean<br />
<br />
Dans ce dernier cas, on dira que l’élément « montant » est dans l’espace de<br />
noms « http://www.domaine.com/facture2 » et non pas dans l’espace de noms<br />
« http://www.domaine.com/facture ». Tout élément et attribut, utilisant le préfixe<br />
« facture » dans l’élément « montant », seraient eux aussi dans l’espace de noms<br />
« http://www.domaine.com/facture2 ».<br />
CC BY-NC-SA
Espaces de noms 101<br />
L’endroit où apparaît la déclaration d’espace de noms est aussi sans conséquence. Par<br />
exemple, les deux documents suivants sont équivalents :<br />
<br />
<br />
<br />
10$<br />
Jean<br />
<br />
<br />
<br />
<br />
<br />
10$<br />
Jean<br />
<br />
<br />
On dit que deux documents sont équivalents, au sens des espaces de noms, s’ils ne<br />
diffèrent que par les préfixes d’espaces de noms et par les endroits où apparaissent les<br />
déclarations d’espaces de noms.<br />
Évidemment, avec les espaces de noms, on peut combiner plusieurs vocabulaires. Par<br />
exemple, si nous voulons décrire une commande en utilisant les vocabulaires « facture »<br />
et « expedition », on peut très bien le faire comme le montre l’exemple suivant :<br />
<br />
<br />
10$<br />
Jean<br />
<br />
<br />
Jean<br />
Bertrand<br />
1040, rue Jean<br />
<br />
<br />
<br />
En outre, on pourrait même combiner les espaces de noms de façon arbitraire comme<br />
le montre le prochain exemple :<br />
<br />
<br />
10$<br />
CC BY-NC-SA
Module 1 : Introduction à XML 102<br />
<br />
Jean<br />
Bertrand<br />
1040, rue Jean<br />
<br />
<br />
1.8.8 Les déclarations croisées<br />
La déclaration d’espace de noms n’est valable qu’au sein de l’élément. Pour déterminer<br />
l’espace de nom auquel appartient un élément, il ne suffit donc pas de remonter<br />
et de s’arrêter à la première déclaration que l’on trouve. Voyez si vous pouvez voir<br />
pourquoi l’espace de nom de l’élément « fact:montant » dans l’exemple suivant est<br />
« http://www.domaine.com/facture » et non « http://www.domaine.com/facture2 ».<br />
<br />
<br />
<br />
<br />
<br />
<br />
1.8.9 Le préfixe par défaut<br />
On peut utiliser le préfixe par défaut, c’est-à-dire ne pas mettre de préfixe du tout.<br />
L’utilisation du préfixe par défaut est optionnelle dans un document XML. Comme<br />
tout autre préfixe, le préfixe par défaut peut être réutilisé, redéfini plusieurs fois dans<br />
un même document. Voici un exemple de préfixe par défaut :<br />
<br />
<br />
10$<br />
<br />
Jean<br />
Bertrand<br />
1040, rue Jean<br />
<br />
<br />
Notons cependant que le préfixe par défaut ne s’utilise que pour les éléments : les<br />
attributs sans préfixe ne sont dans aucun espace de noms, et cela sans exception.<br />
CC BY-NC-SA
Espaces de noms 103<br />
1.8.10 Rappel des notions formelles<br />
La définition d’un préfixe d’espace de noms inclut l’élément où le préfixe est défini et<br />
tout son contenu, et rien d’autre. Le document qui suit fait une utilisation incorrecte<br />
des espaces de noms :<br />
<br />
<br />
<br />
<br />
<br />
<br />
parce que le préfixe « fact » n’est défini qu’au sein de l’élément « facture ».<br />
Bien que cela ne soit pas recommandable, il est possible de redéfinir les préfixes d’espace<br />
de noms. C’est simple si l’on se rappelle que la définition d’un préfixe inclut<br />
l’élément où la définition est faite. Ainsi, dans l’exemple :<br />
<br />
<br />
<br />
<br />
<br />
<br />
l’élément « nom » appartient à l’espace de noms « http://www.domaine.com/nom » et<br />
non à l’espace de noms « http://www.domaine.com/facture ».<br />
Par convention, on doit toujours accorder à un préfixe d’espace de noms un<br />
URI et il serait incorrect d’écrire au lieu de dans l’exemple précédent.<br />
1.8.11 Les espaces de noms et Relax NG<br />
Alors que les DTD ne permettent pas de traiter les espaces de noms, les spécifications<br />
Relax NG et XML Schema le permettent. L’utilisation des espaces de noms en Relax<br />
NG est particulièrement simple comme le montre cet exemple.<br />
namespace fact = "http://www.domaine.com/facture"<br />
namespace fact2 = "http://www.domaine.com/facture2"<br />
element fact:facture {<br />
element fact:nom {text},<br />
element fact:montant {text},<br />
element fact2:id {text}<br />
CC BY-NC-SA
Module 1 : Introduction à XML 104<br />
}<br />
}*<br />
Le document XML suivant sera alors valable.<br />
<br />
<br />
Daniel<br />
10,80$<br />
10,80$<br />
<br />
Par défaut, il n’y a pas d’espace de noms lorsqu’un préfixe n’est pas utilisé, mais on<br />
peut définir l’espace de noms par défaut comme ceci :<br />
namespace fact = "http://www.domaine.com/facture"<br />
default namespace = "http://www.domaine.com/facture2"<br />
element fact:facture {<br />
element fact:nom {text},<br />
element fact:montant {text},<br />
element id {text}<br />
}*<br />
}<br />
Les deux exemples précédents de Relax NG sont d’ailleurs équivalents.<br />
1.8.12 Le préfixe « xml »<br />
Par convention, le préfixe « xml » est réservé à des applications telles que la<br />
déclaration de la langue utilisée (« xml:lang ») ou le traitement des espaces<br />
(« xml:space »). Il n’est pas nécessaire d’y associer explicitement un URI : l’URI<br />
« http://www.w3.org/XML/1998/namespace » y est automatiquement associé.<br />
1.8.13 Rappel : des espaces de noms pour les attributs<br />
Les choses se corsent un peu quand on considère les attributs. Alors qu’un élément sans<br />
préfixe tombe dans l’espace de noms par défaut si celui-ci a été défini par un attribut<br />
« xmlns="..." », ce n’est pas le cas pour les attributs. Un attribut sans préfixe n’est dans<br />
aucun espace de noms; pour y être, un attribut doit être muni d’un préfixe.<br />
CC BY-NC-SA
Espaces de noms 105<br />
1.8.14 En résumé, qu’est-ce que les espaces de noms<br />
Une DTD définit un ensemble fixe d’éléments, ensemble qui ne peut être recombiné<br />
avec d’autres DTD; c’est un instrument rigide. Par contre, les espaces de noms<br />
permettent de recombiner des éléments provenant de différentes applications; ils permettent<br />
donc une grande flexibilité.<br />
Alors que la DTD définit des éléments et comment les utiliser ensemble, les espaces de<br />
noms ne permettent d’établir qu’un lien entre un élément et un URI, mais sans indiquer<br />
les contraintes d’utilisation.<br />
1.8.15 Questions d’auto-évaluation<br />
1. Choisissez l’expression qui décrit le mieux un espace de noms XML. Choisissez<br />
la bonne réponse parmi les choix suivants.<br />
(a) Un espace de noms XML est décrit par une DTD.<br />
(b) Un espace de noms XML est un ensemble de balises et d’attributs auquel<br />
peut correspondre un URI.<br />
(c) Un espace de noms XML est décrit par un URI qui est une adresse web<br />
pointant vers un document.<br />
2. Les espaces de noms font partie de la spécification XML originale (version 1.0)<br />
au même titre que les DTD. Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Faux.<br />
(b) Vrai.<br />
3. Les espaces de noms permettent d’utiliser deux DTD en même temps. Choisissez<br />
la bonne réponse parmi les choix suivants.<br />
(a) Faux.<br />
(b) Vrai.<br />
4. Les espaces de noms permettent d’utiliser deux vocabulaires XML en même<br />
temps. Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Faux.<br />
(b) Vrai.<br />
5. Dans le document XML suivant, qu’est-ce qui décrit le mieux l’espace de noms<br />
de l’élément « B »<br />
<br />
abcd<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 106<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) B<br />
(b) A<br />
(c) foo<br />
(d) http://www.bar.org/<br />
6. Quelle est la différence entre ces deux documents XML<br />
<br />
abcd<br />
<br />
<br />
abcd<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il n’y a aucune différence puisque l’élément « A » est associé par défaut à<br />
l’URI « http://www.foo.org/ ».<br />
(b) Dans le premier cas, l’élément « A » est dans l’espace de noms « foo »,<br />
alors que dans le second, « A » est dans l’espace de noms par défaut.<br />
7. Quel est l’espace de noms de l’élément « B » dans ce document<br />
<br />
<br />
abcd<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) http://www.mondomaine.org/<br />
(b) http://www.monsite.org/<br />
8. Quels sont les documents XML respectant les conventions des espaces de noms<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a)<br />
<br />
<br />
<br />
abcd<br />
<br />
CC BY-NC-SA
Espaces de noms 107<br />
<br />
<br />
(b)<br />
<br />
abcd<br />
efgh<br />
<br />
1234<br />
5678<br />
<br />
ijkl<br />
<br />
(c)<br />
<br />
<br />
<br />
9. Dans quels espaces de noms sont les attributs du document suivant :<br />
<br />
<br />
33<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) « base=’10’ » est dans l’espace de noms « urn:exemple1 », alors que<br />
« c:unite=’annee’ » est dans l’espace de noms « urn:exemple2 »<br />
(b) « base=’10’ » est dans l’espace de noms « "" » (vide), alors que<br />
« c:unite=’annee’ » est dans l’espace de noms « urn:exemple2 »<br />
(c) « base=’10’ » n’est dans aucun espace de noms, alors que<br />
« c:unite=’annee’ » est dans l’espace de noms « urn:exemple2 »<br />
10. Un parseur XML charge les URI associés aux espaces de nom qu’il rencontre.<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
CC BY-NC-SA
Module 1 : Introduction à XML 108<br />
1.8.16 Solutions<br />
1. (a) Une DTD peut être utilisée, mais ce n’est pas la seule possibilité.<br />
(b) (Bonne réponse) En effet.<br />
(c) Un URI est une adresse symbolique qui ne pointe pas nécessairement vers<br />
un document.<br />
2. (a) (Bonne réponse) Bien que compatible avec la norme XML, les espaces de<br />
noms n’en font pas partie.<br />
(b) Bien que compatible avec la norme 1.0, les espaces de noms furent introduits<br />
plus tard, environ un an après.<br />
3. (a) (Bonne réponse) On peut utiliser une DTD ou ne pas en utiliser, mais on ne<br />
peut pas en utiliser deux.<br />
(b) Les espaces de noms ne changent rien à la validation des documents : il<br />
faut toujours avoir une seule DTD.<br />
4. (a) Les espaces de noms permettent effectivement d’utiliser plus d’un vocabulaire<br />
XML en même temps.<br />
(b) (Bonne réponse) On peut en fait combiner autant de vocabulaires XML que<br />
l’on veut.<br />
5. (a) Non. Il s’agit du nom de l’élément.<br />
(b) Non. Il s’agit d’un nom d’élément.<br />
(c) Non. « foo » est un préfixe d’espace de noms qui n’est pas utilisé dans le<br />
document par un élément.<br />
(d) (Bonne réponse) Effectivement. L’élément « B » appartient à l’espace de<br />
noms par défaut qui est associé à l’URI « http://www.bar.org/ ».<br />
6. (a) Non.<br />
(b) (Bonne réponse) Effectivement.<br />
7. (a) Non. L’espace de noms a été redéfini.<br />
(b) (Bonne réponse) Effectivement.<br />
8. (a) (Bonne réponse) Il n’y a rien qui nous empêche de redéfinir un espace de<br />
noms.<br />
(b) (Bonne réponse) Ce document est conforme.<br />
(c) Ce document est bien formé, mais pas conforme aux conventions d’espace<br />
de noms. Le préfixe « pre: » n’a pas été déclaré.<br />
9. (a) Non, « base » n’est dans aucun espace de noms, car il n’a pas de préfixe.<br />
(b) Il n’y a pas de raison que « base » soit dans l’espace de noms « "" ».<br />
(c) (Bonne réponse) Effectivement, un attribut sans préfixe n’est pas dans un<br />
espace de noms.<br />
10. (a) Non, l’URI n’est qu’un identifiant.<br />
(b) (Bonne réponse) Effectivement, l’URI peut ne pas pointer vers un véritable<br />
site web.<br />
CC BY-NC-SA
Travail noté 1 109<br />
1.9 Travail noté 1<br />
1.9.1 Objectifs et pondération<br />
Ce travail compte pour 10 % de la note globale du cours.<br />
Ce travail contribue à l’évaluation des objectifs suivants :<br />
– Utiliser un « vocabulaire » ou une application XML avec vocabulaire XML pour<br />
présenter des informations dans le format XML.<br />
– Déterminer si un document XML est bien formé ou valable.<br />
– Interpréter des fichiers XML utilisant des espaces de noms.<br />
Les sept premières questions du travail valent 2,5 points chacune, la huitième vaut 3,5<br />
points; la neuvième question vaut 9 points, la dixième et la onzième valent 5 points<br />
chacune. Ce premier travail noté permet d’obtenir 40 points et compte pour 10 % de la<br />
note globale.<br />
1.9.2 Consignes<br />
Il est recommandé d’avoir terminé les activités d’autoévaluation du premier module<br />
avant de faire le travail noté.<br />
Vous devez remettre à la personne tutrice, par courriel et en fichier attaché, un document<br />
(Word 97/2000/XP, ODF, PDF, RTF ou en format texte) clairement identifié à votre<br />
nom. Indiquez également votre numéro d’étudiant (8 chiffres), la date du travail, le<br />
nom de la personne tutrice, avec les mentions « Travail noté 1 » et « <strong>INF</strong> <strong>6450</strong> ».<br />
Ne transmettez pas vos solutions en plusieurs fichiers. Ne transmettez pas une<br />
archive compressée (zip ou autre). Il s’agit d’un travail personnel et vous ne devez<br />
pas partager vos réponses.<br />
L’objet de votre courriel doit commencer par « [<strong>INF</strong><strong>6450</strong>][TRAVAIL1] »; dans<br />
le message, indiquez votre nom, votre numéro d’étudiant (8 chiffres), la date de<br />
remise de votre travail et le nom de votre personne tutrice, ainsi que les mentions<br />
« Travail noté 1 » et « <strong>INF</strong> <strong>6450</strong> ».<br />
Lorsque le contenu d’un document XML fait partie d’une question, vous devez<br />
supposer que le document débute avec le premier caractère et se termine avec le<br />
dernier : il n’y a pas d’espace ou de retour de chariot, ni au début ni à la fin des<br />
fichiers XML, mais tous les autres espaces ou retours de chariot comptent. Vous<br />
devez également supposer que les documents ne sont pas enregistrés avec la norme<br />
UTF-8 ou UTF-16, mais plutôt avec un outil banal comme le Bloc-notes qui sélectionne<br />
par défaut un jeu de caractères similaire à ISO-8859-1.<br />
Bon travail!<br />
CC BY-NC-SA
Module 1 : Introduction à XML 110<br />
Question 1<br />
Soit le document XML suivant :<br />
<br />
<br />
Davantage l’an prochain.<br />
<br />
<br />
<br />
1. Quel est le nom de l’élément-racine <br />
2. Combien d’éléments compte ce document <br />
3. Combien y a-t-il de balises dans ce document <br />
4. Combien y a-t-il de nœuds de texte dans ce document <br />
5. Combien d’attributs trouve-t-on dans ce document <br />
Question 2<br />
Soit le document XML suivant :<br />
<br />
<br />
<br />
<br />
<br />
<br />
]><br />
<br />
&administration;<br />
&administration;<br />
Marion Lepage<br />
<br />
1. Quel est le nom de l’élément-racine <br />
2. Quel est le contenu de l’élément « president » <br />
3. Quel est le contenu de l’élément « comptable » <br />
4. Est-ce qu’on pourrait omettre l’élément « adjoint » <br />
5. Combien d’éléments « president » peut contenir l’élément-racine <br />
CC BY-NC-SA
Travail noté 1 111<br />
Question 3<br />
Soit le document XML suivant :<br />
<br />
<br />
fraise, orange<br />
3<br />
<br />
<br />
1. À quel espace de noms, identifié par son URI, est-ce que l’élément « mots-clefs »<br />
appartient<br />
2. À quel espace de noms, identifié par son URI, est-ce que l’élément « recherche »<br />
appartient<br />
3. À quel espace de noms, identifié par son URI, est-ce que l’élément « yahoo:mot »<br />
appartient<br />
4. À quel espace de noms, identifié par son URI, est-ce que l’élément « nombre »<br />
appartient<br />
5. Combien y a-t-il d’espaces de noms dans ce document<br />
Question 4<br />
En utilisant un navigateur comme Mozilla Firefox, il est possible de déterminer<br />
si un document XML est bien formé. Dans cette question, nous vous demandons<br />
d’expliquer pourquoi les cinq documents présentés ci-dessous ne sont pas bien formés.<br />
Notez qu’on ne vous demande pas seulement d’indiquer où se trouve le problème<br />
ou de rapporter le message d’erreur qu’un outil vous donnerait.<br />
Expliquez clairement pourquoi les documents XML suivants ne sont pas bien formés.<br />
1. (Indice. Si Mozilla donne l’erreur suivante « XML Parsing Error: illegal parameter<br />
entity reference », expliquez ce que cela signifie!)<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 112<br />
<br />
]><br />
<br />
&administration;<br />
&administration;<br />
Marion Lepage<br />
<br />
2. <br />
<br />
Éric Beaudin<br />
automne<br />
Introduction aux affaires<br />
<br />
3. <br />
AWS Inc.<br />
SMS5SB11<br />
QC<br />
http://domaine.com/cgi-bin/script.plbox=sms5sb11&option=B<br />
<br />
4. <br />
<br />
124, rue Rochond<br />
<br />
5. <br />
<br />
Jean<br />
<br />
<br />
Jeanne<br />
<br />
Question 5<br />
Trouvez les 5 erreurs de validation du document suivant :<br />
<br />
<br />
<br />
<br />
<br />
]><br />
CC BY-NC-SA
Travail noté 1 113<br />
<br />
La plus grande.<br />
<br />
<br />
<br />
<br />
<br />
<br />
Question 6<br />
Soit le document DTD suivant :<br />
<br />
<br />
<br />
Il est situé à l’adresse « cours.dtd ». Écrivez un document XML pour décrire un cours<br />
de 3 modules qui s’intitulent respectivement : « 1. La vie sous-marine », « 2. La vie<br />
extraterrestre » et « 3. La vie supraterrestre ». Seul le troisième module est optionnel.<br />
Votre document XML doit être valable.<br />
Question 7<br />
Un document XML « normalisé » est tel que seul l’élément-racine contient des déclarations<br />
d’espace de noms. Écrivez un document XML qui soit équivalent à celui qui<br />
suit, au sens des espaces de noms : seul l’élément-racine contiendra des déclarations<br />
d’espace de noms.<br />
<br />
<br />
<br />
Jeanne Rigault<br />
<br />
<br />
<br />
Jean Perron<br />
<br />
<br />
MaCompagnie.com<br />
<br />
<br />
850$<br />
<br />
<br />
CC BY-NC-SA
Module 1 : Introduction à XML 114<br />
<br />
Daniel Legault<br />
<br />
<br />
Question 8<br />
Même question.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Question 9<br />
Produisez un document XML contenant une DTD interne codifiant les spécifications<br />
suivantes; dans le cas où les DTD ne permettent pas de codifier une spécification, vous<br />
devez l’ignorer.<br />
Nous voulons représenter un annuaire (élément nommé « annuaire ») contenant aucun,<br />
une seule ou plusieurs personnes (élément nommé « personne »). L’élément « annuaire<br />
» peut avoir un attribut nommé « titre ». Les éléments « personne » sont constitués,<br />
dans l’ordre, d’un élément « nom » contenant du texte, d’un élément « prenom »<br />
contenant du texte, d’un ou plusieurs éléments « courriel » contenant du texte, d’un<br />
élément optionnel « commentaire » contenant du texte, et de un ou plusieurs éléments<br />
« ami » devant être vide, soit sans aucun contenu.<br />
Les éléments « personne » ont deux attributs, un attribut « type » qui peut prendre les<br />
valeurs « étudiant », « professeur », « tuteur » et « cadre » avec « étudiant » comme<br />
valeur par défaut, et un attribut obligatoire « nas » qui doit servir d’identifiant unique.<br />
Les éléments « ami » ont un attribut « nas » qui doit correspondre à la valeur d’attribut<br />
« nas » d’un des éléments « personne ».<br />
Question 10<br />
Un document DTD a été proposé par John Shipman pour présenter des recettes de<br />
cuisine (« recipe » est « recette » en anglais, alors qu’on pourrait traduire librement<br />
« subrecipe » par « sous-recette » et « narrative » par « description textuelle », puis<br />
« time » par « durée », comme dans « temps de cuisson ») :<br />
CC BY-NC-SA
Travail noté 1 115<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Supposons que cette DTD est disponible à l’URL<br />
http://infohost.nmt.edu/tcc/help/xml/recipes/recipe.dtd<br />
Sur la base de cette DTD, produisez un document XML valable pour présenter une recette<br />
de votre choix. Il n’est essentiel qu’il s’agisse d’une vraie recette. Votre document<br />
XML doit utiliser tous les éléments et attributs définis par le document DTD. Vous devrez<br />
peut-être imaginer une recette un peu compliquée! Votre document doit avoir une<br />
déclaration XML et utiliser au moins un accent.<br />
Question 11<br />
Quel est l’équivalent en DTD du fichier Relax NG suivant <br />
carte = element carte { attribute courriel { text }, text }<br />
page = element page { text }<br />
livre = element livre { (carte | page) }<br />
CC BY-NC-SA
Module 2 : XML en tant que<br />
syntaxe pour les documents<br />
2.1 Aperçu<br />
2.1.1 Objectifs<br />
À la fin de ce module, vous devriez avoir approfondi votre compréhension du XML<br />
à l’aide d’exemples et mieux voir le rôle qu’il peut jouer dans votre organisation. En<br />
effet, il n’est pas suffisant de savoir ce qu’est le XML en tant que métalangage, il faut<br />
également comprendre d’où il vient et quel rôle il joue dans son domaine de prédilection<br />
: le web. L’objectif spécifique du module est :<br />
– Traduire, au sein de son organisation, sa compréhension du XML dans la gestion des<br />
informations.<br />
Pour atteindre cet objectif, nous vous proposons deux activités notées, soit une discussion<br />
de groupe sur le marquage sémantique et la rédaction d’un texte en utilisant le<br />
XML. Les lectures et les activités d’autoévaluation de ce module servent à alimenter et<br />
à préparer les activités notées.<br />
2.1.2 Démarche<br />
Vous devez effectuer les lectures de ce module avant de passer aux modules suivants.<br />
Nous vous invitons à procéder à l’étude de ce module dans l’ordre suivant :<br />
– Introduction au XHTML, MathML et SVG<br />
– XML comme format de documents (SGML, DocBook, ODF)<br />
– XML sur le web<br />
S’il y a lieu, vérifiez vos connaissances en répondant au questionnaire d’autoévaluation.<br />
117
Module 2 : XML en tant que syntaxe pour les documents 118<br />
Par ailleurs, à partir du moment où vous commencez l’étude du module 2, vous pouvez<br />
entreprendre le travail noté 2, soit l’activité de discussion en groupe dans le forum, laquelle<br />
peut s’étendre sur tout le cours (participation au forum). Vous pouvez toutefois<br />
commencer cette discussion (travail noté 2) plus tard dans le cours. Par contre, le<br />
module se termine par le travail noté 3, soit la rédaction d’un texte avec XML, que vous<br />
devez réaliser avant de passer au module suivant.<br />
Le pense-bête offre un rappel du HTML; dans la version imprimée du cours, il se trouve<br />
en annexe.<br />
2.2 Introduction au XHTML<br />
2.2.1 Objectif<br />
Connaître les notions de base du XHTML.<br />
2.2.2 Activité<br />
Lisez le texte qui suit, avant de lire les deux autres suggérés dans ce module. C’est un<br />
impératif pour bien progresser dans votre apprentissage du XML.<br />
2.2.3 Qu’est-ce que le XHTML<br />
Le HTML a été inventé par Tim Berners-Lee, alors qu’il travaillait pour le centre de<br />
recherche CERN en Suisse. L’intention de Berners-Lee était de proposer un système révolutionnaire<br />
de gestion de l’information qu’il appela World Wide Web. Comme pièce<br />
maîtresse de son architecture, il avait besoin d’un format de documents qu’il appela<br />
HTML (HyperText Markup Language). La première page web, dont l’adresse était<br />
http://nxoc01.cern.ch/hypertext/WWW/TheProject.html, vit le jour en 1990.<br />
Le HTML est un langage à base de balises, un peu comme une application XML. En<br />
fait, il existe une application XML appelée XHTML, qui est à la fois du HTML et<br />
du XML. Le document que vous lisez en ce moment en est un exemple. En effet, le<br />
document que vous lisez est à la fois du XML bien formé et valable, mais aussi<br />
du HTML.<br />
Rappelons qu’une « application XML » est un ensemble de balises et d’attributs, c’està-dire<br />
un vocabulaire XML, avec des conventions d’usage dont certaines peuvent être<br />
représentées par un document DTD.<br />
La très grande majorité des documents sur le web sont écrits en HTML et, de plus en<br />
plus, en XHTML. Une des raisons principales de l’utilisation du XHTML, c’est que<br />
les outils qui traitent le XML peuvent aussi traiter du XHTML puisque ce dernier est<br />
aussi du XML. Il est donc possible, dans une organisation, de combiner le contenu<br />
CC BY-NC-SA
Introduction au XHTML 119<br />
web (HTML) avec le stockage des informations en XML. Comme nous le verrons plus<br />
tard dans le cours (module 3, section portant sur le XSLT), on peut même transformer<br />
automatiquement le XML en XHTML.<br />
Si on dit « HTML » tout court, ce n’est pas nécessairement du XML et il se peut que<br />
les outils conçus pour le XML ne puissent être utilisés pour le traiter. Cependant, si<br />
on dit « XHTML », alors il s’agit à la fois de HTML et de XML et on peut utiliser<br />
les outils destinés au XML pour en traiter le contenu. Voici quelques différences entre<br />
le HTML et le XHTML :<br />
Les serveurs web distinguent le contenu en fournissant aux navigateurs différents<br />
codes MIME (Multipurpose Internet Mail Extensions), alors que le HTML a le code<br />
MIME « text/html », on utilise le code MIME « application/xml » ou « application/xhtml+xml<br />
» pour le XHTML. Avec le serveur web Apache, on obtient le résultat<br />
désiré en ajoutant un fichier « .htaccess », dans le même répertoire que nos fichiers<br />
XHTML, contenant la ligne « AddType application/xml .xhtml ».<br />
– En HTML traditionnel, on n’a pas à fermer les éléments. Ainsi, le code suivant<br />
« texte » est acceptable en HTML, mais en XHTML, il faut écrire<br />
« texte ».<br />
– Les valeurs d’attributs en HTML n’ont pas à être entre des guillemets ou apostrophes.<br />
Ainsi, le code « » est acceptable en HTML, mais en<br />
XHTML, il faut écrire « ».<br />
– En HTML, la casse des noms est sans importance. Ainsi, on peut remplacer « »<br />
par « », alors que ce n’est pas permis en XHTML.<br />
Dans ce cours, nous nous intéresserons surtout au XHTML. Un document XHTML<br />
prend la forme suivante :<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
Voici mon document.<br />
<br />
<br />
On reconnaît d’abord la déclaration XML qui n’a rien de particulier : . Comme pour tout document XML, on peut<br />
omettre la déclaration XML d’un document XHTML, mais si nous voulons écrire en<br />
français avec des lettres accentuées, il est nettement préférable d’avoir la déclaration<br />
XML de notre exemple.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 120<br />
On reconnaît ensuite la déclaration de type de document : . Observez qu’elle apparaît sur deux lignes, que c’est souvent le cas, mais<br />
que c’est un choix purement esthétique. La déclaration de type de document est un peu<br />
particulière : il s’agit d’une déclaration utilisant un identifiant public. On doit utiliser<br />
un tel identifiant quand on veut signifier qu’il s’agit d’une application XML commune;<br />
on évite ainsi que des milliers de personnes aillent chercher des documents DTD à<br />
l’adresse « http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd ». On s’attend qu’un<br />
logiciel qui dépend d’une application XML commune n’ait pas besoin d’aller chercher<br />
les documents DTD, chaque fois que le document XML est lu. Un navigateur comme<br />
Firefox ne tient pas compte de la DTD externe, on peut donc omettre la déclaration<br />
DOCTYPE sans problème.<br />
Le reste du document est simplement un élément-racine « html » contenant deux<br />
éléments : un élément head et un élément body. L’élément head doit contenir un<br />
élément title, alors que l’élément body peut être vide, mais peut aussi posséder du<br />
contenu XML mixte (texte et diverses balises XHTML). L’espace de nom ayant l’URI<br />
« http://www.w3.org/1999/xhtml » est utilisé.<br />
Si vous copiez le texte qui précède dans un éditeur de texte comme Bloc-notes et que<br />
vous enregistrez le fichier sous un nom comme « test.xhtml », vous devriez être capable<br />
d’ouvrir le fichier dans votre navigateur et de voir le texte « Voici mon document. »<br />
s’afficher à l’écran. Les documents HTML sont tous des documents en format texte et<br />
l’extension du fichier est arbitraire : on utilise tout aussi bien « .htm » que « .html »,<br />
« .xhtml » ou même « .xml ». L’avantage de l’extension « .xhtml » est d’informer<br />
le navigateur qu’il s’agit d’un document XHTML, donc un document HTML et un<br />
document XML.<br />
2.2.4 La structure du document XHTML : head et body<br />
Comme nous le disions, l’élément-racine d’un document XHTML est nommé « html ».<br />
Cet élément contient deux et exactement deux sous-éléments : head et body. L’élément<br />
head n’est pas affiché directement dans le navigateur et contient des métadonnées,<br />
c’est-à-dire une description du contenu. Un élément head doit au minimum contenir<br />
un élément title qui donne le titre du document XHTML. Par la suite, l’élément body<br />
contient un ensemble de balises et du texte (contenu mixte) qui sera affiché directement<br />
dans le navigateur.<br />
2.2.5 Les paragraphes en HTML<br />
L’élément body contient des balises et du texte. Les retours de ligne sont traités comme<br />
des espaces normaux. Ainsi, les deux documents suivants seront affichés de la même<br />
manière par un navigateur.<br />
<br />
CC BY-NC-SA
Introduction au XHTML 121<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
Voici mon document.<br />
Voici ma vie.<br />
Voici mon chat.<br />
<br />
<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
Voici mon document.<br />
Voici ma vie.<br />
Voici mon chat.<br />
<br />
<br />
La question qui se pose alors est : Comment faire des paragraphes En effet, dans<br />
les deux documents plus haut, le texte s’affichera sur une seule ligne (vous pouvez<br />
le tester!). La solution consiste à utiliser l’élément « p » pour « paragraphe ». Pour<br />
avoir trois paragraphes, on remplace le document HTML précédent par celui qui suit.<br />
Observez que chaque balise « p » ouverte doit être fermée.<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
Voici mon document.<br />
Voici ma vie.<br />
Voici mon chat.<br />
<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 122<br />
<br />
2.2.6 Les listes en HTML<br />
Supposons que l’on veuille faire une liste, comme ceci :<br />
– Premier point : le chat est noir.<br />
– Second point : le chat est blanc.<br />
– Dernier point : le chat est marron.<br />
On peut obtenir ce résultat avec un élément « ul » pour unordered list (liste sans ordre),<br />
contenant des éléments « li ». Observez que chaque balise « li » ouverte doit être<br />
fermée.<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
<br />
Premier point: le chat est noir.<br />
Second point: le chat est blanc.<br />
Dernier point: le chat est marron.<br />
<br />
<br />
<br />
Supposons maintenant que nous voulions une liste avec un compteur :<br />
1. Le chat est noir.<br />
2. Le chat est blanc.<br />
3. Le chat est marron.<br />
Il suffit alors de remplacer l’élément « ul » par l’élément « ol » pour ordered list (liste<br />
ordonnée) :<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
CC BY-NC-SA
Introduction au XHTML 123<br />
<br />
Le chat est noir.<br />
Le chat est blanc.<br />
Le chat est marron.<br />
<br />
<br />
<br />
2.2.7 Les tableaux en HTML<br />
Supposons maintenant que nous voulions produire un tableau. On peut l’obtenir à l’aide<br />
d’un élément « table ». Cet élément contiendra plusieurs éléments « tr » (éléments<br />
correspondant à une ligne) qui eux-mêmes contiennent des éléments « td » (éléments<br />
correspondant à une cellule). Ainsi, pour obtenir un tableau comme celui-ci :<br />
Nom<br />
Valeur<br />
Mustang 50 $<br />
Ferrari 500 $<br />
On utilise le code suivant :<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
<br />
<br />
Nom<br />
Valeur<br />
<br />
<br />
Mustang<br />
50 $<br />
<br />
<br />
Ferrari<br />
500 $<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 124<br />
Supposons maintenant que l’on veuille un tableau avec des lignes pour marquer et<br />
diviser les cellules. Il suffit alors d’utiliser l’attribut « border ». Sa valeur numérique<br />
représente l’épaisseur en pixels de la bordure. Ainsi, pour obtenir ce résultat :<br />
Nom<br />
Valeur<br />
Mustang 50 $<br />
Ferrari 500 $<br />
On utilisera le code XHTML suivant :<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
<br />
<br />
Nom<br />
Valeur<br />
<br />
<br />
Mustang<br />
50 $<br />
<br />
<br />
Ferrari<br />
500 $<br />
<br />
<br />
<br />
<br />
Tous les tableaux ne sont pas si simples. On peut faire en sorte qu’une même cellule<br />
occupe deux colonnes () ou deux rangées (). Aussi,<br />
souvent, on utilise l’élément « th » au lieu de l’élément « td » pour désigner la première<br />
rangée d’un tableau lorsque celle-ci forme l’entête descriptive du tableau. Il est aussi<br />
possible d’utiliser un élément « caption » au sein d’un tableau pour noter le titre du<br />
tableau :<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
CC BY-NC-SA
Introduction au XHTML 125<br />
<br />
<br />
<br />
Valeur de différents véhicule<br />
<br />
Nom<br />
Valeur<br />
<br />
<br />
Mustang<br />
50 $<br />
<br />
<br />
Ferrari<br />
500 $<br />
<br />
<br />
<br />
<br />
2.2.8 Les caractères italiques et gras<br />
On peut très facilement utiliser des effets de polices de caractères en HTML. Pour<br />
obtenir des caractères en italique, par exemple maman, il suffit d’utiliser un élément<br />
« i » comme ceci : maman. Pour des caractères en gras, comme maman,<br />
il suffit d’utiliser un élément « b » comme ceci : maman. On peut également<br />
combiner les deux, comme maman, en écrivant maman ou bien<br />
maman. Il est cependant préférable d’utiliser « em » (emphase) au lieu<br />
de « i » et « strong » (fort) au lieu de « b » : le navigateur choisira alors de rendre le<br />
texte dans un élément « em » avec un italique ou une autre technique appropriée, et de<br />
rendre le texte dans un élément « strong » en caractères gras ou une autre technique<br />
appropriée. On évite ainsi de confondre la présentation (italique ou gras) et la sémantique<br />
(emphase ou point fort). Dans le cas où un terme est défini, vous devriez utiliser<br />
un élément « dfn » (définition) comme dans cet exemple: « La mort est la<br />
fin de la vie ». La plupart des navigateurs afficheront alors le mot « mort » en caratères<br />
italiques.<br />
2.2.9 Les listes de définitions<br />
Supposons que nous voulions une liste de définitions comme celle qui suit :<br />
Voiture Véhicule sur roues.<br />
Chat Bête sauvage qui se nourrit de lait.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 126<br />
Éléphant Bête sauvage de couleur rose.<br />
On obtient ce résultat en XHTML avec un élément « dl » pour definition list contenant<br />
une série d’éléments « dt » et « dd » en paire, où l’élément « dt » fournit le terme à<br />
définir et l’élément « dd » sa définition.<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
<br />
Voiture<br />
Véhicule sur roues. <br />
Chat<br />
Bête sauvage qui se nourrit de lait. <br />
Éléphant<br />
Bête sauvage de couleur rose. <br />
<br />
<br />
<br />
2.2.10 Les lignes horizontales<br />
Pour obtenir une ligne horizontale, on utilise l’élément « hr » qui doit être vide. On<br />
doit donc écrire ou plus simplement . Voici une ligne horizontale :<br />
2.2.11 Les images<br />
Au moment d’écrire ces lignes, on trouve un logo de l’UQÀM à l’URL<br />
http://www.uqam.ca/img/logo/logo.jpg.<br />
Pour insérer une image dans un document HTML, il suffit d’utiliser une balise « img »<br />
avec comme attribut « src » pour source, soit l’URL. Par exemple, le code<br />
<br />
ou<br />
<br />
CC BY-NC-SA
Introduction au XHTML 127<br />
permettra d’insérer le logo de l’UQÀM dans un document. Il est préférable de prévoir<br />
que l’image pourrait ne pas être trouvée ou affichée en ajoutant un attribut « alt » qui<br />
contient du texte décrivant le contenu de l’image; si l’image n’est pas disponible, le<br />
texte contenu dans l’attribut « alt » s’affichera. Le résultat final prend la forme ce qui donne :<br />
2.2.12 Les hyperliens<br />
Pour inclure un hyperlien, comme dans l’exemple de la page de l’UQÀM<br />
[lien vers http://www.uqam.ca/], il suffit d’utiliser la syntaxe « page de l’UQÀM ».<br />
On peut également ajouter des marqueurs dans une page web en utilisant la syntaxe<br />
« Premier point de mon document ». Contrairement à la syntaxe<br />
« », l’attribut « name » n’ajoute pas un hyperlien, mais un marqueur<br />
généralement invisible dans la page. Par exemple, si la page contient plusieurs sections,<br />
on peut ajouter un marqueur au début de chaque section. On pourra alors faire des liens<br />
non seulement vers le document, mais aussi vers la section marquée dans le document.<br />
Ainsi, l’hyperlien « aller vers le premier point du document<br />
pageweb.html » mènera l’utilisateur dans le document « pageweb.html »,<br />
précisément au marqueur du « point 1 », s’il existe, évidemment.<br />
2.2.13 Les abbréviations<br />
On utilise parfois des abbréviations dans une page web tel que « etc. » ou « no ».<br />
On peut indiquer au navigateur qu’il s’agit d’une abbréviation avec un élément<br />
abbr comme ceci : « no ». Il est parfois utile d’utiliser l’attribut<br />
« title » pour décrire l’abbréviation en question comme dans ceci : « no ». De la même façon, on peut noter les acronymes avec<br />
un élément « acronym » comme ceci : « OTAN ».<br />
2.2.14 Les adresses<br />
Il est fréquent qu’une page web contienne un adresse. Le XHTML nous permet d’indiquer<br />
au navigateur qu’il s’agit bien d’une adresse avec l’élément « address », comme<br />
ceci : « Daniel Lemire 100, rue Sherbrooke ». Ici, l’élément<br />
« br » sert à noter un retour de charriot.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 128<br />
2.2.15 Les indices et exposants<br />
Dans un texte, il arrive qu’on veuille utiliser des exposants et des indices. Les éléments<br />
« sup » et « sub » servent à cette fonction. Par exemple, « premier » peut s’écrit « 1 er<br />
». Il n’est malheureusement pas possible de noter automatiquement des notes en bas de<br />
page en HTML ou XHTML.<br />
2.2.16 Le code et les exemples<br />
Il y a plusieurs éléments permettant de traiter de la programmation informatique ou des<br />
mathématiques. Le code informatique peut s’écrire dans un élément « code ». Le texte<br />
saisi à l’écran par un utilisateur peut s’écrire dans un élément « kbd ». Les exemples de<br />
sortie à l’écran peuvent s’écrire dans un élément « samp » (pour sample) et les variables<br />
peuvent s’écrire dans un élément « var ». Voici un exemple : « La valeur de la variable<br />
i est obtenue avec ce code:int i = 1; i+=1On<br />
s’attend à ce que l’utilisateur tape Yes pour oui. Voici un exemple de résultat:<br />
Error!. ».<br />
2.2.17 Les citations<br />
Pour citer quelqu’un, on peut utiliser un élément « q » lorsqu’il s’agit d’un courte<br />
citation au sein d’un paragraphe ou élément « blockquote » lorsque la citation doit<br />
former un court paragraphe. Plusieurs navigateur mettent automatiquement le contenu<br />
de l’élément « q » entre guillemets et le contenu de l’élément « blockquote » en retrait.<br />
Voici un exemple : « Jean a dit: mon cher!. Par la suite, je lui ai lu ce<br />
texte fatidique.Oh! Comme la mer a merée! Oh! Comme j’ai<br />
jéjé! ».<br />
2.2.18 Les révisions<br />
Les éléments del et ins permettent de noter un retrait et un ajout, respectivement,<br />
comme dans cet exemple: « J’ai mariéépousé ta mère ». Le<br />
navigateur se chargera d’afficher les retraits et les ajouts de manière compréhensible.<br />
2.2.19 La langue<br />
Le XHTML respecte la spécification XML voulant qu’on indique la langue dans laquelle<br />
est écrite un texte avec l’attribute « xml:lang ». Cet attribut est optionnel,<br />
mais peut s’avérer pratique. Dans le cas où un texte en langue étrangère est présent<br />
dans un paragraphe, on peut utiliser l’élément « span » pour en indiquer la<br />
CC BY-NC-SA
Introduction au XHTML 129<br />
langue. Voici un exemple : « Jean aime les computers ». L’élément « span » ne sert qu’à nous permettre de sélectionner<br />
un texte au sein d’un autre élément.<br />
2.2.20 Les commentaires<br />
Ajouter des commentaires en XHTML est facile. Les commentaires du XML s’appliquent:<br />
il suffit de débuter le commentaire par . Il n’est<br />
pas permis d’inclure au sein d’un commentaire deux tirets (--) ni de terminer un commentaire<br />
par un tiret.<br />
2.2.21 Séparation du contenu et de la présentation<br />
Avec le XHTML, on peut contrôler en partie l’apparence du texte, en utilisant des italiques<br />
ou en plaçant des bordures dans nos tableaux. Ce contrôle est cependant limité :<br />
on ne peut pas ajuster l’indentation des paragraphes et on ne peut que difficilement<br />
ajuster les marges de la page. Nous verrons au module 3, dans la section sur le CSS,<br />
qu’il existe une façon élégante d’y arriver.<br />
2.2.22 SVG<br />
On utilise de plus en plus la norme Scalar Vector Graphics (SVG) pour dessiner des<br />
figures en utilisant le XML. Le fichier suivant représente un rond jaune avec le texte<br />
« <strong>INF</strong> <strong>6450</strong> » au centre et deux lignes par dessus formant un X (notez les éléments<br />
« rect », « circle », « text » et « line »). Vous pouvez l’enregistrer sur votre disque et<br />
l’ouvrir avec Firefox (version 2.0 ou mieux). Vous pouvez déjà utiliser le format SVG<br />
avec plusieurs logiciels de bureautique ou tout simplement insérer un élément « svg »<br />
dans un document XHTML.<br />
Voici le code d’une image SVG.<br />
<br />
<br />
<br />
<br />
<br />
<strong>INF</strong> <strong>6450</strong><br />
Module 2 : XML en tant que syntaxe pour les documents 130<br />
style="stroke:rgb(99,99,99);"/><br />
<br />
<br />
Voici le rendu de l’image par votre navigateur.<br />
La signification des divers éléments devraient être claire. L’élément « svg » définit la<br />
planche à dessin avec sa largeur et sa hauteur. L’élément « rect » trace un rectangle à<br />
partir de deux coins opposés (0,0 et 300,300 dans notre exemple) . L’élément « circle »<br />
trace un cercle avec un centre et un rayon donnés. L’élément line trace une ligne<br />
d’un point à un autre. L’élément text inclut du texte à la position donnée. Il est aussi<br />
possible de tracer des ellipses et des formes arbitraires. Il est même possible d’animer<br />
du SVG.<br />
Il est facile d’apprendre le SVG par l’exemple si vous avez des notions de graphisme.<br />
Le site suivant comprend plusieurs exemples instructifs : http://www.w3schools.com/<br />
svg/svg_examples.asp. Vous pouvez aussi utiliser un logiciel de graphisme gratuit<br />
comme Inkscape (disponible sur les plate-formes Apple, Windows et Linux, voir http:/<br />
CC BY-NC-SA
Introduction au XHTML 131<br />
/www.inkscape.org/). Le site mozilla.org comprend une description complète du SVG<br />
(http://developer.mozilla.org/en/docs/SVG) tel qu’il est utilisé dans Firefox.<br />
2.2.23 MathML<br />
De la même façon qu’on peut représenter des graphiques en XML, on peut aussi représenter<br />
des formules mathématiques (supporté par Firefox 1.0 ou mieux). La syntaxe<br />
MathML est complexe et nécessite une bonne maîtrise de la typographique mathématique.<br />
Les éléments de bases d’une équation MathML sont « mi » (pour les variables<br />
ou fonctions), « mn » (pour les nombres) et « mo » (pour les opérateurs). D’autres<br />
éléments viennent s’ajouter comme « msup » (mise en exposant). On peut insérer un<br />
élément « math » directement dans un fichier XHTML. Il arrive malheureusement que<br />
des polices de caractères manquantes empêchent l’affichage correcte de la formule.<br />
Voici la formule « x 2 +x+2 » en MathML.<br />
<br />
x2<br />
+<br />
x<br />
+2<br />
x 2 + x + 2<br />
Vous pouvez utiliser des outils en ligne tel que itex2MML pour écrire vos équations.<br />
2.2.24 Convertir du HTML mal formé<br />
Dans une organisation, il est fréquent d’avoir à composer avec des sites web qui ne<br />
respectent pas les normes les plus élémentaires. Réécrire le HTML en XHTML peut<br />
sembler une tâche très ardue. Heureusement, il existe des outils gratuits pour corriger<br />
du HTML mal formé et générer automatiquement un XHTML valable, comme<br />
par exemple HTMLTidy (http://tidy.sourceforge.net/). Le W3C rend aussi disponible<br />
un outil de vérification en ligne des sites web pour s’assurer de leur conformité avec<br />
les normes (http://validator.w3.org/). Vous pourrez facilement constater que plusieurs<br />
pages à l’UQÀM ne sont pas du HTML valable, y compris certaines pages web de ce<br />
cours !<br />
2.2.25 Spécification Relax NG<br />
Il existe des définitions de type de document officielle pour le XHML, mais elles sont<br />
longues et peu lisible. Sean B. Palmer a écrit une spécification Relax NG pour un sousensemble<br />
du XHTML que je reproduis ici avec permission. Je vous invite à vérifier que<br />
vous pouvez en comprendre l’essentiel.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 132<br />
default namespace html = "http://www.w3.org/1999/xhtml"<br />
# Common Attributes<br />
Core.attrs =<br />
attribute id { xsd:ID },<br />
attribute class { text },<br />
attribute style { text },<br />
attribute title { text }<br />
I18n.attrs =<br />
attribute xml:lang { text },<br />
attribute dir { "ltr" | "rtl" }<br />
Main.attrs =<br />
Core.attrs, I18n.attrs,<br />
attribute onclick { text }<br />
# Content Models<br />
BlockMinusForm =<br />
(address | blockquote | del | div.elem | dl | h1 | h2 |<br />
h3 | hr | ins | ol | p | pre | script | table | ul)*<br />
Block = (BlockMinusForm | form)*<br />
InlineMinusMedia =<br />
(a | abbr | br | cite | code | del | em | input | ins |<br />
label | script | span | strong | sub | sup | textarea | text)*<br />
Inline = (InlineMinusMedia | img | object)*<br />
Flow = (Block | Inline)*<br />
# Elements<br />
start = html<br />
html = element html {<br />
I18n.attrs,<br />
head, body<br />
}<br />
head = element head {<br />
I18n.attrs,<br />
attribute profile { text },<br />
title, base, (script* & style* & meta* & link*)<br />
}<br />
CC BY-NC-SA
Introduction au XHTML 133<br />
title = element title {<br />
I18n.attrs,<br />
text<br />
}<br />
base = element base {<br />
attribute href { text },<br />
empty<br />
}<br />
meta = element meta {<br />
I18n.attrs,<br />
attribute content { text },<br />
attribute name { text },<br />
empty<br />
}<br />
link = element link {<br />
Main.attrs,<br />
attribute href { text },<br />
attribute rel { text },<br />
attribute type { text },<br />
empty<br />
}<br />
style = element style {<br />
I18n.attrs,<br />
attribute type { text },<br />
attribute title { text },<br />
text<br />
}<br />
script = element script {<br />
attribute type { text },<br />
attribute src { text },<br />
text<br />
}<br />
body = element body {<br />
Main.attrs,<br />
attribute onload { text },<br />
Block<br />
}<br />
div.elem = element div {<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 134<br />
}<br />
Main.attrs,<br />
Flow<br />
p = element p {<br />
Main.attrs,<br />
Inline<br />
}<br />
h1 = element h1 {<br />
Main.attrs,<br />
Inline<br />
}<br />
h2 = element h2 {<br />
Main.attrs,<br />
Inline<br />
}<br />
h3 = element h3 {<br />
Main.attrs,<br />
Inline<br />
}<br />
ul = element ul {<br />
Main.attrs,<br />
li+<br />
}<br />
ol = element ol {<br />
Main.attrs,<br />
li+<br />
}<br />
li = element li {<br />
Main.attrs,<br />
Flow<br />
}<br />
dl = element dl {<br />
Main.attrs,<br />
(dt, dd+)+<br />
}<br />
dt = element dt {<br />
Main.attrs,<br />
CC BY-NC-SA
Introduction au XHTML 135<br />
}<br />
Inline<br />
dd = element dd {<br />
Main.attrs,<br />
Flow<br />
}<br />
address = element address {<br />
Main.attrs,<br />
Inline<br />
}<br />
hr = element hr {<br />
Main.attrs,<br />
empty<br />
}<br />
pre = element pre {<br />
Main.attrs,<br />
InlineMinusMedia<br />
}<br />
blockquote = element blockquote {<br />
Main.attrs,<br />
attribute cite { text },<br />
Block<br />
}<br />
ins = element ins {<br />
Main.attrs,<br />
attribute cite { text },<br />
Flow<br />
}<br />
del = element del {<br />
Main.attrs,<br />
attribute cite { text },<br />
Flow<br />
}<br />
a = element a {<br />
Main.attrs,<br />
attribute href { text },<br />
attribute rel { text },<br />
(text & img* & span*)<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 136<br />
}<br />
span = element span {<br />
Main.attrs,<br />
Inline<br />
}<br />
br = element br {<br />
Core.attrs,<br />
empty<br />
}<br />
em = element em {<br />
Main.attrs,<br />
Inline<br />
}<br />
strong = element strong {<br />
Main.attrs,<br />
Inline<br />
}<br />
code = element code {<br />
Main.attrs,<br />
Inline<br />
}<br />
cite = element cite {<br />
Main.attrs,<br />
Inline<br />
}<br />
abbr = element abbr {<br />
Main.attrs,<br />
Inline<br />
}<br />
sub = element sub {<br />
Main.attrs,<br />
Inline<br />
}<br />
sup = element sup {<br />
Main.attrs,<br />
Inline<br />
}<br />
CC BY-NC-SA
Introduction au XHTML 137<br />
object = element object {<br />
Main.attrs,<br />
attribute data { text },<br />
attribute type { text },<br />
Flow<br />
}<br />
img = element img {<br />
Main.attrs,<br />
attribute alt { text },<br />
attribute src { text },<br />
attribute height { text },<br />
attribute width { text },<br />
empty<br />
}<br />
form = element form {<br />
Main.attrs,<br />
attribute action { text },<br />
attribute method { text },<br />
BlockMinusForm<br />
}<br />
label = element label {<br />
Main.attrs<br />
}<br />
input = element input {<br />
Main.attrs,<br />
attribute type { "text" | "submit" | "hidden" },<br />
attribute name { text },<br />
attribute size { text },<br />
attribute value { text },<br />
empty<br />
}<br />
textarea = element textarea {<br />
Main.attrs,<br />
attribute cols { text },<br />
attribute rows { text },<br />
attribute name { text },<br />
text<br />
}<br />
table = element table {<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 138<br />
}<br />
Main.attrs,<br />
caption, tr+<br />
caption = element caption {<br />
Main.attrs,<br />
Inline<br />
}<br />
tr = element tr {<br />
Main.attrs,<br />
(th | td)+<br />
}<br />
th = element th {<br />
Main.attrs,<br />
Flow<br />
}<br />
td = element td {<br />
Main.attrs,<br />
Flow<br />
}<br />
2.2.26 HTML 5<br />
Une nouvelle spécification du XHTML et du HTML appelée HTML 5 est en préparation.<br />
Elle est compatible avec les syntaxes HTML 4 et XHTML qu’elle vise à remplacer.<br />
Un document HTML 5 peut prendre la forme d’un document XML ou d’un<br />
document HTML. La déclaration doctype n’est utilisée que dans le cas où le document<br />
n’est pas un document XML et a été grandement simplifiée : il suffit d’inclure la ligne<br />
au début du fichier. Voici un exemple de document HTML 5 :<br />
<br />
<br />
<br />
<br />
Ceci est un exemple<br />
<br />
<br />
Voici un paragraphe.<br />
<br />
<br />
Un document HTML 5 en XML ne nécessite pas de déclaration doctype :<br />
CC BY-NC-SA
Introduction au XHTML 139<br />
<br />
<br />
<br />
Ceci est un exemple<br />
<br />
<br />
Voici un paragraphe.<br />
<br />
<br />
En HTML 5, on n’utilise plus les éléments acronym et plusieurs autres éléments moins<br />
utiles (basefont, big, center, s, strike, tt, u, frame, frameset, noframe, applet, isindex,<br />
dir). Plusieurs nouveaux éléments ont été ajoutés notamment les éléments section et<br />
article. On peut aussi ajouter une figure à un document avec une légende:<br />
<br />
<br />
Exemple d’image<br />
<br />
Les éléments canvas, video et audio sont aussi ajoutés : le HTML devient pleinement<br />
multimédia.<br />
2.2.27 Conclusion<br />
Le XHTML est un vocabulaire XML. Vous pouvez en consulter la DTD en ligne, à<br />
l’adresse http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd; il ne s’agit pas d’une<br />
DTD facile à lire, mais elle est néanmoins disponible. Notez qu’il existe de très bons<br />
livres de référence pour approfondir le XHTML, mais pour ce cours, il suffit de<br />
connaître les quelques balises présentées dans ce document.<br />
Un des avantages importants du XHTML sur des pages web traditionnelles (souvent<br />
mal formées) est qu’on peut facilement traiter des pages XHTML avec des outils destinés<br />
au XML. Par exemple, à partir des pages XHTML et XML de ce cours, j’ai pu<br />
créer automatiquement une version PDF du cours. En somme, on peut plus facilement<br />
extraire et traiter l’information d’une page XHTML que l’on peut le faire d’une page<br />
HTML mal formée.<br />
Pour avoir une vue d’ensemble des notions étudiées, consultez le pense-bête sur<br />
le HTML.<br />
2.2.28 Livres de référence<br />
– Jennifer Robbins, HTML and XHTML Pocket Reference, O’Reilly Media, 2006, 97<br />
pages.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 140<br />
– Jean Engels, XHTML et css : cours et exercices, Eyrolles, 2006.<br />
2.2.29 Activité d’autoévaluation<br />
Afin de vous assurez d’avoir bien compris les notions présentées dans cette leçon,<br />
vous devez créer un document XHTML valable, utilisant les différents éléments que<br />
nous avons étudiés. Afin que votre navigateur reconnaisse le document comme étant<br />
du XHTML, vous devriez utiliser l’extension « xthml ». Si vous déposez le fichier sur<br />
un serveur web Apache, il peut être nécessaire de créer aussi un fichier « .htaccess »<br />
et de le déposer dans le même répertoire que votre fichier XHTML afin que le serveur<br />
puisse reconnaître les fichiers XHTML. Votre fichier « .htaccess » pourrait avoir le<br />
contenu suivant :<br />
DirectoryIndex index.xhtml index.html index.php index.pl index.cgi<br />
AddType application/xml .xhtml<br />
2.3 XML comme format de documents<br />
2.3.1 Objectif<br />
Comprendre le XML comme format de documents.<br />
2.3.2 Activité<br />
Après avoir lu Introduction au XHTML, lisez le texte qui suit, puis répondez au questionnaire<br />
d’autoévaluation.<br />
Ce texte porte sur plusieurs formats de documents avec balises. D’abord, il y a le<br />
HTML que nous avons présenté, qui est un format de documents pour le web; et comme<br />
nous l’avons vu, il existe une version XML du HTML, appelée XHTML, qui est à la<br />
fois du XML et du HTML.<br />
2.3.3 Le SGML (Standardized General Markup Language)<br />
En 1969, Charles Goldfarb, Edward Mosher et Raymond Lorie ont inventé le<br />
GML (Generalized Markup Language). Chercheurs chez IBM, ils voulaient faciliter<br />
l’échange d’informations entre les outils d’édition, de formatage et de recherche de<br />
documents. Le GML possédait déjà un concept de « type de documents » similaire<br />
aux documents DTD modernes. Chez IBM, le GML a été utilisé pour la production<br />
d’environ 90 % des documents électroniques.<br />
CC BY-NC-SA
XML comme format de documents 141<br />
En 1978, l’American National Standards Institute (ANSI) a travaillé sur un projet de<br />
langage de description de textes, basé sur le GML; le projet s’est terminé en 1985 par<br />
la normalisation du SGML. Le centre de recherche CERN a été l’une des premières<br />
institutions, outre IBM, à mettre au point des outils pour le SGML.<br />
On dit souvent que le SGML est l’ancêtre du XML, dans la mesure où les créateurs<br />
du XML connaissaient le SGML et voulaient faire mieux. Le HTML est aussi fortement<br />
inspiré du SGML et existait au moment où le XML a été proposé. Il n’est donc pas<br />
surprenant que le XML et le HTML se ressemblent et puissent même se retrouver dans<br />
un seul format, le XHTML. La principale difficulté avec le SGML est sa complexité.<br />
On considère généralement que partout où le SGML était utilisé, il est maintenant préférable<br />
d’utiliser le XML. Comme les deux normes sont similaires, on migre souvent<br />
du SGML au XML. Quoiqu’il y ait de petits ennuis de conversion, le passage au XML<br />
permet de traiter les nouveaux documents avec les nombreux outils XML et de suivre<br />
la tendance.<br />
Le SGML n’est pas très différent du XHTML. Par exemple, les paragraphes sont spécifiés<br />
avec des éléments « para » de la même façon qu’ils sont spécifiés avec des éléments<br />
« p » en XHTML.<br />
2.3.4 Le XML comme format de documents<br />
Notons que le SGML, le HTML et le XML sont avant tout des formats de documents.<br />
On utilise maintenant le XML comme outil de programmation pour stocker et pour<br />
échanger des informations entre les logiciels; toutefois, l’objectif des créateurs du XML<br />
n’était que de créer un format de documents simple et pratique.<br />
Pour les documents, un des avantages des nombreux formats basés sur le XML ou<br />
le SGML est qu’ils « décrivent l’information » au lieu de la présenter. Par la suite, il<br />
est facile de publier ou transformer un document XML en document PDF, HTML ou<br />
autre, selon les besoins. La séparation du contenu et de sa présentation est un facteur<br />
de productivité important parce qu’on simplifie la tâche de l’écriture, la ramenant au<br />
contenu seulement.<br />
La séparation du contenu et de sa présentation existe, en partie, dans le XHTML. Par<br />
exemple, quand on ajoute un élément de paragraphe « p », on fait un choix qui s’appuie<br />
sur la logique du texte, non sur son apparence. Quant aux choix des polices, de l’espace<br />
entre les lignes, de l’espace entre les paragraphes ou des couleurs, ils ne sont généralement<br />
pas pris en compte par le XHTML. Mais tout n’est pas parfait; l’utilisation de<br />
balises pour appeler de l’italique, soit « i » en XHTML, ne nous assure pas une séparation<br />
complète entre la présentation et le contenu. Par exemple, il serait plus « logique »<br />
d’indiquer qu’un mot appartient à une langue étrangère et qu’il apparaisse dès lors en<br />
italique. Ainsi, au lieu d’écrire « La vie est cool. », on aimerait écrire « La vie<br />
est cool. » ou quelque chose de similaire. Le XHTML constitue<br />
donc un compromis entre une séparation complète du contenu et de sa présentation, et<br />
l’absence de séparation.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 142<br />
Comme nous le verrons dans le troisième module, la façon la plus naturelle de dicter<br />
la présentation d’un document XHTML est d’utiliser un ou plusieurs fichiers CSS.<br />
En plaçant les instructions de formatage dans des fichiers CSS, distincts des fichiers<br />
XHTML, on obtient une bonne séparation du contenu et de sa présentation. Cette approche<br />
a un grand avantage : si on doit changer l’apparence d’un site web, on peut se<br />
contenter d’éditer quelques fichiers CSS au lieu de modifier le contenu lui-même qui<br />
se trouve dans plusieurs fichiers XHTML. Par exemple, si on veut que le texte contenu<br />
dans les tableaux soit en caractères gras et que le texte des listes apparaisse en rouge,<br />
on utilisera les instructions CSS suivantes :<br />
td {font-weight:bold;}<br />
li {color:red;}<br />
Le XML est aussi très utile pour aider à l’autodescription des informations. Par<br />
exemple, si dans un texte vous mettez tous les termes techniques en italique, il est<br />
possible que vous puissiez plus tard faire une recherche dans votre document pour<br />
tous les termes techniques. Toutefois, quelqu’un qui ne connaîtrait pas votre convention<br />
pourrait avoir beaucoup de mal à faire la même recherche. Par contre, si vous<br />
utilisez un élément particulier pour les termes techniques comme les balises ,<br />
il devient beaucoup plus facile à quelqu’un d’autre de s’y retrouver<br />
dans votre document. On pourrait objecter que l’ajout de nombreuses balises alourdira<br />
le texte qui occupera alors trop de place sur le disque; l’expérience montre que la<br />
pérennité des documents doit presque toujours être privilégiée par rapport à l’utilisation<br />
de l’espace disque.<br />
En outre, le XML est un format ouvert : on peut utiliser une multitude d’outils différents<br />
pour manipuler les documents XML; nous ne sommes pas limités à des produits<br />
spécifiques à une compagnie ou institution donnée. Le XML a donc l’avantage sur<br />
plusieurs autres formats quant à sa pérennité.<br />
2.3.5 Le format DocBook<br />
Développé à partir de 1991, le format DocBook est un format de documents souvent<br />
utilisé pour la documentation technique. Le format DocBook est une application<br />
SGML qui devient une application XML. Il existe de nombreux outils permettant de<br />
transformer un document DocBook en document HTML ou PDF.<br />
Le format DocBook possède de nombreux avantages pour la rédaction de documents<br />
techniques parce qu’il assure une grande séparation entre le contenu et sa présentation :<br />
il ne permet que des balises ayant trait à la logique du texte; par exemple, il n’est pas<br />
possible de spécifier une police de caractères en DocBook. L’auteur peut alors concentrer<br />
son attention sur le contenu du document, sans perdre de temps avec le formatage,<br />
qui est une étape ultérieure. La séparation du contenu et de sa présentation permet aussi<br />
que plusieurs personnes puissent travailler sur un même projet de documentation tout<br />
en assurant une présentation uniforme, parce que DocBook ne comprend pas d’instructions<br />
de formatage.<br />
CC BY-NC-SA
XML comme format de documents 143<br />
Malheureusement, comme les autres formats hérités du SGML, plusieurs documents en<br />
format DocBook sont du SGML et non du XML; on ne peut donc pas utiliser les outils<br />
XML pour tous les documents DocBook. Par contre, la situation est en train de changer;<br />
il devient plus facile de déterminer si un document est bel et bien un document XML :<br />
la déclaration XML placée au début d’un document DocBook nous l’indique.<br />
Le format DocBook est fréquemment utilisé dans les projets de logiciels libres et « open<br />
source », ainsi que par certaines grandes sociétés, comme IBM. En général, les avantages<br />
du format DocBook sont plus visibles dans un contexte de travail d’équipe.<br />
La création d’un document DocBook simple n’est pas très difficile. Tout d’abord, bien<br />
qu’elle puisse varier selon les versions, la déclaration de type de document d’un document<br />
DocBook ressemble à ceci :<br />
<br />
Dans ce cas, on voit que le document DTD se trouve à l’adresse :<br />
http://www.oasis-open.org/docbook/xml/4.4CR2/docbookx.dtd<br />
Il faut cependant noter qu’il s’agit d’un document DTD qui dépend d’autres documents<br />
DTD et que la lecture d’un tel type de document DTD n’est pas très facile.<br />
L’élément-racine d’un document DocBook peut varier, mais les deux principales structures<br />
sont « book » (livre) et « article »; notez que l’on peut commencer par l’une ou<br />
l’autre :<br />
<br />
<br />
<br />
(...)<br />
<br />
<br />
<br />
<br />
(...)<br />
<br />
Ensuite, on doit ajouter un élément « bookinfo » ou « articleinfo », selon que le document<br />
est un livre ou un article. Le plus souvent, les éléments en question contiennent<br />
un élément « title » contenant le titre, ainsi qu’un élément « author » qui contiendra les<br />
éléments « firstname » (prénom) et « surname » (nom de famille). On peut aussi ajouter<br />
un élément « copyright » (droit d’auteur) qui contiendra un élément « year » (année)<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 144<br />
et un élément « holder » (titulaire). Voici quelques structures courantes de documents<br />
DocBook :<br />
<br />
<br />
<br />
<br />
Notre documentation<br />
<br />
Alexis<br />
Letrotteur<br />
<br />
2004Bell Canada<br />
<br />
(...)<br />
<br />
<br />
<br />
<br />
<br />
Le sens de la vie<br />
<br />
Gilles<br />
Proulx<br />
<br />
2004<br />
Gouvernement du Canada<br />
<br />
<br />
(...)<br />
<br />
L’élément de base d’un document DocBook est l’élément « para » qui note la présence<br />
d’un paragraphe. Dans le cas d’un livre, on va le plus souvent faire suivre l’élément<br />
« bookinfo » d’éléments « chapter » (chapitre), qui eux-mêmes peuvent contenir des<br />
éléments « section », comme dans l’exemple qui suit :<br />
<br />
<br />
<br />
<br />
Notre documentation<br />
CC BY-NC-SA
XML comme format de documents 145<br />
<br />
Alexis<br />
Letrotteur<br />
<br />
2004Bell Canada<br />
<br />
<br />
Premier chapitre<br />
<br />
Première section du premier chapitre<br />
Mettre ici le premier paragraphe de la première section.<br />
<br />
<br />
<br />
Observez que tous les éléments « chapter », ainsi que tous les éléments « section »<br />
débutent par un élément « title » : c’est souvent suffisant. Il n’est pas permis de commencer<br />
un élément « section » ou « chapter » directement par un élément « para ».<br />
Par contre, on pourrait omettre d’avoir des sections dans nos chapitres, comme dans<br />
l’exemple qui suit :<br />
<br />
<br />
<br />
<br />
Notre documentation<br />
<br />
Alexis<br />
Letrotteur<br />
<br />
2004Bell Canada<br />
<br />
<br />
Premier chapitre<br />
Mettre ici le premier paragraphe du premier chapitre.<br />
<br />
<br />
Dans le cas d’un simple article, nous n’utiliserons pas les éléments « chapitre » et il<br />
suffit, le plus souvent, d’utiliser des éléments « section », comme dans l’exemple qui<br />
suit :<br />
<br />
<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 146<br />
<br />
<br />
Notre documentation<br />
<br />
Alexis<br />
Letrotteur<br />
<br />
2004Bell Canada<br />
<br />
<br />
Première section de l’article<br />
Mettre ici le premier paragraphe de la première section.<br />
<br />
<br />
Deuxième section de l’article<br />
Mettre ici le premier paragraphe de la seconde section.<br />
<br />
<br />
On pourrait aussi utiliser les éléments « sect1 », « sect2 », « setc3 » et ainsi de suite,<br />
pour obtenir les notions de section, sous-section, sous-sous-section et ainsi de suite.<br />
Comme le format DocBook est destiné à la documentation technique, il existe plusieurs<br />
balises pour décrire le code informatique. L’élément le plus simple est l’élément<br />
« programlisting ». Ainsi, pour ajouter un petit programme Java dans un document<br />
DocBook, on utilisera l’élément suivant :<br />
<br />
public static void main(String[] arg) {<br />
System.out.println("Allo!");<br />
}<br />
<br />
On peut également placer un élément « programlisting » dans les éléments « section »,<br />
« chapter », « para », etc.<br />
Tout comme en HTML, on peut créer des listes avec les éléments « itemizedlist »<br />
(liste non ordonnée, équivalent de « ul » en HTML) et « orderedlist » (liste ordonnée,<br />
équivalent de « ol » en HTML). Une liste est constituée d’éléments « listitem » qui ne<br />
peuvent contenir directement du texte : on met généralement des éléments « para » dans<br />
les éléments « listitem ». Par contre, les éléments « listitem » ne peuvent apparaître hors<br />
des éléments « itemizedlist » et « orderedlist ». En outre, on place les listes dans les<br />
éléments « chapter », « section », etc. Voici quelques exemples :<br />
<br />
<br />
un triangle<br />
CC BY-NC-SA
XML comme format de documents 147<br />
<br />
<br />
un losange<br />
<br />
<br />
<br />
<br />
Premier élément (numéro 1)<br />
<br />
<br />
Second élément (numéro 2)<br />
<br />
<br />
Le format DocBook est supporté par certains traitement de textes comme OpenOffice<br />
qui est disponible gratuitement.<br />
2.3.6 L’ODF (Open Document Format)<br />
Historiquement, les formats de bureautiques ont été propriétaires, que ce soit le format<br />
WordPerfect ou le format Microsoft Word. Pour une institution, cela pose le problème<br />
de la pérennité des documents : qu’est-ce qui se produit si la compagnie qui propose<br />
un format décide de ne plus supporter un ancien format, parce qu’elle fait faillite ou<br />
change sa stratégie commerciale Qu’est-ce qui se produit si elle décide d’augmenter<br />
le coût de ses produits L’Open Document Format (ODF) est une norme XML adoptée<br />
en mai 2005 par OASIS et est devenu une norme ISO (ISO 26300.2006) le 30 novembre<br />
2006. Le format ODF est un format XML que tout le monde peut utiliser librement.<br />
Nous allons voir différentes techniques dans ce cours qui permettent de manipuler des<br />
documents XML et elles s’appliquent au format ODF.<br />
Le format ODF n’est pas très différent des nouveaux formats Open XML utilisés par<br />
Microsoft Office, mais au lieu de n’être soutenu que par une seule compagnie, ODF<br />
provient d’une entente entre plusieurs grandes sociétés : Adobe Systems, IBM, Intel,<br />
Novell et Sun Microsystems. Dans les deux cas (ODF et Open XML), les fichiers XML<br />
sont mis dans une archive compressée et nous avons accès à la sémantique des balises<br />
XML. Le logiciel OpenOffice utilise le format ODF et a les avantages d’être gratuit<br />
et disponible pour une variété de systèmes (Apple, Linux, Microsoft, etc.). Il est aussi<br />
possible de créer des documents ODF à partir de Microsoft Office 2007 à l’aide d’une<br />
composante logicielle supplémentaire (Open XML Translator). Dans le cadre de ce<br />
cours, vous pouvez remettre vos travaux dans le format ODF.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 148<br />
2.3.7 Questions d’auto-évaluation<br />
1. Quel énoncé décrit le mieux l’intention des créateurs du XML Choisissez la<br />
bonne réponse parmi les choix suivants.<br />
(a) Ils voulaient créer un format destiné aux programmeurs.<br />
(b) Ils voulaient créer un format de documents similaire au SGML ou au<br />
HTML.<br />
(c) Ils voulaient créer un format universel pour l’échange des données sur<br />
le web.<br />
2. Parmi les affirmations suivantes, lesquelles s’appliquent au XML Choisissez<br />
toutes les réponses qui s’appliquent.<br />
(a) Le XML aide à séparer le contenu d’un document de sa présentation.<br />
(b) Le XML encourage l’utilisation des formats propriétaires dans la création<br />
des documents comme Microsoft Word 97 ou PowerPoint 97.<br />
(c) Le XML permet de publier un même document dans plusieurs formats.<br />
3. Voici un exemple de document DocBook XML valable. Parmi les énoncés qui<br />
suivent, quels sont ceux qui s’appliquent à ce document<br />
<br />
<br />
]><br />
<br />
<br />
Notre documentation<br />
<br />
&prenomduresponsable;<br />
&nomduresponsable;<br />
<br />
2004&prenomduresponsable;<br />
&nomduresponsable;<br />
<br />
<br />
Ceci est le premier chapitre de notre documentation.<br />
<br />
En cas de problème avec ce document, veuillez vous adresser à<br />
&prenomduresponsable; &nomduresponsable;.<br />
CC BY-NC-SA
XML comme format de documents 149<br />
Pour l’instant, il n’y a rien d’autre dans le document.<br />
<br />
<br />
<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) Dans ce document, il suffit de modifier le nom du responsable à un seul<br />
endroit et les changements s’appliqueront automatiquement dans tout le<br />
document.<br />
(b) Le document contient un chapitre et deux paragraphes.<br />
(c) Une fois publié dans un format comme HTML, PDF ou RTF, le lecteur<br />
verra un chapitre commençant par "Ceci est le premier chapitre" et se terminant<br />
avec "terminer ce document".<br />
4. Qu’est-ce qui ne va pas avec le document DocBook suivant<br />
<br />
<br />
<br />
Je suis certain que ce document est du XML valable!<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Rien. Il s’agit d’un document valable.<br />
(b) Il y a une erreur dans la déclaration de type.<br />
(c) Il y a une erreur dans l’élément « para ».<br />
5. Parmi les énoncés suivants, quels sont ceux qui s’appliquent au format Doc-<br />
Book Choisissez toutes les réponses qui s’appliquent.<br />
(a) L’auteur d’un document DocBook se soucie uniquement du contenu et ne<br />
perd pas de temps à choisir des polices de caractères ou des couleurs pour<br />
son texte.<br />
(b) Si plusieurs personnes produisent la documentation pour un projet, il n’y a<br />
aucun problème à faire en sorte que la présentation soit uniforme, puisque<br />
le format DocBook ne contient aucune information touchant la présentation<br />
du texte.<br />
(c) Le format DocBook est du XML; on peut donc employer tous les outils<br />
XML sur tous les documents DocBook.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 150<br />
6. Votre société décide d’utiliser le XML comme format d’échange pour ses listes<br />
de numéros de série; elle pourra ainsi utiliser les outils XML et assurer la pérennité<br />
des documents. L’ingénieur en charge propose deux formats possibles. Quel<br />
format choisissez-vous Dites pourquoi.<br />
<br />
<br />
232-434<br />
333-434<br />
111-434<br />
444-555<br />
<br />
<br />
232-434 333-434 111-434 444-555<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Le premier choix est préférable, car il n’y a qu’un seul numéro de série par<br />
ligne et le résultat est plus lisible.<br />
(b) Le second choix est préférable parce qu’il utilise moins d’espace.<br />
(c) Le premier choix est préférable parce qu’on peut voir tout de suite les numéros<br />
de série.<br />
7. Parmi les suivants, quels sont les documents DocBook valables Choisissez<br />
toutes les réponses qui s’appliquent.<br />
(a)<br />
<br />
<br />
<br />
<br />
<br />
Notre documentation<br />
<br />
Jean<br />
Bergeron<br />
<br />
2004UQ<br />
<br />
CC BY-NC-SA
XML comme format de documents 151<br />
<br />
Ceci est le premier chapitre de notre documentation.<br />
<br />
<br />
Ceci est le premier point<br />
<br />
Ceci est le second point<br />
Ceci est le troisième point<br />
<br />
<br />
<br />
<br />
(b)<br />
<br />
<br />
<br />
<br />
<br />
Notre documentation<br />
<br />
Jean<br />
Bergeron<br />
<br />
2004UQ<br />
<br />
<br />
Ceci est le premier chapitre de notre documentation.<br />
Voici un exemple de code Java:<br />
<br />
public static void main(String[] arg) {<br />
System.out.println("Allo!");<br />
}<br />
<br />
<br />
<br />
(c)<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 152<br />
<br />
<br />
Notre documentation<br />
<br />
Jean<br />
Bergeron<br />
<br />
2004UQ<br />
<br />
<br />
<br />
public static void main(String[] arg) {<br />
System.out.println("Allo!");<br />
}<br />
<br />
Ceci est le premier chapitre de notre documentation.<br />
<br />
<br />
(d)<br />
<br />
<br />
<br />
<br />
<br />
Notre documentation<br />
<br />
Jean<br />
Bergeron<br />
<br />
2004UQ<br />
<br />
<br />
Ceci est le premier chapitre de notre documentation.<br />
Voici un exemple de code Java:<br />
<br />
public static void main(String[] arg) {<br />
if(arg.length
XML comme format de documents 153<br />
(e)<br />
<br />
<br />
<br />
<br />
<br />
Notre documentation<br />
<br />
Jean<br />
Bergeron<br />
<br />
2004UQ<br />
<br />
<br />
Ceci est le premier chapitre de notre documentation.<br />
<br />
Ceci est le premier point<br />
Ceci est le second point<br />
<br />
<br />
<br />
2.3.8 Solutions<br />
1. (a) Bien que cela soit vrai en partie, leur but premier était de créer un format<br />
de documents simple et efficace.<br />
(b) (Bonne réponse) Effectivement.<br />
(c) Non. Leur but premier était de créer un format pour les documents.<br />
2. (a) (Bonne réponse) Effectivement, dans le contexte des documents XML, le<br />
XML sert le plus souvent à décrire le contenu du document plutôt que la<br />
façon dont il sera présenté. On utilise d’autres technologies, comme les<br />
technologies CSS ou XSLT pour la présentation.<br />
(b) Non. Le XML n’encourage pas les formats propriétaires pour les documents;<br />
il encourage plutôt l’utilisation d’applications XML qui agissent<br />
comme des normes acceptées par des communautés.<br />
(c) (Bonne réponse) Généralement, la version XML originale n’est pas destinée<br />
à être lue par les humains; on s’attend plutôt à ce que le document XML<br />
soit transformé ou publié dans un format pratique pour la lecture.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 154<br />
3. (a) (Bonne réponse) Effectivement, la DTD interne contient deux déclarations<br />
d’entités qui nous permettent d’éviter de recopier partout le nom du responsable.<br />
On ne risque donc pas de commettre des erreurs si jamais on devait<br />
changer ce nom.<br />
(b) (Bonne réponse) Effectivement, la structure du document est claire.<br />
(c) Non, la phrase "Il faudrait bien que je me dépêche à terminer ce document."<br />
est un commentaire XML et ne sera normalement pas incluse dans<br />
la version destinée à la consommation par des humains.<br />
4. (a) Non. La déclaration de type déclare l’élément-racine « book », alors que<br />
l’élément-racine est « para ».<br />
(b) (Bonne réponse) Effectivement, il faudrait avoir
XML sur le web 155<br />
2.4 XML sur le web<br />
2.4.1 Objectif<br />
Comprendre le XHTML pour publier des documents sur le web.<br />
2.4.2 Activité<br />
Lisez le texte qui suit, puis répondez au questionnaire d’autoévaluation.<br />
2.4.3 Le XHTML et le web<br />
Rappelons d’abord que le XHTML est un format hybride : il tient à la fois du HTML<br />
et du XML. Nous allons étudier ce format, examiner son importance et son rôle pour<br />
la publication de documents sur le web.<br />
Produire du XHTML est une des principales façons de publier du XML sur le web. Le<br />
XHTML en question peut être produit à la main avec un éditeur de texte : dans ce cas,<br />
il faudra s’assurer qu’il est bien formé. Avec un navigateur comme Mozilla Firefox, on<br />
peut s’en assurer en l’enregistrant avec un nom portant l’extension « .xhtml », comme<br />
« mon_fichier.xhtml », et en l’ouvrant avec le navigateur. On peut aussi produire du<br />
XHTML en « transformant un fichier XML », ce que nous verrons dans le prochain<br />
module. Finalement, on utilise aussi beaucoup de XML sur le web sans passer par le<br />
XHTML, soit en utilisant la technologie CSS, que nous étudierons dans le prochain<br />
module, soit en destinant le XML aux machines.<br />
L’avantage du XHTML est de pouvoir bénéficier de toute la puissance du XML,<br />
de toutes les astuces et outils que l’on connaît en XML, tout en conservant le format<br />
HTML qui s’est montré utile au fil des ans.<br />
On peut se demander alors pourquoi le HTML ne suffit pas. Après tout, le web s’est<br />
fait avec le HTML et ça fonctionne bien. L’embarras avec le HTML, c’est qu’il permet<br />
de faire des choses que les machines ne savent pas bien traiter. Par exemple, prenons le<br />
document HTML typique suivant :<br />
<br />
<br />
Voici mon document.<br />
Il est beau, non<br />
<br />
<br />
Cet exemple n’est pas un document XML valable! On voit bien qu’il s’agit d’un document<br />
avec deux paragraphes (balises « p »), dont une partie est en caractères gras<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 156<br />
(balise « b ») et une autre en italique (« i »). On peut toutefois se demander, à juste<br />
titre, si la phrase « Il est beau, non » est en italique ou pas.<br />
Il y a deux façons de rendre ce document HTML en XHTML :<br />
<br />
<br />
<br />
<br />
le titre est obligatoire en XHTML<br />
<br />
<br />
Voici mon document.<br />
Il est beau, non<br />
<br />
<br />
ou encore<br />
<br />
<br />
<br />
<br />
le titre est obligatoire en XHTML<br />
<br />
<br />
Voici mon document.<br />
Il est beau, non<br />
<br />
<br />
On constate aisément que le XHTML ne tolère pas les ambiguïtés qui rendent le HTML<br />
difficile à traiter par les machines. C’est un avantage de taille, car il existe plusieurs<br />
outils gratuits pour traiter le XML et qui peuvent être utilisés avec le XHTML, alors<br />
que les outils pour traiter le HTML sont plus difficiles à développer et, en général, plus<br />
capricieux parce qu’ils doivent traiter des ambiguïtés.<br />
Le XHTML permet aussi de faire des choses qui n’existent pas en HTML. Par exemple,<br />
on peut utiliser des appels d’entités. Supposons que le nom d’un auteur ou le titre<br />
de son livre apparaissent à plusieurs reprises dans un document. La redondance de<br />
l’information peut être une source d’erreur : si on change le titre du livre à un endroit,<br />
il faut le changer partout. Avec le XHTML, on peut déclarer les entités suivantes :<br />
<br />
CC BY-NC-SA
XML sur le web 157<br />
<br />
Ensuite, on pourra avoir le document suivant :<br />
<br />
<br />
]><br />
<br />
<br />
&titre;<br />
<br />
<br />
Le titre de ce livre est: &titre;. L’auteur est &monnom;.<br />
Copyright 2010, par &monnom;.<br />
<br />
<br />
Le résultat à l’écran, dans un navigateur qui comprend le XHTML, sera :<br />
Le titre de ce livre est: Le père de tous les documents.<br />
L’auteur est Daniel Lemire.<br />
Copyright 2010, par Daniel Lemire.<br />
2.4.4 Questions d’auto-évaluation<br />
1. Parmi les documents suivants, lesquels sont du XHTML valable<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) <br />
<br />
<br />
<br />
Un titre<br />
<br />
<br />
Voici mon document<br />
<br />
<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 158<br />
(b) <br />
<br />
<br />
<br />
Un titre<br />
<br />
<br />
Voici mon document<br />
<br />
<br />
(c) <br />
<br />
]><br />
<br />
<br />
Un titre<br />
<br />
<br />
&texte;<br />
<br />
<br />
(d) <br />
<br />
]><br />
<br />
<br />
Un titre<br />
<br />
<br />
&texte;<br />
<br />
<br />
(e) <br />
<br />
<br />
CC BY-NC-SA
XML sur le web 159<br />
<br />
Un titre<br />
<br />
<br />
<br />
<br />
<br />
2. Quel énoncé décrit le mieux le XHTML<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Un document XHTML est du XML bien formé.<br />
(b) Le document XHTML devrait être du XML bien formé, mais le<br />
navigateur va tolérer de petites erreurs comme des balises croisées<br />
test.<br />
(c) Le XHTML est une nouvelle technologie qui exige un investissement important<br />
et une conversion coûteuse des documents.<br />
3. Par rapport au XHTML, les énoncés suivants sont-ils justes<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) Si mon entreprise utilise déjà beaucoup le XML, le XHTML est un choix<br />
plus facile.<br />
(b) Les navigateurs ne supportent pas encore XHTML.<br />
(c) Le XHTML est une technologie favorisant la pérennité des documents.<br />
4. Quels énoncés, parmi les suivants, décrivent bien le XHTML dans le contexte du<br />
XML<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) On peut utiliser les balises XHTML dans nos propres DTD.<br />
(b) On peut utiliser nos propres balises en XHTML.<br />
(c) On peut définir ses propres entités en XHTML.<br />
5. Parmi les énoncés suivants, lesquels s’appliquent à un document XHTML Choisissez<br />
toutes les réponses qui s’appliquent.<br />
(a) Il s’agit d’un document HTML pouvant s’afficher dans un navigateur.<br />
(b) Il s’agit d’un document XML bien formé.<br />
(c) Il s’agit d’un document XML valable.<br />
6. Combien de paragraphes compte le document XHTML suivant<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 160<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
L’enfant pleure dans la rue. Subitement, le Soleil se lève.<br />
Ah! Que la vie est belle!<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) 1<br />
(b) 2<br />
(c) 3<br />
(d) Aucune de ces réponses<br />
7. Combien de paragraphes compte le document XHTML suivant<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
L’enfant pleure dans la rue.<br />
Subitement, le Soleil se lève.<br />
Ah! Que la vie est belle!<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) 1<br />
(b) 2<br />
(c) 3<br />
(d) Aucune de ces réponses<br />
CC BY-NC-SA
XML sur le web 161<br />
8. Combien de lignes horizontales sont représentées par ce document XHTML<br />
<br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) 1<br />
(b) 2<br />
(c) 3<br />
(d) Aucune de ces réponses<br />
9. Comment représente-t-on une liste numérotée en XHTML<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) <br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
<br />
élément<br />
élément<br />
<br />
<br />
<br />
(b) <br />
<br />
<br />
<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 162<br />
Titre de mon document<br />
<br />
<br />
<br />
élément<br />
élément<br />
<br />
<br />
<br />
(c) <br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
<br />
élément<br />
élément<br />
<br />
<br />
<br />
(d) <br />
<br />
<br />
<br />
Titre de mon document<br />
<br />
<br />
<br />
élément<br />
élément<br />
<br />
<br />
<br />
CC BY-NC-SA
XML sur le web 163<br />
2.4.5 Solutions<br />
1. (a) Non. La balise « p » doit être fermée.<br />
(b) Non. La balise « P » n’existe pas en XHTML : le XML tient compte de la<br />
casse et l’élément « p » n’est pas la même chose que l’élément « P ».<br />
(c) (Bonne réponse) Oui. L’entité contient deux éléments bien formés et le<br />
résultat est du XHTML valable.<br />
(d) Non. Une entité doit être du XML bien formé et si une entité contient des<br />
balises, il doit s’agir d’éléments avec balise ouvrante et balise fermante.<br />
(e) Non, les attributs doivent être entre guillemets comme ceci :<br />
<br />
<br />
<br />
<br />
Un titre<br />
<br />
<br />
<br />
<br />
<br />
2. (a) (Bonne réponse) Effectivement. Du XHTML doit absolument être bien<br />
formé.<br />
(b) Justement pas : on ne tolère pas de telles erreurs en XHTML, car cela rend<br />
la vie plus difficile aux machines et mène à des problèmes de compatibilité<br />
entre les navigateurs.<br />
(c) Non. Le XHTML est très similaire au HTML.<br />
3. (a) (Bonne réponse) Effectivement. On peut facilement transformer le XML<br />
en XHTML et si vous connaissez les outils XML, vous pouvez les utiliser<br />
avec le XHTML.<br />
(b) C’est faux. La plupart des navigateurs supportent bien le XHTML, mais<br />
tous ne supportent pas l’ensemble des normes XML.<br />
(c) (Bonne réponse) Effectivement. Comme le XHTML suit une DTD fixe, il<br />
sera possible dans le futur de bien interpréter les documents XHTML, alors<br />
que le HTML que l’on trouve sur le web est souvent désuet après quelques<br />
mises à jour des navigateurs.<br />
4. (a) (Bonne réponse) C’est sans problème. On peut recopier les parties des DTD<br />
XHTML et les utiliser dans nos propres DTD. Cela peut être utile si un<br />
document XML doit être transformé en XHTML plus tard.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 164<br />
(b) Pas si nous utilisons les DTD officielles. Si nous écrivons vos propres DTD,<br />
il est possible que notre navigateur ne reconnaisse pas le contenu comme<br />
étant du XHTML.<br />
(c) (Bonne réponse) Effectivement. Nous avons vu plus haut que les entités<br />
pouvaient être utilisées pour marquer le titre d’un livre ou le nom d’un<br />
auteur, mais on peut aussi définir des entités pour obtenir des caractères<br />
spéciaux, et ainsi de suite.<br />
5. (a) (Bonne réponse) Oui. D’ailleurs, le texte d’introduction à HTML en est un<br />
exemple.<br />
(b) (Bonne réponse) Effectivement.<br />
(c) (Bonne réponse) Effectivement, avec une déclaration de type de document<br />
utilisant un identifiant public.<br />
6. (a) (Bonne réponse) Oui.<br />
(b) Non.<br />
(c) Non.<br />
(d) Non.<br />
7. (a) Non. Il ne s’agit pas de XHTML valable; la balise est incorrecte.<br />
(b) Ce serait vrai s’il s’agissait de XHTML valable.<br />
(c) Non.<br />
(d) (Bonne réponse) Effectivement. Il ne s’agit pas de XHTML valable, la seconde<br />
balise paragraphe se terminant par . Un logiciel compatible avec<br />
XHTML comme Firefoxpeut très bien ne rien afficher à l’écran.<br />
8. (a) Non.<br />
(b) (Bonne réponse) Oui.<br />
(c) Non.<br />
(d) Non.<br />
9. (a) Non. Ce n’est pas du XHTML valable.<br />
(b) Non, ce n’est pas du XHTML valable.<br />
(c) (Bonne réponse) Oui.<br />
(d) Non. C’est bien du XHTML valable, mais la liste n’est pas numérotée.<br />
2.5 Travail noté 2<br />
2.5.1 Objectifs et pondération<br />
Ce travail compte pour 5 % de la note globale du cours.<br />
Il contribue à l’évaluation de l’objectif suivant :<br />
CC BY-NC-SA
Travail noté 2 165<br />
– Traduire, au sein de son organisation, sa compréhension du XML dans la gestion des<br />
informations.<br />
Ce travail consiste à discuter d’un sujet avec les autres étudiants du cours et à réunir<br />
vos textes dans un compte rendu.<br />
2.5.2 Consignes<br />
Avant d’entreprendre ce travail noté, il est recommandé d’avoir terminé les activités<br />
d’autoévaluation du module 1 et d’avoir commencé l’étude du module 2. Vous avez<br />
jusqu’à la fin du cours pour réaliser ce travail.<br />
Vous devez contribuer au forum de façon originale et substantielle.<br />
1. Choisissez un sujet qui vous intéresse; quelques pistes de discussion vous sont<br />
suggérées plus loin.<br />
2. Effectuez des recherches sur le web, prenez des notes.<br />
3. Inscrivez-vous sur Facebook si ce n’est pas déjà fait (http://fr-fr.facebook.com/).<br />
Facebook est un site de réseautage social. L’inscription sur Facebook est gratuite<br />
et elle ne prend que quelques minutes. Par contre, n’allez pas demander de l’aide<br />
aux services de l’Université pour vous brancher à Facebook : demandez plutôt à<br />
votre tuteur de vous aider.<br />
4. Accédez au groupe du cours « <strong>INF</strong> <strong>6450</strong> » à l’adresse http://www.facebook.com/<br />
group.phpgid=57220667716. Vous trouverez au sein de la page du groupe un<br />
forum de discussion.<br />
5. Rédigez votre intervention de façon claire et précise afin d’inciter les lecteurs à<br />
vous lire et à commenter; prenez soin de préciser vos références.<br />
6. Lisez les messages de vos collègues et échangez. Répondez à vos interlocuteurs<br />
et réagissez à leur contribution.<br />
7. Quand vous jugerez votre participation suffisante, que aurez terminé votre discussion,<br />
réunissez les textes que vous avez produits.<br />
8. Rédigez un compte rendu de votre participation (Word 97/2000/XP, ODF, PDF,<br />
RTF ou au format texte) qui doit contenir une copie des textes que vous avez<br />
produits dans le forum ou blogue.<br />
9. Transmettez à votre personne tutrice, par courriel, votre compte rendu clairement<br />
identifié à votre nom, en le joignant au message en fichier attaché. L’objet<br />
de votre courriel doit commencer par « [<strong>INF</strong><strong>6450</strong>][TRAVAIL2] »; dans le<br />
message, indiquez votre nom, votre numéro d’étudiant (8 chiffres), la date<br />
de remise de votre travail et le nom de votre personne tutrice, ainsi que les<br />
mentions « Travail noté 2 » et « <strong>INF</strong> <strong>6450</strong> ». Ne transmettez pas plusieurs<br />
fichiers. Ne transmettez pas une archive compressée (zip ou autre).<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 166<br />
En cas de panne<br />
Il peut arriver que vous ne puissiez vous brancher au groupe Facebook du cours. En<br />
effet, Facebook peut tomber en panne, vous refuser l’accès ou même cessez d’exister.<br />
Comme alternative, vous pouvez aussi commenter sur le blogue du cours.<br />
Pistes de discussion<br />
Bien que votre contribution doive être originale et que nous vous invitions fortement<br />
à faire une recherche préalable sur le web pour nourrir vos discussions, vous pouvez<br />
utiliser les pistes suivantes :<br />
– Le blogue du cours à http://www.daniel-lemire.com/blogue/category/xml/ est régulièrement<br />
mis à jour.<br />
– Le Security Assertion Markup Language (SAML) doit permettre d’identifier et d’autoriser<br />
les utilisateurs sur plusieurs sites en ne leur demandant qu’une seule fois leur<br />
mot de passe.<br />
– La langage RuleML permet d’écrire des règles formelles en XML et de les échanger<br />
entre divers sites.<br />
– Les versions récentes de Microsoft Office utilisent de façon agressive le XML<br />
comme format de documents. On trouve sur le web plusieurs articles traitant de cette<br />
question, dont un article sur les conséquences de l’utilisation de XML par Microsoft<br />
pour les logiciels antivirus et un article sur les conséquences légales des choix faits<br />
par Microsoft.<br />
– Le clone gratuit de Microsoft Office, OpenOffice (voir openoffice.org) utilise lui<br />
aussi un format XML pour ses documents. De plus, il est possible de trouver sur<br />
le web plusieurs articles portant sur l’utilisation du XML faite par OpenOffice.<br />
– Le jeu vidéo très populaire World of Warcraft offre un outil à base de XML permettant<br />
de modifier l’interface du jeu.<br />
– Le W3C a récemment publié les spécifications de VoiceXML 2.0 avec une annonce<br />
en français; de plus, le magazine Silicon a publié un article sur le sujet. En principe,<br />
VoiceXML devrait permettre de créer des systèmes contrôlés par la parole : par<br />
exemple, un outil de gestion de l’inventaire par téléphone qui permettrait de demander<br />
un rapport des stocks à partir d’un numéro de série.<br />
– On a appris récemment que le gouvernement américain rend disponibles les données<br />
météorologiques au format XML.<br />
2.5.3 Critères de correction et de notation<br />
L’évaluation porte sur l’originalité de votre propos, sur l’ampleur de la recherche sousjacente<br />
à votre discussion et sur la qualité des textes que vous proposez.<br />
– Originalité : Est-ce que votre contribution diffère de ce qu’on trouve déjà dans le<br />
forum ou sur le blogue (30 %)<br />
CC BY-NC-SA
Travail noté 3 167<br />
– Contenu et recherche : Est-ce que votre contribution démontre une recherche substantielle<br />
sur le sujet Est-ce que vous avez donné 3 ou 4 références (comme des<br />
URL) pertinentes et originales (60 %)<br />
– Présentation : Est-ce que votre contribution est faite de textes lisibles, clairs, cohérents,<br />
écrits dans un français correct (10 %)<br />
2.6 Travail noté 3<br />
2.6.1 Objectifs, pondération et critères de correction<br />
Ce travail compte pour 10 % de la note globale du cours.<br />
Il contribue à l’évaluation des objectifs suivants :<br />
– Utiliser un « vocabulaire » ou une application XML pour présenter des informations<br />
en format XML.<br />
– Déterminer si un document XML est bien formé ou valable.<br />
– Traduire, au sein de son organisation, sa compréhension du XML dans la gestion des<br />
informations.<br />
Votre travail sera noté en utilisant les critères suivants :<br />
– votre capacité à créer un document DocBook valable et bien formé (30 %),<br />
– votre utilisation des balises requises (15 %),<br />
– l’utilisation d’une instruction spéciale (XSLT) (5 %)<br />
– production d’un document XHTML valable selon les consignes (20 %).<br />
– le contenu de votre texte (clarté, cohérence, qualité du français) (30 %).<br />
Il est recommandé d’avoir terminé les activités d’autoévaluation des modules 1 et 2<br />
avant d’entreprendre ce travail noté. Pour réaliser ce travail, vous devez utiliser la technologie<br />
XSLT (sans nécessairement la maîtriser); vous pouvez également commencer<br />
les autres modules avant de le terminer si vous jugez que votre connaissance du XML<br />
n’est pas encore suffisante. Vous avez jusqu’à la fin du cours pour réaliser ce travail.<br />
2.6.2 Description du travail<br />
En respectant les consignes spécifiques qui suivent, vous rédigerez un texte qui répondra<br />
à la question suivante : « Pourquoi est-ce que je devrais utiliser XML dans mon<br />
projet ». Vous fournirez au minimum 6 bonnes raisons justifiant l’utilisation de XML<br />
au sein d’un projet stratégique.<br />
Votre texte, que vous nommerez « <strong>INF</strong><strong>6450</strong>travail3_votrenom.xml », sera un document<br />
DocBook d’au moins 2000 mots (environ 130 lignes), comptant au moins deux<br />
« chapitres » (éléments « chapter »), chacun comptant au minimum 2 sections.<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 168<br />
En outre, vous devez produire un document XHTML valable qui résume<br />
brièvement vos 6 arguments. Le document XHTML doit être nommé<br />
« <strong>INF</strong><strong>6450</strong>travail3_votrenom.xhtml » et doit être du XHTML valable. Votre document<br />
doit utiliser au moins un élément « acronym », un élément « samp », et un<br />
élément « blockquote ».<br />
Transmettez les deux documents à votre tuteur par courriel en tant que fichiers attachés.<br />
L’objet de votre courriel doit commencer par « [<strong>INF</strong><strong>6450</strong>][TRAVAIL3] »; dans<br />
le message, indiquez votre nom, votre numéro d’étudiant (8 chiffres), la date de<br />
remise de votre travail et le nom de votre personne tutrice, ainsi que les mentions<br />
« Travail noté 3 » et « <strong>INF</strong> <strong>6450</strong> ». Ne transmettez pas une archive compressée (zip<br />
ou autre).<br />
Ce travail de rédaction est personnel et votre texte doit être original.<br />
Rappelons que lorsqu’on vous donne le contenu d’un document XML, vous devez<br />
supposer que le document débute avec le premier caractère et se termine avec le dernier.<br />
2.6.3 Consignes<br />
1. Un document DocBook débute normalement par la définition de type de document<br />
(DTD) :<br />
<br />
Cependant, il suffit de visiter l’URL<br />
http://www.oasis-open.org/docbook/xml/4.4CR2/docbookx.dtd<br />
pour se rendre compte que le document DTD de DocBook n’est pas trivial : il<br />
comporte un grand nombre d’éléments dont nous n’avons pas besoin. En particulier,<br />
DocBook a plusieurs balises pour la description du code source informatique.<br />
Utilisez donc un document DTD nommé « simpledocbook.dtd », une version<br />
grandement simplifiée de DocBook et ayant le contenu suivant :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Travail noté 3 169<br />
<br />
<br />
<br />
<br />
<br />
<br />
2. Placez ce document DTD dans le même répertoire que votre document<br />
XML.<br />
3. Rédigez le texte de votre document DocBook en utilisant au moins une fois<br />
tous les éléments de cette DTD, y compris « programlisting » et « listitem ».<br />
Votre déclaration de type de document doit être :<br />
<br />
Même si, à strictement parler, un élément « programlisting » doit contenir le<br />
texte d’un programme, aux fins de ce travail noté, vous pouvez utiliser du XML<br />
dans cet élément.<br />
Note. Votre document ne sera pas un véritable document DocBook, car il n’aura<br />
pas une déclaration normale de type de document. Cependant, il vous serait possible<br />
de remplacer la déclaration de type de document par une déclaration normale<br />
et vous auriez alors un véritable document DocBook.<br />
4. Un document DocBook ne contient pas les informations de formatage et, en<br />
général, n’est pas très lisible. Pour permettre une lecture plus aisée du document,<br />
utilisez le document XSLT qui se trouve à l’annexe 1, plus loin. Copiez le<br />
document en question et enregistrez-le sous le nom « docbook.xml », dans le<br />
même répertoire que votre document XML. Le XSLT permet de transformer<br />
le document DocBook en HTML. On ne vous demande pas de comprendre le<br />
XSLT, car le sujet sera étudié dans le prochain module.<br />
5. Pour l’instant, ajoutez simplement l’instruction suivante dans votre document<br />
XML, immédiatement après la déclaration XML<br />
<br />
6. Ensuite, une fois votre document XML terminé, ouvrez-le dans Firefox; vous<br />
devriez voir votre document nouvellement formaté. Assurez-vous que le document<br />
« docbook.xml » de l’annexe 1 est bien dans le même répertoire que votre<br />
document DocBook.<br />
Constatez alors comment votre document XML est présenté de façon totalement<br />
différente de son allure originale. C’est un résultat de la division entre le contenu<br />
et sa présentation : le fichier XSLT s’occupe ici de la présentation, alors que<br />
votre texte XML ne comporte que le contenu. Par exemple, la version formatée<br />
dispose d’une table des matières qui se génère automatiquement, alors que le<br />
document XML n’a aucune notion de table des matières.<br />
7. La production du document XHTML se fait de manière similaire, mais sans<br />
l’utilisation d’un document XSLT. Pour tester la validité de votre document,<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 170<br />
vous pouvez utiliser l’outil de validation du W3C disponible à l’adresse<br />
« http://validator.w3.org/ » (voir « Validate by File Upload »).<br />
8. Transmettez à votre personne tutrice, par courriel, vos documents XML clairement<br />
identifiés à votre nom, en les joignant au message. Vous devez transmettre<br />
deux documents XML : un document DocBook et son résumé en XHTML. Dans<br />
la zone « Objet », inscrivez le sigle du cours et le numéro du travail (<strong>INF</strong> <strong>6450</strong> -<br />
Travail noté 3) dans le message, indiquez votre nom, votre numéro d’étudiant (8<br />
chiffres), la date de remise de votre travail et le nom de votre personne tutrice,<br />
ainsi que les mentions « <strong>INF</strong> <strong>6450</strong> » et « Travail noté 3 ».<br />
Annexe 1. Document XSLT<br />
Le document XSLT suivant servira à convertir votre document DocBook en HTML.<br />
C’est là un avantage du format DocBook : on peut facilement le convertir en d’autres<br />
formats. Nous étudierons le XSLT dans le troisième module.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
© <br />
Table des matières<br />
<br />
<br />
<br />
<br />
<br />
<br />
par <br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
CC BY-NC-SA
Travail noté 3 171<br />
<br />
<br />
<br />
<br />
.<br />
<br />
<br />
<br />
<br />
Chapitre<br />
. <br />
<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 2 : XML en tant que syntaxe pour les documents 172<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML<br />
3.1 Aperçu<br />
3.1.1 Objectifs<br />
Nous avons vu que le XML permet de stocker et d’échanger des informations et que<br />
certaines formes de XML, comme le XHTML, s’affichent de façon lisible dans un navigateur.<br />
Cependant, dans une organisation, il faut souvent pouvoir afficher de façon<br />
lisible du XML qui n’est pas nécessairement compris par un navigateur. Dans ce module,<br />
nous présentons deux technologies importantes qui solutionnent cette situation :<br />
XSLT et CSS. Nous verrons aussi que le XSLT permet de transformer automatiquement<br />
le XML en d’autres formats, ce qui peut être très utile.<br />
L’objectif spécifique du module est :<br />
– Interpréter des fichiers XML utilisant des espaces de noms, des transformations<br />
XSLT ou des instructions CSS.<br />
Une activité, le travail noté 4, nous permettra d’évaluer votre atteinte de cet objectif.<br />
3.1.2 Démarche<br />
Il n’est pas nécessaire de terminer l’étude de ce module avant de passer aux autres<br />
modules du cours.<br />
Nous vous invitons à procéder à l’étude de ce module dans l’ordre suivant :<br />
– XSLT, XPath, XQuery, XPointer et XLink<br />
– CSS<br />
Lisez les textes et vérifiez vos connaissances en répondant aux deux questionnaires<br />
d’autoévaluation; réalisez ensuite le travail noté 4 qui prend la forme d’un questionnaire<br />
portant sur XSLT et CSS.<br />
173
Module 3 : Technologies XML 174<br />
Le pense-bête pour le XSLT, en annexe dans la version imprimée du cours, rassemble<br />
les principaux éléments du XSLT et précise leur fonction.<br />
3.2 XSLT<br />
3.2.1 Objectif<br />
Comprendre le XSLT comme application XML pour transformer les documents, grâce<br />
aux feuilles de style.<br />
3.2.2 Activité<br />
Lisez le texte qui suit, puis répondez au questionnaire d’autoévaluation. Ce texte porte<br />
sur le langage XSL (Extensible Stylesheet Language), mais en particulier sur les XSL<br />
Transformations (XSLT). On traitera également des chemins XPath et de XQuery.<br />
3.2.3 Un regard critique<br />
Le XML n’est pas un langage de programmation. Néanmoins, on peut utiliser le XML<br />
pour définir un langage comme le XSL. Est-ce que c’est une bonne idée Plusieurs<br />
auteurs, dont Alan Holub, croient que le XML est une syntaxe trop lourde pour la<br />
programmation.<br />
XML is perhaps the worst programming language ever conceived. I’m<br />
not talking about XML as a data-description language, which was its original<br />
design. I’m talking about perverting XML for programming applications.<br />
It’s inappropriate to use XML as a scripting language (...). These<br />
sorts of XML "programs" are unreadable, unmaintainable, an order of magnitude<br />
larger than necessary, and audaciously inefficient at runtime. (Alan<br />
Holub, Software Development Times, September 2006)<br />
Personnellement, je trouve que le XSLT est amusant et utile. Il est utilisé par des millions<br />
de sites web et on ne peut prétendre être un expert en XML sans une bonne<br />
maîtrise du XSLT.<br />
3.2.4 Les machines de Turing et la technologie XML<br />
Une machine de Turing est un modèle abstrait qui sert à représenter les ordinateurs.<br />
La thèse de Church-Turing affirme que tout traitement d’information peut être accompli<br />
par une machine de Turing. On accepte généralement cette hypothèse comme étant<br />
CC BY-NC-SA
XSLT 175<br />
vraie en informatique. Un langage de programmation est Turing-<strong>complet</strong> s’il peut effectuer<br />
tous les calculs qu’une machine de Turing peut faire. Le Java, le XSLT et<br />
XQuery sont des langages qui sont Turing-<strong>complet</strong>. Tous les langages informatiques<br />
ne sont pas Turing-<strong>complet</strong> : CSS ne l’est pas.<br />
3.2.5 Qu’est-ce que le XSLT<br />
La première version du langage XSLT (Extensible Stylesheet Language Transformation)<br />
a été publiée en 1997 et elle est devenue une recommandation W3C en 1999. Elle<br />
fait partie du XSL (Extensible Stylesheet Language) qui comprend une seconde composante,<br />
les XSL-FO (Extensible Stylesheet Language Formatting Objects). La technologie<br />
XSL tire son origine du besoin d’un langage simple, mais suffisamment puissant<br />
pour pouvoir contrôler finement l’affichage du XML. On utilise beaucoup le XSLT sur<br />
le web et au sein des systèmes d’information, alors que le XSL-FO est davantage utile<br />
pour les applications de mise en page spécialisées. Dans ce cours, nous nous soucierons<br />
seulement du XSLT, dont l’utilité dépasse de loin les problèmes de présentation.<br />
L’objectif poursuivi par le XSLT est de transformer les documents XML en d’autres<br />
documents. Par exemple, supposons que vous ayez le document suivant :<br />
<br />
<br />
10.10<br />
Jean Rochond<br />
Achat d’ordinateur<br />
<br />
et que vous vouliez transformer ce type de document XML en document HTML qui<br />
aurait la forme suivante :<br />
<br />
<br />
Facture de Jean Rochond<br />
<br />
Ceci est une facture pour Jean Rochond de 10.10$<br />
pour: Achat d’ordinateur.<br />
<br />
Si votre entreprise utilise du XML et que vous désirez envoyer des factures par courriel,<br />
vous pourriez envoyer le document HTML au lieu du document XML. De cette<br />
manière, le client pourrait consulter sa facture sans avoir à comprendre le XML.<br />
On pourrait bien sûr écrire un programme en Java qui effectuerait cette opération, mais<br />
la conception d’un programme Java prend du temps et on cherche parfois une solution<br />
plus économique, plus rapide. Avec l’exemple que nous venons de voir, on pourrait<br />
CC BY-NC-SA
Module 3 : Technologies XML 176<br />
automatiser la transformation de XML en HTML en moins d’une quinzaine de minutes.<br />
Pour obtenir le résultat désiré, il faut utiliser un petit fichier XSLT.<br />
3.2.6 Les langages déclaratifs<br />
Un langage comme Java est orienté objet et procédural. Ce n’est pas, par contre, un<br />
langage déclaratif et on dit donc qu’il est impératif. Les langages déclaratifs sont des<br />
langages qui définissent le problème au lieu d’en définir la solution. On les reconnaît<br />
souvent parce qu’ils énoncent des règles au lieu d’énoncer des procédures.<br />
Le langage Prolog est un exemple de langage déclaratif parce que le programmeur<br />
ne fait que saisir des relations sans définir comment l’ordinateur doit combiner ses<br />
relations:<br />
pere(X,Y) :- parent(X,Y),homme(X).<br />
freresoeur(X,Y) :- parent(Z,X), parent(Z,Y).<br />
Le SQL est aussi déclaratif parce qu’on spécifie à l’ordinateur quelles informations on<br />
veut sans pour autant spécifier comment l’information doit être trouvée:<br />
SELECT age FROM table WHERE age > 25;<br />
Le XSLT et XQuery sont des exemples plus récents de langages déclaratifs. On affirme<br />
souvent que les langages déclaratifs sont plus lents que les langages impératifs<br />
parce que le logiciel doit lui-même trouver la meilleure stratégie pour évaluer le programme<br />
sans recevoir beaucoup d’indices de la part de l’humain. Le contraire peut<br />
aussi être vrai: comme le logiciel peut optimiser à sa guise l’exécution du programme<br />
étant donné l’absence de structure imposée par l’humain, il est possible pour un langage<br />
déclaratif de surpasser en vitesse un langage impératif. En pratique, personne ne<br />
se plaint vraiment de la lenteur relative du XSLT, de SQL ou de Prolog. Cependant,<br />
pour le programmeur habitué à la programmation impérative, la programmation déclarative<br />
peut être source de confusion. Avec l’expérience, on se rend compte que, pour<br />
bien des problèmes, la programmation déclarative est préférable surtout lorsqu’on ne<br />
veut pas se soucier des détails techniques comme la façon dont le fichier XML est lu et<br />
comment il est stocké en mémoire.<br />
Le XSLT (et XQuery) peut aussi être considéré comme un langage fonctionnel (voir<br />
FXSL ou The Functional Programming Language XSLT - A proof through examples<br />
par Dimitre Navatchev) au même titre que APL, Lisp, Haskell, Maple, Mathematica,<br />
Ocaml ou Scheme.<br />
3.2.7 Les fichiers XSLT<br />
Le fichier XSLT contient des règles qu’un « processeur XSLT » applique aux fichiers<br />
XML pour les transformer. Heureusement, si vous utilisez Firefox, vous avez déjà un<br />
CC BY-NC-SA
XSLT 177<br />
processeur XSLT moderne à même votre navigateur. Lors de l’ouverture d’un document<br />
XML, Firefox tente automatiquement de trouver et d’exécuter un document XSLT<br />
pour transformer le document XML.<br />
Un processeur XSLT va parcourir tous les éléments de votre document en commençant<br />
par l’élément-racine et, à chaque fois, il va tenter d’appliquer une règle.<br />
Commençons par créer le fichier XSLT suivant qu’on enregistrera sur le disque comme<br />
étant « xslt.xml » :<br />
<br />
<br />
<br />
Ce fichier ne contient aucune « règle » et constitue le document XSLT de base. Nous<br />
vous suggérons de faire l’exercice de création de ce document avec Bloc-notes, par<br />
exemple.<br />
Un fichier XSLT est un document XML bien formé, utilisant l’espace de noms<br />
« http://www.w3.org/1999/XSL/Transform » et ayant pour élément-racine stylesheet<br />
(ou transform), lequel a lui-même un attribut « version ». On ne discute ici que de<br />
la première version de XSLT (1.0); on utilise donc 1.0 comme valeur d’attribut pour<br />
version.<br />
Prenons maintenant le fichier XML que nous avions auparavant; modifions-le un peu<br />
en le faisant pointer vers le fichier XSLT nouvellement créé :<br />
<br />
<br />
<br />
10.10<br />
Jean Rochond<br />
Achat d’ordinateur<br />
<br />
On ajoute donc la ligne : « ». Cette ligne indique au navigateur, ou à un autre logiciel,<br />
que le document XML peut être transformé par le fichier XSLT nommé<br />
« xslt.xml ». Le chemin peut être relatif ou absolu : on pourrait donc aussi avoir une<br />
ligne comme :<br />
«»<br />
si l’URL « http://www.mondomaine.com/xslt.xml » pointe vers un fichier XSLT.<br />
CC BY-NC-SA
Module 3 : Technologies XML 178<br />
Il suffit d’enregistrer ce nouveau document XML dans le même répertoire que le fichier<br />
« xslt.xml », disons avec le nom « test.xml », puis d’ouvrir le fichier « test.xml » dans<br />
Firefox. Normalement, on ne devrait rien voir à l’écran (une page vide), car le document<br />
XSLT utilisé est vide de toute instruction et le résultat ne sera pas du HTML.<br />
Le résultat peut cependant varier selon le navigateur utilisé, car votre navigateur pourrait<br />
afficher le texte, même s’il ne s’agit pas de HTML : dans ce cas, vous ne verriez<br />
que le texte contenu dans le document XML, les balises en moins. Vous pouvez tester<br />
vos scripts XSLT en ligne directement sur la page web http://www.daniel-lemire.com/<br />
blogue/xsltprocessor.html. Avec ce dernier outil, écrit en ECMAScript, il n’est pas nécessaire<br />
d’avoir une instruction xml-stylesheet : on peut traiter n’importe quel fichier<br />
XML avec n’importe quelle transformation XSLT. En ce sens, on peut programmer en<br />
XSLT sans jamais utiliser l’instruction xml-stylesheet.<br />
3.2.8 « Éléments xsl:template »<br />
Modifions maintenant le fichier « xslt.xml » de façon à rendre l’expérience plus intéressante.<br />
Tout d’abord, traitons tous les éléments « facture » du document XML. Pour<br />
obtenir le résultat, il faut placer un élément « » dans<br />
l’élément-racine du document XSLT comme ceci :<br />
<br />
<br />
<br />
On doit mettre quelque chose ici!!!<br />
<br />
<br />
Il faut voir l’élément « xsl:template » comme une règle qui dit : à chaque fois qu’on<br />
rencontre un élément qui s’appelle « facture », faisons ceci. Le modèle est inclus dans<br />
l’élément « xsl:template ». Dans l’exemple de document XSLT que nous venons de<br />
voir, le processeur XSLT remplacerait tous les éléments « facture » qu’il rencontre par<br />
le texte « On doit mettre quelque chose ici!!! », ce qui donnerait comme résultat le<br />
fichier suivant (le résultat exact peut varier un peu selon le processeur XSLT) :<br />
<br />
On doit mettre quelque chose ici!!!<br />
Malheureusement, ce n’est pas du HTML valable et Firefox devrait n’afficher qu’un<br />
écran vide si vous tentez d’ouvrir le fichier « test.xml » avec un lien vers un tel fichier<br />
XSLT. Nous allons donc modifier le fichier XSLT, en ajoutant des balises, comme<br />
ceci :<br />
<br />
XSLT 179<br />
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><br />
<br />
On doit mettre quelque chose ici!!!<br />
<br />
<br />
Cette fois, si vous ouvrez le document « test.xml », vous devriez voir le texte « On doit<br />
mettre quelque chose ici!!! » s’afficher dans votre navigateur. Faites l’expérience.<br />
Dans les exemples que nous allons proposer, nous omettons les éléments « html » et<br />
« body » par souci de simplicité. La présence de ces éléments n’est pas nécessaire et<br />
n’est utile que pour afficher le résultat dans un navigateur. À vous de les ajouter si vous<br />
désirez afficher le résultat.<br />
Pour résumer, chaque fois que le processeur XSLT rencontre un élément « facture<br />
», il applique le modèle qui se trouve dans l’élément « ». Notez que si l’élément « facture » contient lui-même des éléments,<br />
ils ne sont pas automatiquement visités par le processeur XSLT. Ce dernier<br />
considère que dès qu’un modèle est appliqué à un élément, il peut alors parcourir le<br />
reste du document sans se soucier du contenu de cet élément qui est maintenant « couvert<br />
».<br />
3.2.9 « Éléments xsl:value-of »<br />
Jusqu’à présent, le résultat n’est pas très fascinant parce que les éléments<br />
« xsl:template » ont été utilisés comme des outils pour faire du « Rechercher/Remplacer<br />
». Le contenu de l’élément « facture » n’est pas traité, on le remplace<br />
bêtement par autre chose.<br />
Nous pouvons traiter le contenu d’un élément à l’aide d’un élément « xsl:value-of »<br />
avec la syntaxe . La valeur de l’élément « select » est un<br />
chemin (appelé expression XPath) : les chemins les plus simples sont constitués du<br />
nom d’un sous-élément. Par exemple, si le processeur traite un élément « facture »<br />
qui contient un élément « montant », alors l’élément nous donne le contenu de l’élément « montant ». C’est ainsi que nous pouvons<br />
trouver le nom de la personne devant recevoir une facture, en utilisant .<br />
Voyons maintenant un exemple plus complexe de fichier XSLT :<br />
<br />
<br />
<br />
<br />
<br />
Facture de <br />
CC BY-NC-SA
Module 3 : Technologies XML 180<br />
<br />
<br />
Ceci est une facture pour <br />
de $ pour:<br />
.<br />
<br />
<br />
<br />
<br />
Si vous modifiez le fichier « xslt.xml » et que vous ouvrez le fichier « test.xml » dans un<br />
navigateur supportant le XSLT (comme Firefox), vous devriez voir s’afficher à l’écran<br />
la ligne « Ceci est une facture pour Jean Rochond de 10.10$ pour: Achat d’ordinateur.<br />
». Il faut avouer que c’est déjà beaucoup plus intéressant comme application!<br />
Ce qui se passe, c’est que le nouveau document XSLT transforme notre document XML<br />
en un document HTML :<br />
<br />
<br />
<br />
Facture de Jean Rochond<br />
<br />
Ceci est une facture pour Jean Rochond<br />
de 10.10$ pour: Achat d’ordinateur.<br />
<br />
Pour résumer, nous pouvons aller chercher le contenu textuel d’une expression<br />
XPath avec une instruction comme « » où « ... » est<br />
une expression XPath comme le nom de l’élément.<br />
3.2.10 Arithmétique en XPath<br />
Nous pouvons aussi nous servir des expressions XPath pour faire du calcul simple. Par<br />
exemple, les trois expressions suivantes donneront 2, 2 et 2.5 respectivement :<br />
<br />
<br />
<br />
Il arrive qu’on doive calculer une somme de nombres. Par exemple, supposons qu’un<br />
facture comporte une liste de montants.<br />
<br />
XSLT 181<br />
type="application/xml"><br />
<br />
10.10<br />
20.10<br />
40.10<br />
<br />
La fonction XPath « sum » nous permet de calculer la somme des montants sans effort<br />
comme dans cet exemple :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Comme en Java, on a aussi les fonctions « floor », « ceiling », « mod » et « round ».<br />
On peut aussi utiliser les paranthèses dans toutes expressions XPath : « (5 + 2) div 2 ».<br />
3.2.11 Manipulations des chaînes de caractères en XPath<br />
Outre les fonctions arithmétiques, on peut aussi manipuler les chaînes de caractères en<br />
XPath. La fonction la plus simple est « string-length ». Elle calcule la longueur d’une<br />
chaîne. Une autre fonction simple est « normalize-space » qui élimine tous les espaces<br />
au début et à la fin d’une chaîne en plus de remplacer les espaces répétés par un espace<br />
simple. La fonction « translate » permet de remplacer des caractères. Par exemple, pour<br />
remplacer les é par des e et les à par des a, on pourrait utiliser l’instruction suivante<br />
« translate("à la vérité","éà","ea") » qui renvoie « a la verite ».<br />
On peut extraire des sous-chaînes de caractères de diverses manières : la fonction « substring<br />
» permet d’extraire une sous-chaîne lorsqu’on en connaît sa position et sa longueur,<br />
la fonction « substring-after » permet d’aller chercher un suffixe, la fonction<br />
« substring-before » permet d’aller chercher un préfixe. Par exemple, « substring("la<br />
vie est belle",3,7) » renvoie « vie est », « substring-after("la vie est belle","est") » renvoie<br />
« belle » alors que « substring-before("la vie est belle","est") » renvoie « la vie »<br />
On peut aussi additionner deux chaînes de caractères pour en faire une seule avec la<br />
fonction « concat ». L’expression « concat("a","b") » a comme valeur "ab".<br />
CC BY-NC-SA
Module 3 : Technologies XML 182<br />
On peut tester une chaîne pour la présence d’une sous-chaîne avec la fonction XPath<br />
« contains ». L’expression « contains("abc","bc") » est vraie parce que "bc" est une<br />
sous-chaîne de "abc", alors que l’expression « contains("abc","bz") » est fausse.<br />
3.2.12 Chemins XPath plus sophistiqués<br />
Supposons maintenant que nous devions traiter un document XML un peu plus complexe,<br />
comme celui qui suit :<br />
<br />
<br />
<br />
10.10<br />
<br />
M<br />
Rochond<br />
Jean<br />
<br />
Achat d’ordinateur<br />
<br />
Observez que l’élément « personne » contient maintenant trois sous-éléments : sexe,<br />
nom et prenom. Quand on demande au XSLT d’inclure le contenu d’un élément, à<br />
l’aide d’une instruction « xsl:value-of », il retire d’abord toutes les balises. Il garde<br />
les espaces entre les éléments, le texte, et les retours de chariot; seules les balises sont<br />
retirées. En somme, le résultat de l’instruction « xsl:value-of » appliqué à un élément<br />
est son contenu textuel. Précisons que dans le cas où on sélectionne non pas un élément,<br />
mais plusieurs, l’instruction value-of ne s’applique qu’au premier élément rencontré.<br />
Ainsi, si nous utilisions le fichier XSLT précédent destiné à des éléments « personne »<br />
ne contenant que du texte, nous obtiendrions à l’écran, dans Firefox, le texte « Ceci est<br />
une facture pour M Rochond Jean de 10.10$ pour: Achat d’ordinateur. ». Pourquoi ce<br />
résultat Parce qu’à l’endroit où se trouve s’insère<br />
le contenu de l’élément, sans le balisage, ce qui fait que seul le contenu des souséléments,<br />
dans l’ordre, est affiché.<br />
De façon concrète, le fichier XML est transformé en contenu HTML :<br />
<br />
<br />
<br />
Facture de<br />
M<br />
Rochond<br />
Jean<br />
<br />
CC BY-NC-SA
XSLT 183<br />
<br />
Ceci est une facture pour<br />
M<br />
Rochond<br />
Jean<br />
de 10.10$ pour: Achat d’ordinateur.<br />
<br />
Par ailleurs, nous pouvons modifier le fichier XSLT pour aller chercher le contenu<br />
respectif des sous-éléments « prenom » et « nom ». Pour ce faire, il suffit de remplacer<br />
« select="personne" » par « select="personne/prenom" » et « select="personne/nom" »,<br />
car la valeur de l’attribut « select » se comporte un peu comme dans les adresses web :<br />
le symbole « / » entre deux noms d’élément signifie « sous-élément ». Nous pourrons<br />
alors utiliser le fichier XSLT suivant :<br />
<br />
<br />
<br />
<br />
<br />
Facture de <br />
<br />
<br />
Ceci est une facture pour <br />
de $<br />
pour: .<br />
<br />
<br />
<br />
<br />
Si nous testons ce nouveau fichier XSLT dans Firefox, nous constaterons que le résultat<br />
est presque correct : cette fois-ci, le fichier « test.xml » s’affiche comme « Ceci est une<br />
facture pour JeanRochond de 10.10$ pour: Achat d’ordinateur. ».<br />
Notez qu’il manque un espace entre Jean et Rochond. Cela se produit parce que dans<br />
un document XSLT, on ignore les espaces entre les éléments (dans le cas où il n’y a<br />
que des espaces entre les deux éléments) : pour obtenir un espace, il faut en marquer la<br />
présence en insérant un élément « xsl:text » comme ceci :<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 184<br />
<br />
Facture de <br />
<br />
<br />
Ceci est une facture pour <br />
<br />
<br />
de $ pour:<br />
.<br />
<br />
<br />
<br />
<br />
En effet, alors que les espaces entre les éléments sont ignorés, l’espace dans un élément<br />
« xsl:text » sera pris en compte. Attention à la confusion : les espaces entre les éléments<br />
sont ignorés dans le fichier XSLT, mais pas dans le fichier XML qui est traité!<br />
Nous constatons que les chemins XPath peuvent contenir non seulement le nom d’un<br />
élément, mais aussi le nom d’un sous-élément, comme « personne/prenom ». Cela peut<br />
nous permettre de construire des modèles complexes qui peuvent aller extraire des<br />
valeurs contenues dans des sous-éléments.<br />
3.2.13 Modularité avec les éléments « xsl:apply-templates »<br />
Notre fichier « xslt.xml » se complexifie et devient plus difficile à comprendre. Tout est<br />
dans un seul modèle, le modèle facture. Pour simuler un problème probable, imaginons<br />
que notre XML est plus complexe et prend la forme :<br />
<br />
<br />
<br />
10.10<br />
<br />
<br />
M<br />
Rochond<br />
Jean<br />
<br />
<br />
<br />
<br />
F<br />
Ladouce<br />
Jeanne<br />
CC BY-NC-SA
XSLT 185<br />
<br />
<br />
Achat d’ordinateur<br />
<br />
Dans ce nouveau document XML, se trouvent deux éléments « personne ». Il serait<br />
bête, dans le document XSLT, de répéter le travail chaque fois qu’on veut afficher un<br />
élément « personne ». Regardons ce que cela pourrait donner en pratique :<br />
<br />
<br />
<br />
<br />
<br />
Facture de <br />
<br />
<br />
Ceci est une facture pour<br />
<br />
<br />
<br />
de $ pour:<br />
.<br />
Votre commerçant:<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Observez comment on répète le texte suivant à deux reprises :<br />
<br />
<br />
<br />
Voici une autre solution, plus élégante, qui donne le même résultat :<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 186<br />
<br />
<br />
<br />
Facture de <br />
<br />
<br />
Ceci est une facture pour<br />
<br />
de $ pour:<br />
.<br />
Votre commerçant: <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Quelques éléments « xsl:value-of » ont été remplacés par des éléments « xsl:applytemplates<br />
». Un élément « xsl:apply-templates » prend le contenu et, au lieu d’insérer<br />
le contenu textuel comme le fait « xsl:value-of » à l’endroit prévu, il insère plutôt le<br />
résultat obtenu par l’application de modèles (éléments « xsl:template »). Ainsi, dans<br />
l’exemple que nous venons de voir, chaque fois que le processeur XSLT rencontre<br />
l’instruction « », il prend l’élément « recipiendaire<br />
» et essaie d’appliquer ses modèles. Comme il n’a pas de modèle pour les<br />
éléments « recipiendaire », il explore le contenu de l’élément et y trouve immédiatement<br />
un élément « personne ». Puisqu’il dispose d’un modèle pour ce type d’élément, il<br />
va l’appliquer. Par ailleurs, comme les éléments « recipiendaire » et « commercant » ne<br />
contiennent qu’un élément « personne », c’est donc le modèle défini pour les éléments<br />
« personne » qui s’appliquera dans les deux cas.<br />
Normalement, les éléments « xsl:apply-templates » sont utilisés au sein des éléments<br />
« xsl:template ». On peut aussi les utiliser au sein d’autres éléments que nous discuterons<br />
prochainement, « xsl:param » et « xsl:variable ».<br />
Notre fichier « xslt.xml » est maintenant plus modulaire, parce qu’il contient deux<br />
modèles (éléments « xsl:template »).<br />
En résumé, il est souvent préférable d’utiliser un élément « xsl:apply-templates »<br />
qu’un élément « xsl:value-of » quand la complexité du modèle augmente; ceci<br />
permet d’assurer la modularité et de garder la simplicité du document XSLT.<br />
CC BY-NC-SA
XSLT 187<br />
Par défaut, l’instruction apply-templates traite les documents dans l’ordre où ils se présentent<br />
dans le document original. On peut forcer le XSLT à trier les éléments avant<br />
de le traiter avec l’instruction xsl:sort. Dans notre exemple, on peut remplacer l’élément<br />
par cet élément si on veut que les<br />
individus soient triés par leur nom de famille.<br />
<br />
<br />
<br />
Si on souhaite un tri sur la valeur numérique d’une expression, on remplacera datatype="text"<br />
par data-type="number".<br />
On peut aussi importer un autre fichier XSLT avec l’instruction xsl:import. Celle-ci doit<br />
apparaître au tout début du fichier XSLT comme premier sous-élément de l’élément<br />
xsl:stylesheet comme dans cet exemple :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Facture de <br />
<br />
<br />
<br />
En cas de conflit entre les règles de fichier XSLT principal et celles du fichier importé,<br />
les règles du fichier XSLT principal l’emporte.<br />
3.2.14 Chemins XPath pour la sélection des attributs<br />
Maintenant que nous avons un document XSLT modulaire, il est plus facile de l’enrichir.<br />
Supposons que le document XML contienne des attributs... Le numéro d’assurance<br />
sociale des individus peut être indiqué par des attributs « nas », en utilisant le<br />
symbole « @ » dans l’expression XPath, comme dans l’exemple qui suit :<br />
<br />
<br />
<br />
10.10<br />
<br />
<br />
M<br />
CC BY-NC-SA
Module 3 : Technologies XML 188<br />
Rochond<br />
Jean<br />
<br />
<br />
<br />
<br />
F<br />
Ladouce<br />
Jeanne<br />
<br />
<br />
Achat d’ordinateur<br />
<br />
En outre, si nous voulons afficher le numéro d’assurance sociale de l’individu entre<br />
parenthèses, nous pourrons utiliser le fichier « xslt.xml » suivant :<br />
<br />
<br />
<br />
<br />
<br />
Facture de <br />
<br />
<br />
Ceci est une facture pour<br />
<br />
de $ pour:<br />
.<br />
Votre commerçant: <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
( )<br />
<br />
<br />
CC BY-NC-SA
XSLT 189<br />
Notez que le chemin XPath « » ne donne pas le contenu<br />
de l’élément « nas », mais plutôt la valeur de l’attribut ayant pour nom « nas ».<br />
3.2.15 Expression XPath « . »<br />
Supposons que, dans un modèle, nous voulions obtenir non pas la valeur d’un attribut<br />
ou d’un sous-élément, mais la valeur de l’élément lui-même. On obtient ce résultat<br />
avec l’expression XPath « . » (un point). Par exemple, nous pourrions définir le modèle<br />
suivant :<br />
<br />
<br />
<br />
Dans l’expression « select="." », le point représente l’élément courant, c’est-à-dire<br />
l’élément « prenom ». Donc, l’élément « » donne le contenu<br />
de l’élément « courant ». Nous pourrions remplacer le fichier XSLT précédent par celui<br />
qui suit et obtenir les mêmes résultats :<br />
<br />
<br />
<br />
<br />
<br />
Facture de <br />
<br />
<br />
Ceci est une facture pour<br />
<br />
de $ pour:<br />
.<br />
Votre commerçant: <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
( )<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 190<br />
<br />
<br />
<br />
Nous pourrions objecter que les instructions « » et « »<br />
sont étranges puisqu’il n’y a pas de modèle « recipiendaire » ou « commercant ».<br />
Cependant, la règle par défaut qui s’applique aux éléments est d’appliquer les modèles<br />
à leurs sous-éléments et ainsi de suite.<br />
3.2.16 Spécifier les valeurs d’attributs<br />
Nous savons maintenant comment aller chercher la valeur d’un attribut en utilisant une<br />
expression XPath contenant le symbole « @ ». Cependant, qu’en est-il de la spécification<br />
des valeurs d’attributs Supposons le document suivant :<br />
<br />
10.10<br />
<br />
Nous voulons le simplifier pour n’avoir que :<br />
<br />
Nous pouvons obtenir ce résultat en utilisant les accolades, pour indiquer une valeur<br />
XPath comme valeur d’attribut, de la façon suivante :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Expression XPath «.»<br />
3.2.17 Expression XPath « .. »<br />
L’expression « select=".." » (deux points successifs) peut être utilisée pour représenter<br />
l’élément dans lequel se trouve l’élément courant. Ainsi, dans le modèle suivant<br />
CC BY-NC-SA
XSLT 191<br />
<br />
<br />
<br />
l’instruction « » donne la valeur (texte contenu dans<br />
l’élément sans les balises) de l’élément « personne » dans lequel est contenu l’élément<br />
« prenom ». Nous pouvons aller chercher le parent du parent avec l’instruction<br />
.<br />
Lorsque l’élément courant est l’élément-racine, l’expression « .. » (deux points successifs)<br />
ne devrait pas être utilisée.<br />
3.2.18 Expression XPath « // »<br />
Parfois, il est avantageux de sélectionner par nom tous les éléments qui sont dans l’élément<br />
courant ou dans un sous-élément; nous pouvons obtenir ce résultat avec l’expression<br />
XPath « // » (deux barres obliques). L’expression XPath « //prenom » sélectionne<br />
tous les éléments prenom incluant ceux qui seraient contenus dans un élément nom, par<br />
exemple. L’instruction donnera donc le contenu<br />
textuel du premier élément personne recontré dans le document.<br />
3.2.19 Expression XPath « * »<br />
Parfois, il est avantageux de sélectionner tous les éléments qui sont dans l’élément<br />
courant; nous pouvons obtenir ce résultat avec l’expression XPath « * » (astérisque).<br />
Par exemple, le modèle qui suit s’applique à tous les éléments :<br />
<br />
Ceci est un élément.<br />
<br />
Une expression avec « @* » sélectionne tous les attributs contenus dans un élément.<br />
Dans certains cas, plus d’un modèle s’applique à un élément donné : en cas de doute, le<br />
processeur applique le modèle le plus « spécifique »; le modèle pour « * » ne s’applique<br />
que s’il n’existe aucun autre modèle.<br />
De la même façon, nous pouvons indiquer au processeur XSLT d’appliquer les règles<br />
à tous les éléments, en utilisant la syntaxe .<br />
3.2.20 Expression XPath avec « | »<br />
Parfois, nous voulons sélectionner plusieurs noms d’éléments; nous pouvons obtenir<br />
ce résultat avec le symbole « | » (barre verticale) qui signifie « union ». Par exemple, le<br />
CC BY-NC-SA
Module 3 : Technologies XML 192<br />
modèle qui suit s’applique à tous les éléments « facture » et « montant », et seulement<br />
à ces éléments :<br />
<br />
Ceci est un élément facture ou montant.<br />
<br />
3.2.21 Expression XPath pour le nom d’un élément<br />
Supposons que nous voulions afficher uniquement les noms des éléments (sans leur<br />
contenu). Nous pouvons obtenir ce résultat avec la fonction XPath « name » qui donne<br />
le nom de l’élément. La fonction name inclut le préfixe de l’espace de noms. Si on<br />
souhaite le nom de l’élément sans le préfixe, on peut utiliser la fonction « local-name ».<br />
La fonction « namespace-uri » donne l’URI de l’espace de noms de l’élément.<br />
Ainsi, le document XSLT suivant permet d’afficher tous les noms des éléments XML,<br />
sans le contenu textuel de ces éléments.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Nous pourrions aussi vouloir afficher non seulement le nom de l’élément courant, mais<br />
aussi le nom de l’élément-parent, ce qu’on peut faire avec le document XSLT suivant :<br />
<br />
<br />
<br />
/ <br />
<br />
<br />
<br />
3.2.22 Notion de nœuds XSLT<br />
Un processeur XSLT traite un fichier XML en partant du début et en appliquant ses<br />
règles au fur et à mesure qu’il rencontre des éléments. Rappelons que si le processeur<br />
CC BY-NC-SA
XSLT 193<br />
XSLT rencontre un élément pour lequel il n’a aucune règle (modèle), il visite tous les<br />
sous-éléments et applique le modèle par défaut, soit reproduire le texte quand il en<br />
rencontre, en omettant les balises.<br />
Une autre façon de décrire ce comportement est de dire que le XSLT utilise un modèle<br />
de fichiers XML « en arbre de nœuds ». Imaginons un arbre où, à la racine, se trouve<br />
un nœud spécial représentant le document dans son ensemble. Avec XPath, nous pouvons<br />
pointer directement sur le nœud-racine (le document lui-même) en utilisant la<br />
barre oblique « / » que nous plaçons au début de l’expression XPath, comme dans<br />
« ». Dans ce cas, « » donne<br />
la valeur de l’élément-racine, si celui-ci se nomme « jean ».<br />
Le nœud-racine contient lui-même l’élément-racine. Chaque élément et chaque élément<br />
de texte sont aussi des nœuds dans ce modèle d’arbre XSLT. Alors que les nœuds<br />
de texte ne peuvent pas contenir d’autres nœuds, les nœuds d’élément peuvent contenir<br />
plusieurs autres nœuds dont d’autres nœuds d’élément et de texte.<br />
Ainsi, par défaut, le processeur XSLT qui atteint un élément visite tous les éléments et<br />
les nœuds de texte qu’il contient. Un nœud de texte rencontré est simplement recopié,<br />
par défaut, alors que pour les éléments, on visite également leur contenu. C’est ce qui<br />
explique que, par défaut, s’il n’y a aucune règle dans le document XSLT, un document<br />
XML est recopié sans les balises.<br />
D’autres nœuds existent comme les nœuds de commentaire, les nœuds d’instructions<br />
de traitement et les nœuds d’espaces de noms, mais ils sont moins importants que<br />
le nœud du document (nœud-racine), les nœuds d’attribut, les nœuds de texte ou les<br />
nœuds d’élément. Dans le modèle d’arbre, les nœuds d’espaces de noms et les nœuds<br />
d’attribut sont attachés à l’élément, mais ne sont pas un enfant (« child »).<br />
Nous avons déjà vu que « * » et « @* » permettaient de sélectionner les sous-éléments<br />
et attributs d’un élément. On peut sélectionner les nœuds de texte avec la fonction<br />
XPath « text() ». Notons aussi que l’élément « » signifie que<br />
les modèles s’appliquent à tous les nœuds contenus dans le nœud courant. Les règles<br />
par défaut qui s’appliquent en XSLT sont :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
En résumé, un processeur XSLT représente un document XML comme un arbre et<br />
tente de le visiter de la racine vers les feuilles. Lorsqu’il rencontre un modèle pour un<br />
CC BY-NC-SA
Module 3 : Technologies XML 194<br />
nœud, il l’applique et ne poursuit pas automatiquement la visite des nœuds qui y sont<br />
contenus, à moins de rencontrer un élément « xsl:apply-templates ».<br />
3.2.23 Expressions XPath pour compter et additionner les éléments<br />
Avec XSLT et XPath, on peut faire un certain nombre d’opérations, comme compter<br />
les éléments. La fonction XPath « count » compte le nombre de nœuds (éléments)<br />
sélectionnés. Soit le document XML suivant :<br />
<br />
10.10<br />
20.10<br />
<br />
Supposons qu’on veuille calculer automatiquement le nombre d’éléments « montant »<br />
pour obtenir quelque chose comme ceci :<br />
<br />
Il suffit simplement d’utiliser la fonction « count », comme dans l’exemple de document<br />
XSLT qui suit :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Supposons maintenant qu’on veuille numéroter les montants pour bien indiquer quel<br />
montant apparaît en premier, quel montant apparaît en deuxième, et ainsi de suite.<br />
Pour ce faire, il n’y a pas d’expression XPath appropriée, mais nous pouvons obtenir<br />
le résultat désiré à l’aide de l’élément XSLT « xsl:number » et son attribut « count ».<br />
En effet, le document XSLT qui suit :<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
XSLT 195<br />
Montant numero <br />
est .<br />
<br />
<br />
permet d’obtenir le résultat suivant :<br />
Montant numero 1 est 10.10.<br />
Montant numero 2 est 20.10.<br />
L’élément « xsl:number » avec l’attribut « count » permet de numéroter des éléments<br />
sur la base de leur nom, que l’on utilise comme valeur de l’attribut « count ».<br />
On peut aussi additionner des nombres avec la fonction XPath « sum ». L’exemple<br />
suivant fera la somme des valeurs numériques contenues dans les éléments « montant »<br />
(10.10 et 20.10).<br />
<br />
<br />
<br />
<br />
<br />
<br />
3.2.24 Utilisation de l’attribut « mode »<br />
Il arrive que nous voulions définir plus d’un modèle pour un élément donné. Nous pouvons<br />
ajouter des modèles en utilisant l’attribut « mode » qui s’applique aux éléments<br />
« xsl:apply-templates » et « xsl:template ». La règle est très simple : si votre élément<br />
« xsl:apply-templates » a une valeur d’attribut pour « mode », alors seuls les éléments<br />
« xsl:template » ayant la même valeur d’attribut pour « mode » s’appliquent. On utilise<br />
souvent l’attribut « mode » pour faire des tables des matières.<br />
Prenons, par exemple, la liste de cours suivants :<br />
<br />
<br />
<strong>INF</strong> 102 Introduction avancée<br />
Un cours d’introduction à l’informatique pour futurs<br />
ingénieurs.<br />
<strong>INF</strong> 101 Introduction<br />
Un cours d’introduction à l’informatique pour les<br />
étudiants en éducation.<br />
<strong>INF</strong> 103 Java<br />
CC BY-NC-SA
Module 3 : Technologies XML 196<br />
Un cours d’introduction au Java<br />
<br />
Nous pourrions vouloir que s’affiche d’abord seulement la liste des noms de cours et<br />
que cette dernière soit suivie d’une liste détaillée comprenant le nom et la description<br />
du cours :<br />
La liste des cours en bref:<br />
– <strong>INF</strong> 102 Introduction avancée<br />
– <strong>INF</strong> 101 Introduction<br />
– <strong>INF</strong> 103 Java<br />
La liste détaillée des cours:<br />
– <strong>INF</strong> 102 Introduction avancée: Un cours d’introduction à l’informatique pour futurs<br />
ingénieurs.<br />
– <strong>INF</strong> 101 Introduction: Un cours d’introduction à l’informatique pour les étudiants<br />
en éducation.<br />
– <strong>INF</strong> 103 Java: Un cours d’introduction au Java<br />
Nous pouvons obtenir ce résultat avec le document XSLT suivant qui utilise l’attribut<br />
« mode » :<br />
<br />
<br />
<br />
<br />
La liste des cours en bref:<br />
<br />
<br />
<br />
La liste détaillée des cours:<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
:<br />
<br />
<br />
CC BY-NC-SA
XSLT 197<br />
<br />
3.2.25 Fonction « generate-id »<br />
La fonction XSLT « generate-id » génère un « nom » unique pour chaque élément d’un<br />
document XML. Ce nom sera toujours le même pour un même élément, même si nous<br />
le rencontrons à plusieurs reprises. Si nous reprenons la liste des cours de l’exemple<br />
précédent sur l’utilisation de l’attribut « mode », nous pourrions générer un identifiant<br />
unique pour chaque cours et l’afficher comme dans l’exemple de document XSLT qui<br />
suit :<br />
<br />
<br />
<br />
<br />
La liste des cours en bref :<br />
<br />
<br />
<br />
La liste détaillée des cours :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
(identifiant: )<br />
<br />
<br />
:<br />
<br />
(identifiant: )<br />
<br />
<br />
Nous pourrions alors obtenir un résultat comme celui-ci :<br />
La liste des cours en bref:<br />
– <strong>INF</strong> 102 Introduction avancée (identifiant: id2243749)<br />
– <strong>INF</strong> 101 Introduction (identifiant: id2243760)<br />
– <strong>INF</strong> 103 Java (identifiant: id2243686)<br />
CC BY-NC-SA
Module 3 : Technologies XML 198<br />
La liste détaillée des cours:<br />
– <strong>INF</strong> 102 Introduction avancée: Un cours d’introduction à l’informatique pour futurs<br />
ingénieurs. (identifiant: id2243749)<br />
– <strong>INF</strong> 101 Introduction: Un cours d’introduction à l’informatique pour les étudiants<br />
en éducation. (identifiant: id2243760)<br />
– <strong>INF</strong> 103 Java: Un cours d’introduction au Java (identifiant: id2243686)<br />
Les valeurs exactes que prennent les identifiants sont sans importance, mais il importe<br />
que ce soit toujours la même valeur pour un même élément. Par exemple, le cours sur<br />
Java obtient toujours l’identifiant « id2243686 » dans notre exemple.<br />
3.2.26 Utilisation des tests<br />
Nous pouvons tester des conditions à l’aide d’expressions XPath contenant les symboles<br />
« < », « = », « != », « or », « and », « > », « >= », «
XSLT 199<br />
On peut aussi combiner plusieurs tests avec les opérateurs logiques and, or et not<br />
comme le montre le prochain exemple.<br />
<br />
<br />
<br />
Il y a une balise "montant" ou une<br />
balise "facture"<br />
<br />
<br />
Ce n’est ni montant, ni facture, ni argent.<br />
<br />
<br />
Je ne connais pas cet élément.<br />
<br />
<br />
<br />
On peut aussi tester la langue d’un élément avec la fonction XPath « lang ». L’expression<br />
« count(//p[lang(’en’)]) » compte le nombre d’élément « p » ayant été déclaré<br />
comme contenant du texte en langue anglaise.<br />
Observez qu’un élément « xsl:choose » contient plusieurs éléments « xsl:when »<br />
qui sont testés tour à tour, jusqu’à ce qu’une condition soit vraie; l’élément<br />
« xsl:otherwise » est présent pour l’éventualité où tous les tests échouent. Tous les<br />
tests sont réalisés en séquence et dès qu’une condition est vraie, les tests s’arrêtent et<br />
le contenu de l’élément « xsl:when » est évalué.<br />
En XSLT, il ne faut pas abuser des tests; il est préférable d’utiliser des éléments<br />
« xsl:template » qui sont plus modulaires.<br />
3.2.27 Tester le contenu des chaînes de caractères<br />
Nous avons vu comment comparer le nom ou le contenu d’un élément avec une chaîne<br />
de caractères donnée, mais il arrive qu’on veuille faire des comparaisons plus fine.<br />
Heureusement, il existe des fonctions XPath permettant d’analyser le contenu des<br />
chaînes. Par exemple, « starts-with("a",@toto) » renvoie la valeur vraie si et seulement<br />
si la valeur de l’attribut « toto » débute avec la lettre « a ». L’expression « endswith("a",@toto)<br />
» est vraie si et seulement si la valeur de l’attribut « toto » se termine<br />
avec la lettre « a ». De la même façon, « contains("abc",@toto) » renvoie la valeur vraie<br />
si et seulement si la valeur de l’attribut « toto » contient la chaîne « abc » (comme dans<br />
« j’ai un abc »).<br />
CC BY-NC-SA
Module 3 : Technologies XML 200<br />
3.2.28 Accès aux éléments d’un ensemble d’éléments<br />
Avec XSLT, nous pouvons traiter du XML un peu comme nous traitons un tableau en<br />
Java ou en C/C++. Par exemple, supposons que nous ayons une liste de clients avec<br />
leur numéro de téléphone, comme ceci :<br />
<br />
<br />
Jacques<br />
Sylvain<br />
Claude<br />
Yvon<br />
<br />
Notez que l’expression XPath « /listedeclients/client » est en fait une séquence (ensemble<br />
ordonné) d’éléments. Ainsi, « /listedeclients/client[2] » représente le deuxième<br />
(et non le troisième!) élément « client », celui dont le nom est « Sylvain ».<br />
Maintenant, si nous voulons obtenir le numéro de téléphone du deuxième client de<br />
la liste, il faut d’abord ajouter le symbole « / » (barre oblique) pour indiquer qu’on<br />
cherche un sous-nœud de l’élément en question, suivi de « @telephone » pour désigner<br />
l’attribut « telephone ». Le document XSLT suivant nous donnerait le numéro de<br />
téléphone désiré :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Ou, plus simplement :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Notez que l’expression « /listedeclients/client[0] » n’est pas valable, car la numérotation<br />
des éléments d’une séquence débute à 1 en XSLT, contrairement à Java et à C/C++.<br />
CC BY-NC-SA
XSLT 201<br />
Notez aussi qu’on aurait pu obtenir le même résultat avec l’expression XPath « (/listedeclients/client/@telephone)[2]<br />
», car « /listedeclients/client/@telephone » est aussi<br />
une séquence (mais une séquence d’attributs). Nous devons toutefois ajouter une parenthèse<br />
pour marquer la priorité des opérations. En effet, la syntaxe « a/b[2] » signifie :<br />
deuxième nœud de type « b » dans les nœuds de type « b ». Comme il ne peut y avoir<br />
qu’un seul attribut d’un type donné dans un élément, la syntaxe « a/@b[2] » donnera<br />
toujours un ensemble vide. D’un autre côté, la syntaxe « (a/b)[2] » signifie : deuxième<br />
nœud de type « b » dans la séquence des nœuds de type « b » contenus dans les nœuds<br />
de type « a ». De la même manière, « //b[2] » donne la liste de tous les éléments b « b »<br />
dans le document apparaissant deuxième dans la liste des éléments contenus dans un<br />
autre élément, alors que « (//b)[2] » est le deuxième élément « b » rencontré dans tout<br />
le document.<br />
Vous croyez avoir bien compris Quelle est la différence entre « (b)[2] » et « b[2] » <br />
Quelle est la différence entre « (b[2])/a » et « b[2]/a » <br />
3.2.29 Utiliser XSLT comme base de données et éléments « foreach<br />
»<br />
L’exemple de la liste des clients avec leur numéro de téléphone nous permet de<br />
faire plus. Nous pouvons y utiliser XSLT comme « moteur (primitif) de base<br />
de données », en cherchant les éléments selon leur contenu. L’expression XPath<br />
« /listedeclients/client[nom=’Sylvain’] » nous donnera les éléments pour lesquels<br />
le contenu du sous-élément « nom » est « Sylvain ». L’expression plus complète<br />
« /listedeclients/client[nom=’Sylvain’]/@telephone » pointera directement sur l’attribut<br />
« telephone » dont la valeur est « 545-5455 ». D’un autre côté, l’expression<br />
XPath « /listedeclients/client[@telephone=’533-3445’]/nom », nous donnera l’élément<br />
« nom » contenant le nom du client ayant le numéro de téléphone indiqué.<br />
L’absence du symbole « = » dans le crochets indique qu’il s’agit d’un test d’existence.<br />
Ainsi, « /listedeclients/client[nom] » donne les éléments « client » qui ont un sousélément<br />
« nom ». De la même façon, « /listedeclients/client[@telephone] » donne les<br />
éléments « client » qui ont un attribut « telephone ».<br />
Supposons maintenant que nous soyons devant un fichier XML comme celui-ci :<br />
<br />
<br />
<br />
Jacques<br />
Sylvain<br />
Claude<br />
Yvon<br />
<br />
<br />
Arthur<br />
CC BY-NC-SA
Module 3 : Technologies XML 202<br />
Sylvain<br />
Claudette<br />
Yvon<br />
<br />
<br />
Il est maintenant plus fastidieux de trouver le numéro de téléphone d’un certain client,<br />
car il faut visiter tous les vendeurs. De plus, chaque vendeur peut avoir un numéro de<br />
téléphone (possiblement différent) pour chaque client. Comme nous allons le voir, le<br />
XSLT permet de gérer assez facilement ces situations.<br />
Tout d’abord, l’expression « //client » donne une séquence de tous les éléments<br />
« client » dans le nœud courant. Avec l’expression XPath « //client[nom=’Sylvain’] »,<br />
nous pouvons obtenir la séquence de tous les éléments « client » ayant pour nom « Sylvain<br />
». Dans ce cas précis, il y a plus d’un élément dans la réponse. Pour visiter l’ensemble<br />
des éléments dans la séquence, il suffit d’utiliser l’élément « xsl:for-each »<br />
comme ceci :<br />
<br />
<br />
<br />
Numéros de téléphone pour Sylvain:<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Le résultat de l’application de ce fichier XSLT au fichier XML contenant les numéros<br />
de téléphone sera :<br />
Numéros de téléphone pour Sylvain:<br />
<br />
545-5455<br />
545-5456<br />
<br />
<br />
CC BY-NC-SA
XSLT 203<br />
Dans une telle boucle, il peut être utile de savoir quel est le numéro du nœud courant.<br />
On obtient ce numéro avec la fonction XSLT « position() » qui a la valeur 1 quand il<br />
s’agit du premier nœud et la valeur « last() » quand il s’agit du dernier nœud. On peut<br />
aussi utiliser une instruction xsl:sort au sein d’un élément for-each.<br />
Supposons maintenant que nous voulions compter le nombre de fois qu’un client est<br />
dans la base de données. Un modèle XSLT comme celui qui suit semble une bonne<br />
piste :<br />
<br />
<br />
<br />
Malheureusement, entre les crochets (partie conditionnelle de l’expression XPath), le<br />
symbole « . » ne représente plus l’élément « client » XSLT courant, mais bien chacun<br />
des éléments « client » du document tour à tour : la condition « nom=./nom » est ici<br />
toujours satisfaite. Heureusement, il existe une fonction XSLT, appelée « current() »,<br />
qui représente toujours l’élément XSLT courant. Donc, si nous voulons parcourir tout<br />
le document et trouver combien de fois chaque client est dans la liste, nous pourrions<br />
utiliser le document XSLT suivant :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Nom du vendeur: <br />
<br />
<br />
<br />
:<br />
<br />
<br />
<br />
Le résultat de la transformation sera alors :<br />
CC BY-NC-SA
Module 3 : Technologies XML 204<br />
<br />
<br />
Nom du vendeur: Jean<br />
<br />
Jacques:<br />
1<br />
Sylvain:<br />
2<br />
Claude:<br />
1<br />
Yvon:<br />
2<br />
<br />
<br />
<br />
Nom du vendeur: Raymond<br />
<br />
Arthur:<br />
1<br />
Sylvain:<br />
2<br />
Claudette:<br />
1<br />
Yvon:<br />
2<br />
<br />
<br />
<br />
Nous verrons dans la section suivante comment faire pour ne présenter chaque client<br />
qu’une seule fois.<br />
3.2.30 Obtenir l’aggrégation avec la fonction « generate-id »<br />
Supposons qu’on veuille calculer le total des éléments « quantite », mais en faisant<br />
l’aggrégation pour chaque valeur de l’attribut « type » dans l’exemple suivant.<br />
<br />
<br />
<br />
<br />
53<br />
12<br />
<br />
CC BY-NC-SA
XSLT 205<br />
<br />
14<br />
12<br />
<br />
<br />
On pourrait tenter de résoudre ce problème avec une expression XPath de la forme<br />
« sum(//quantite[@type=current()/@type]) ». Malheureusement, on risque alors de calculer<br />
plusieurs fois la même somme. Par exemple, tentez d’appliquer la transformation<br />
suivante :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
- <br />
<br />
<br />
<br />
Vous obtiendrez alors le résultat suivant :<br />
<br />
bain<br />
- 67<br />
chambre<br />
- 24<br />
bain<br />
- 67<br />
chambre<br />
- 24<br />
<br />
Pour calculer la somme qu’une seule fois pour chaque valeur de l’attribut type, on<br />
pourrait ne faire le calcul que la première fois qu’on rencontre une valeur d’attribut<br />
CC BY-NC-SA
Module 3 : Technologies XML 206<br />
donnée. L’expression XPath « //quantite[@type=x] » représente l’ensemble des éléments<br />
quantite ayant un attribut de valeur x. L’expression « //quantite[@type=x][1] »<br />
nous donne le premier élément de ce type rencontré. On pourrait penser que l’expression<br />
XPath « //quantite[@type=x][1]=current() » permet de déterminer si le nœud<br />
courant est le premier. Malheureusement, cette expression XPath vérifie plutôt si<br />
les deux éléments ont le même contenu. Comme nous avons deux éléments quantite<br />
ayant le même contenu dans notre exemple, cette solution ne suffit pas. La<br />
fonction generate-id quant à elle associe un identifiant unique à chaque nœud d’un<br />
document XML et permet donc de distinguer les éléments entre eux même lorsqu’ils<br />
ont le même contenu. L’expression « //quantite[@type=current()/@type]) »<br />
donne la séquence de tous les éléments quantite ayant un attribut type de même<br />
valeur que l’élément courant, alors que « (//quantite[@type=current()/@type])[1] »<br />
sélectionne le premier de cette liste. On peut vérifier si l’élément « quantite »<br />
est le premier du document ayant un certain type avec la fonction « generateid<br />
» et l’expression « generate-id((//quantite[@type=current()/@type])[1]) = generateid(.)<br />
». On peut aussi vérifier que c’est le dernier avec l’expression « generateid((//quantite[@type=current()/@type])[last()])<br />
= generate-id(.) ». En utilisant cette astuce,<br />
on peut obtenir l’aggrégation souhaitée avec le programme XSLT suivant où l’on<br />
fait la somme seulement pour le premier élément rencontré ayant un certain type :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
- <br />
<br />
<br />
<br />
<br />
On peut appliquer cette technique à notre exemple de la section précédente avec les<br />
vendeurs et les clients. La transformation suivante permet de ne calculer la fréquence<br />
de chaque client qu’une seule fois.<br />
CC BY-NC-SA
XSLT 207<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
:<br />
<br />
<br />
<br />
<br />
Le résultat de cette transformation donne une liste désordonnée de clients :<br />
<br />
Jacques:<br />
1<br />
Sylvain:<br />
2<br />
Claude:<br />
1<br />
Yvon:<br />
2<br />
Arthur:<br />
1<br />
Claudette:<br />
1<br />
<br />
On peut trier le nom des clients en utilisant un élément xsl:sort :<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 208<br />
<br />
<br />
<br />
<br />
<br />
:<br />
<br />
<br />
<br />
<br />
<br />
<br />
3.2.31 Un peu plus de performance avec la function XSLT « key »<br />
Le problème avec l’utilisation d’expressions XPath telles que<br />
//client[nom=current()/nom] est qu’elles peuvent s’avérer coûteuses en temps de<br />
calcul si on les utilisent à répétition. Afin d’accélérer les choses et simplifier un<br />
peu nos programmes, on peut créer un tableau associatif avec l’élément xsl:key et<br />
sa fonction correspondante key. Un tableau associatif est simplement une structure<br />
de donnée qui associe à chaque clef ou au plusieurs valeurs. Puisque ce tableau est<br />
construit une seule fois lorsque le processeur rencontre l’élément xsl:key, le processeur<br />
XSLT n’a pas à visiter les nœuds du document plusieurs fois. L’élément xsl:key<br />
comprend trois attributs incluant le nom du tableau associative (name), les clefs à<br />
inclure (use) et les nœuds à traiter (match). L’instruction va créer un tableau associatif s’appelant montableau et<br />
qui associe à chaque valeur client/nom l’élément nom correspondant. La fonction key<br />
quant à elle prend deux paramètres incluant le nom du tableau et la valeur de la clef. À<br />
titre d’exemple, la transformation suivante permet de calculer la fréquence de chaque<br />
client comme à la question précédente, mais en utilisant un tableau associatif :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
:<br />
<br />
<br />
<br />
CC BY-NC-SA
XSLT 209<br />
<br />
<br />
<br />
3.2.32 Les variables<br />
Il est possible, en XSLT, de définir des variables, mais elles sont « immutables » (« dont<br />
la valeur ne peut être modifiée »). On peut se demander, à juste titre, si les mots<br />
variables et immutables vont bien ensemble, mais c’est ainsi que les inventeurs du<br />
XSLT se sont exprimés. Pour définir une variable nommée « test », on utilise l’élément<br />
« ». La variable contiendra alors le résultat<br />
de l’expression XPath contenue dans l’attribut « select ». L’exemple suivant peut<br />
être utilisé pour afficher le contenu de tous les éléments « produit » immédiatement<br />
contenus dans l’élément racine.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
On peut aussi définir la valeur de la variable en omettant l’attribut « select » et en<br />
ajoutant du contenu à l’élément « xsl:variable ». Ce contenu pourrait comprendre du<br />
XSLT.<br />
<br />
<br />
<br />
x<br />
<br />
<br />
<br />
<br />
<br />
On peut déclarer la variable localement au sein d’un élément template :<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 210<br />
<br />
<br />
x<br />
<br />
<br />
<br />
<br />
3.2.33 Les paramètres<br />
Un fichier XSLT peut être utilisé comme un programme dans la mesure où on peut lui<br />
passer des paramètres. Rappelons qu’on appelle un fichier XSLT « xslt.xml » à partir<br />
d’un fichier XML qu’on veut transformer de cette manière :<br />
<br />
<br />
<br />
10.10<br />
Jean Rochond<br />
Achat d’ordinateur<br />
<br />
On peut enrichir cet appel avec les instructions « xslt-param » comme dans cet exemple.<br />
<br />
<br />
<br />
<br />
<br />
10.10<br />
Jean Rochond<br />
Achat d’ordinateur<br />
<br />
Selon votre processeur XSLT, il peut y avoir d’autres façons de passer des paramètres<br />
à une feuille de style XSLT.<br />
On reçoit alors les paramètres avec un élément « xsl:param ». L’attribut « select » est<br />
utilisé pour spécifier une valeur par défaut.<br />
<br />
<br />
CC BY-NC-SA
XSLT 211<br />
<br />
<br />
<br />
<br />
<br />
Facture de <br />
<br />
<br />
Ceci est<br />
une facture pour <br />
de $ pour:<br />
.<br />
<br />
<br />
<br />
<br />
On peut aussi passer des paramètres aux éléments « xsl:template » avec les éléments<br />
« xsl:call-template » comme dans cet exemple qui est une façon équivalente, mais plus<br />
compliquée, de formater notre document XML de type « facture » .<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Facture de <br />
<br />
<br />
Ceci est<br />
une facture pour <br />
de $ pour:<br />
.<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 212<br />
<br />
<br />
On peut aussi charger des documents distants avec la fonction XSLT « document » ,<br />
cette instruction donne une copie du document situé à l’adresse @href : . (L’élément « xsl:copy-of » sert ici à faire une copies des<br />
nœuds contenus dans le document distant.) Elle est cependant sujette à des contraintes<br />
de sécurité lorsqu’on l’utilise dans un navigateur : il n’est pas permis de charger des<br />
documents provenant d’autres serveurs que le serveur d’origine.<br />
3.2.34 Générer un commentaire<br />
Il arrive qu’on veuille produire un commentaire dans la sortie XML. Rien de plus<br />
simple ! Il suffit d’utiliser l’instruction xsl:comment comme dans cet exemple :<br />
<br />
<br />
Ceci est un commentaire.<br />
<br />
Le résultat devrait ressembler à ceci :<br />
<br />
<br />
3.2.35 Créer des éléments dynamiquement avec « xsl:element »<br />
Il est parfois utile de créer dynamiquement un élément avec « xsl:element » et de créer<br />
des attributs avec « xsl:attribute ». Dans l’exemple suivant, on va créer un élément dont<br />
le nom nous est fourni par un paramètre.<br />
<br />
<br />
<br />
<br />
<br />
<br />
bleu<br />
<br />
CC BY-NC-SA
XSLT 213<br />
<br />
<br />
<br />
3.2.36 Copier des nœuds avec « xsl:copy » et « xsl:copy-of »<br />
Il est parfois nécessaire de dire au XSLT qu’on souhaite tout simplement recopier le<br />
nœud courant dans le document sortant. L’élément « xsl:copy » copie l’élément (seul,<br />
sans ses attributs mais avec son espace de noms) alors que l’élément « xsl:copy-of »<br />
permet de copier un élément ainsi que tous les nœuds qu’il contient. XSLT ne transforme<br />
pas les nœuds ainsi copiés, ils sont insérés dans le résultat directement. Par<br />
exemple, ce document XSLT va créer une copie intégrale du document:<br />
<br />
<br />
<br />
<br />
<br />
<br />
Dans le cas où l’on sélectionne plus d’un élément, notamment avec une expression du<br />
type nom|prenom, tous les éléments sont copiés l’un après l’autre. Ce comportement<br />
diffère de l’instruction value-of qui n’extrait le contenu textuel que du premier élément<br />
rencontré.<br />
Par contre, si on ne souhaite qu’un document XML qui contient le même élémentracine,<br />
mais sans le contenu de l’élément racine, on utilisera plutôt un élément<br />
« xsl:copy », comme ceci :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Naturellement, on peut même définir le contenu de l’élément copié à l’aide d’un modèle<br />
:<br />
CC BY-NC-SA
Module 3 : Technologies XML 214<br />
<br />
<br />
<br />
<br />
x<br />
<br />
<br />
<br />
Si on souhaite ne copier qu’une partie du contenu de l’élément ainsi reproduit, par<br />
exemple ses attributs, on peut utiliser copy-of :<br />
<br />
<br />
<br />
<br />
<br />
x<br />
<br />
<br />
<br />
3.2.37 Union, intersection et différence en XSLT<br />
Nous avons vu que le symbole « | » nous permet d’obtenir l’union de deux expressions<br />
XPath. Prenons l’exemple de ce document :<br />
<br />
<br />
<br />
<br />
<br />
<br />
L’expression « //*[@s="1"] » représente les éléments a et b, l’expression<br />
« //*[@t="1"] » représente les éléments b et c, alors que l’expression<br />
« //*[@s="1"]|//*[@t="1"] » représente les éléments a,b,c (une union de<br />
« //*[@s="1"] » et « //*[@t="1"] »).<br />
CC BY-NC-SA
XSLT 215<br />
Supposons maintenant que nous désirions obtenir les éléments qui satisfont « @s="1" »<br />
et « @t="1" » : on veut calculer l’intersection entre « //*[@s="1"] » et « //*[@t="1"] ».<br />
On pourrait, bien sûr, obtenir ce résultat avec « //*[@s="1" and @t="1"] », mais il<br />
existe une autre façon de le faire qui est d’application plus générale. Supposons que les<br />
résultats des expressions « //*[@s="1"] » et « //*[@t="1"] » sont déjà stockés dans les<br />
variables a1 et a2 respectivement. Alors l’expression « $a1[count(.|$a2)=count($a2)] »<br />
sélectionne l’élément b (ou « //*[@s="1" and @t="1"] »). Ce motif particulier calcule<br />
l’intersection entre le contenu des variables a1 et a2. Pour le comprendre, il suffit de<br />
réaliser que la condition « count(.|$a2)=count($a2) » n’est vraie que pour les nœuds<br />
appartenant déjà à l’ensemble a2.<br />
Supposons maintenant que l’on souhaite trouver les éléments qui satisfont « @s="1" »<br />
mais pas « @s="1" », c’est-à-dire l’élément a. En fait, on souhaite calculer la différence<br />
entre deux ensembles (« //*[@s="1"] » et « //*[@t="1"] »). On pourrait<br />
obtenir ce résultat avec l’expression « //*[@s="1" and not(@t="1")] », mais encore<br />
une fois, il existe un motif plus général: « $a1[count(.|$a2)!=count($a2)] » ou<br />
« //*[@s="1"][count(.|//*[@t="1"])!=count(//*[@t="1"])] ». Pour comprendre cette<br />
expression, il suffit de réaliser que si et seulement si un nœud x n’appartient pas à<br />
a2, alors l’expression « count(x|$a2)!=count($a2) » sera vraie.<br />
3.2.38 Espaces de noms<br />
Les espaces de noms sont supportés et ne posent pas de problème. Il suffit de définir<br />
les préfixes, comme on le fait habituellement. Par exemple, considérons le code XML<br />
suivant :<br />
<br />
<br />
<br />
<br />
Réjean Tremblay<br />
<br />
<br />
Pour afficher le nom de l’étudiant, il suffira d’utiliser le document XSLT suivant :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 216<br />
<br />
<br />
<br />
<br />
Observons que l’attribut « match="nom" » ne s’applique pas à l’élément « nom »<br />
dans l’espace de noms « http://www.mondomaine.com/ », tel qu’il apparaît dans notre<br />
document XML : il est obligatoire d’utiliser un préfixe correspondant au bon espace<br />
de noms. Tout comme « match="*" » permet de sélectionner tous les éléments,<br />
« match="n:*" » permet de sélectionner tous les éléments qui sont dans un espace de<br />
noms donné.<br />
3.2.39 Les axes<br />
Par défaut, l’expression XPath « nom » désigne les éléments « nom » qui sont des<br />
enfants du nœud courant. On peut aussi écrire « child::nom ». De la même manière,<br />
« nom[2] » ou « child::nom[2] » désigne le second enfant du nœud courant. Il est<br />
possible de changer ce comportement en choisissant un axe différent.<br />
– « child » : il s’agit de l’axe par défaut, « child::nom[3] » désigne le troisième élément<br />
« nom » enfant du nœud courant.<br />
– « parent » : l’axe « parent » est pratiquement inutile, « parent::nom » désigne l’élément<br />
parent si celui-ci se nomme « nom ». En général, il est plus simple d’utiliser la<br />
syntaxe « .. » qui est équivalente à « parent::node() ».<br />
– « attribute » : la syntaxe « attribute:: » n’est pas utilisée, on préfère la notation<br />
« @nom » qui signifie la même chose que « attribute::nom ».<br />
– « ancestor » : la syntaxe « ancestor::nom » désigne les éléments de nom « nom » dans<br />
lesquels le nœud courant est contenu. On peut tester si le nœud courant est contenu<br />
dans un paragraphe avec la syntaxe ....<br />
– « ancestor-or-self » : idem que l’axe ancestor exception faite que l’on inclut le<br />
nœud courant, on pourrait donc tester si nœud courant est contenu dans un paragraphe<br />
ou s’il est lui-même un paragraphe avec la syntaxe ....<br />
– « preceding-sibling » : cet axe consulte en séquence les frères du nœud courant,<br />
c’est-à-dire les nœud ayant le même parent, qui apparaissent avant le nœud courant.<br />
Par exemple, « preceding-sibling::nom[2] » cherche le second élément-frère apparaissant<br />
avant le nœud courant.<br />
– « following-sibling » : voir l’axe « preceding-sibling », mais à l’envers (après le<br />
nœud courant).<br />
– « preceding » : cet axe est similaire à « preceding-sibling », mais on traverse tous les<br />
nœuds qui se sont terminés avant nœud courant. Par exemple, « preceding::nom[2] »<br />
cherche le second élément apparaissant avant le nœud courant, même s’il n’a pas le<br />
même parent.<br />
CC BY-NC-SA
XSLT 217<br />
– « following » : voir l’axe « preceding », mais à l’envers.<br />
– « descendant » : voir l’axe « ancestor », mais à l’envers.<br />
– « descendant-or-self » : voir l’axe « ancestor-or-self », mais à l’envers.<br />
3.2.40 L’étude d’un exemple: docbook.xslt<br />
Lors du travail 3, je vous ai demandé d’utiliser un fichier XSLT appelé docbook.xslt qui<br />
transforme des documents DocBook simple en HTML. Vous êtes maintenant en mesure<br />
d’analyser et de comprendre cet exemple. Nous allons passer en revue brièvement les<br />
éléments « xsl:template » qu’il contient.<br />
Le premier élément « xsl:template » sert à capturer l’élément « book ». Comme il<br />
s’agit de l’élément-racine, on en profite pour produire les éléments « html », « head »<br />
et « body ». Le contenu de l’élément « head » sera rempli par l’élément « xsl:template »<br />
traitant l’élément DocBook « bookinfo ». On affiche immédiatement le prénom et le<br />
nom de l’auteur à l’aide des expressions XPath « bookinfo/author/firstname » et « bookinfo/author/surname<br />
». Notez l’utilisation de l’élément pour<br />
produire un espace entre le nom et le prénom. En effet, sans cet élément, il n’y aurait<br />
pas d’espace puisque les espaces et retours de charriot sont ignorés dans les fichiers<br />
XSLT. Le reste du document est produit avec les deux éléments « xsl:template » traitant<br />
les éléments « chapter » : on utilise le l’attribut mode « tdm » pour produire la<br />
table des matières, et le reste du document est produit avec le traitement des éléments<br />
« chapter » par défaut (sans attribut mode).<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
© <br />
Table des matières<br />
<br />
<br />
<br />
<br />
L’élément « xsl:template » traitant l’élément DocBook « bookinfo » est simple : l’expression<br />
XPath « title » permet de trouver le titre du document puisqu’un élément<br />
« title » doit être présent dans tout élément DocBook « bookinfo ». Comme on l’a fait<br />
précédemment, on trouve le prénom et le nom de l’auteur, mais cette fois-ci, avec les<br />
expressions XPath « author/firstname » et « author/surname » puisque nous sommes<br />
maintenant au sein d’un élément « bookinfo ».<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 218<br />
<br />
par <br />
<br />
<br />
<br />
Les élément « xsl:template » avec attribut mode génèrent la table des matières. Les<br />
éléments « xsl:number » permettent de numéroter automatiquement les chapitres et<br />
sections. Afin de générer des hyperliens permettant de naviguer dans le document à<br />
partir de la table des matières, on utilise des fragments générés à partir de la fonction<br />
XSLT « generate-id ». Lorsque nous générons le contenu du document lui-même, on<br />
utilise à nouveau la fonction XSLT « generate-id » pour placer des ancres dans le<br />
document au bon endroit. L’avantage de la fonction XSLT « generate-id » est qu’elle<br />
permet de générer facilement un identifiant unique pour chaque paragraphe.<br />
<br />
<br />
.<br />
<br />
<br />
<br />
<br />
<br />
.<br />
<br />
<br />
<br />
<br />
Les élément « xsl:template » sans attribut mode génèrent le document lui-même. La<br />
principale différence avec la génération de la table des matières est la présence de<br />
l’élément qui traite le contenu des éléments « section ».<br />
<br />
Chapitre<br />
. <br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
XSLT 219<br />
.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Le traitement des éléments DocBook « itemizedlist », « orderedlist » et « listitem » est<br />
simple : il suffit de les convertir en éléments HTML « ul », « ol » et « li » respectivement.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Les éléments DocBook « programlisting » sont convertis en éléments HTML « pre »<br />
(préformaté).<br />
<br />
<br />
<br />
<br />
<br />
<br />
Les éléments DocBook « para » sont convertis en éléments HTML « p » sauf lorsqu’ils<br />
sont au sein d’un élément DocBook « listitem ».<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 220<br />
<br />
<br />
<br />
Les éléments DocBook « title » ne doivent pas être traités directement lorsqu’on les<br />
rencontre.<br />
<br />
Comme vous pouvez le constater, en décomposant un document XSLT complexe, on<br />
arrive facilement à en expliquer le fonctionnement. C’est d’ailleurs un avantage de la<br />
programmation déclarative de pouvoir être ainsi décomposée et expliquée.<br />
3.2.41 Activité suggérée<br />
Essayez de refaire les exemples avec le moteur XSLT de Firefox. Vous devrez ajouter<br />
les éléments « html » et « body » lorsqu’ils ont été omis. Essayez également de modifier<br />
les exemples pour vous assurer d’avoir bien compris.<br />
Enfin, pour mieux comprendre le XSLT, faites quelques exercices exploratoires. Vous<br />
pouvez consulter les articles de mozilla.org sur XSLT (http://developer.mozilla.org/en/<br />
docs/XSLT) et XPath (http://developer.mozilla.org/en/docs/XPath).<br />
Pour avoir une vue d’ensemble, consultez le pense-bête XSLT.<br />
3.2.42 Autres moteurs XSLT<br />
Votre navigateur supporte XSLT, mais si vous désirez un moteur XSLT qui ne dépende<br />
pas d’un navigateur, je vous suggère 4Suite (http://www.4suite.org/) ou Xalan (http://<br />
xml.apache.org/xalan-j/). Si vous avez le temps d’installer un tel moteur, vous pourrez<br />
sans doute plus rapidement faire les travaux et refaire les exemples de cette leçon, mais<br />
l’utilisation de Firefox est suffisante.<br />
3.2.43 Pour voir le résultat de la transformation XSLT<br />
Avec Firefox .2.0 ou mieux, on peut voir le résultat de la transformation XSLT en enregistrant<br />
le fichier: il faut aller dans le menu « Fichier » puis sélectionner « Enregistrez<br />
sous ». Normalement, on pourra alors enregistrer le fichier XML en fichier HTML (si<br />
la transformation donne un fichier HTML). On peut ouvrir le fichier HTML avec un<br />
éditeur comme Bloc-note pour voir le résultat.<br />
CC BY-NC-SA
XSLT 221<br />
3.2.44 SVG et XSLT<br />
Une des applications intéressantes du XSLT est de transformer un document en image.<br />
Par exemple, étant donné les données d’une entreprise, on pourrait automatiquement<br />
générer un histogramme en SVG.<br />
3.2.45 XPath, XPointer et XLink<br />
En présentant le XSLT, nous avons couvert les expressions XPath qui nous permettent<br />
de sélectionner des nœuds dans des documents XML. D’autres technologies XML utilisent<br />
XPath comme XLink et XPointer.<br />
XPointer est tout simplement une façon d’ajouter à un URI une expression XPath<br />
pour permettre de représenter un lien vers une partie d’un document XML. On<br />
ajoute un fragment de la forme « #xpointer(...) » à l’URI où les trois petits points<br />
sont remplacés par une expression XPath. Par exemple, si vous voulez représenter<br />
le premier élément « cours » d’un document XML, vous pouvez utiliser la syntaxe<br />
« http://x.com/doc.xml#xpointer(//cours[1]) ». Si vous omettez l’URI, par défaut, le<br />
document XML dans lequel se trouve l’expression XPointer est sélectionné. Les navigateurs<br />
ne supportent pas encore correctement XPointer.<br />
XLink est une généralisation des hyperliens du HTML pouvant être utilisé dans tous<br />
les documents XML. On utilise XLink surtout pour mettre des hyperliens dans des<br />
images SVG. L’espace de noms pour XLink est « http://www.w3.org/1999/xlink » et<br />
on l’utilise surtout avec l’attribut « href ». Dans la figure SVG suivante, le texte « <strong>INF</strong><br />
<strong>6450</strong> » est un hyperlien vers l’URI « http://www.teluq.ca/inf<strong>6450</strong> ».<br />
Voici le code de la figure.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<strong>INF</strong> <strong>6450</strong><br />
<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 222<br />
<br />
Voici le rendu de la figure dans votre navigateur avec l’hyperlien.<br />
3.2.46 XPath 2.0<br />
Une nouvelle version de XPath est disponible (XPath 2.0). À part quelques exceptions,<br />
tout ce qui fonctionnait en XPath 1.0, fonctionne toujours en XPath 2.0. Cependant,<br />
XPath 2.0 ajoute de nombreuses fonctions et opérateurs qui simplifient la vie du<br />
programmeur tels que empty, exists, intersect, except (pour calculer le complément),<br />
deep-equal (pour tester l’égalité entre deux séquences), index-of, reverse, subsequence,<br />
insert-before, remove, distinct-values, avg, max, min, etc. Alors que XPath 1.0 ne traite<br />
que des nombres, des chaînes de caractères, des valeurs booléennes et des ensembles de<br />
nœuds, XPath 2.0 introduit la notion de séquence et plusieurs autres types de données<br />
pour noter les notes, la durée, les entiers, les nombres à virgule flottante, etc. XPath<br />
2.0 supporte aussi les expressions régulières avec les fonctions matches, replace, et tokenize.<br />
XPath 2.0 intègre maintenant la fonction « document » qui était une fonction<br />
XSLT.<br />
XPath 2.0 comprend maintenant un syntaxe if/then/else comme dans cet exemple : « if<br />
( @sexe eq ’m’ ) then ’Monsieur’ else ’Madame’ ». On peut aussi utiliser des boucles :<br />
CC BY-NC-SA
XSLT 223<br />
« for $i in //etudiant return $i/note ». On peut vérifier si au moins un (some) ou tous<br />
(every) les éléments d’une séquence satisfont une condition: « every $i in //etudiant<br />
satisfies $i/note > 0 » ou « some $i in //etudiant satisfies $i/note < 100 ». En somme,<br />
XPath 2.0 permet d’effectuer plusieurs traitement qui n’étaient possible qu’avec des<br />
instructions XSLT auparavant.<br />
3.2.47 XLT 2.0<br />
Une nouvelle version du XSLT est disponible, nommée XLT 2.0. Elle ajoute notamment<br />
la possibilité de générer plusieurs documents plutôt qu’un seul avec l’instruction<br />
xslt:result-document. On peut aussi traiter non seulement des fichiers XML, mais aussi<br />
d’autres types de fichiers dont les fichiers CSV (comma-separated values) générés par<br />
les chiffriers électroniques et bases de données. L’instruction « xsl:analyze-string »<br />
permet de prendre appui sur les nouvelles possibilités du traitement des chaînes de caractères<br />
de XPath 2.0. L’instruction « xsl:function » permet quant à elle de définir de<br />
nouvelles fonctions qui pourront être utilisées au sein des expressions XPath. L’instruction<br />
« xsl:for-each-group » permet de visiter les nœuds par groupes : on peut ainsi<br />
visiter tous les éléments etudiant en les regroupant selon la valeur de leur attribut nom.<br />
Elliotte Rusty Harold a publié une page sur XSLT 2.0 qui présente quelques exemples.<br />
3.2.48 XQuery<br />
XSLT peut servir pour extraire des informations d’un document XML. On peut trouver<br />
tous les noms des étudiants répondant à certains critères. Dans un sens, XSLT peut être<br />
utilisé comme langage dans le contexte des bases de données. Cependant, pour cette fin<br />
spécifique, un nouveau langage appelé XQuery a été proposé. La syntaxe du XQuery<br />
est un mélange de XPath et de SQL et ressemble davantage à ce que les spécialistes<br />
des bases de données connaissent bien.<br />
Pour tester les requêtes XQuery, Saxon est un outil pratique écrit en java. Pour utiliser<br />
Saxon, chargez d’abord le fichier saxon9.jar. Vous devez mettre votre requête XQuery<br />
dans un fichier texte (tel que « query ») et invoquez Saxon comme ceci :<br />
java -cp saxon9.jar net.sf.saxon.Query query<br />
Dans cet exemple, il faut que les fichiers saxon9.jar et query soient dans le dossier<br />
où vous lancez la commande. Le fichier query doit contenir une requête XQuery. Une<br />
requête XQuery n’est pas du XML.<br />
Pour rendre nos exemples plus concrets, supposez que le fichier qui se trouve à l’URI<br />
http://universite.com/etu.xml soit celui-ci :<br />
<br />
<br />
Laroche<br />
Pierre<br />
CC BY-NC-SA
Module 3 : Technologies XML 224<br />
inscrit<br />
<br />
<strong>INF</strong> 6460<br />
54<br />
<br />
<br />
<strong>INF</strong> <strong>6450</strong><br />
44<br />
<br />
<br />
<br />
Aaron<br />
Jean<br />
inscrit<br />
<br />
<strong>INF</strong> 6460<br />
56<br />
<br />
<br />
<strong>INF</strong> <strong>6450</strong><br />
46<br />
<br />
<br />
<br />
Pouf<br />
Jean<br />
non-inscrit<br />
<br />
<br />
Vous pouvez créer un fichier etu.xml sur votre disque dans le même dossier que le<br />
fichier query, et remplacer partout l’URI par le nom du fichier (tel que « etu.xml »).<br />
Parce que XQuery, tout comme XSLT 2.0, s’appuie sur XPath 2.0, il est facile de calculer<br />
la liste des cours :<br />
for $s in distinct-values(doc("etu.xml")//sigle)<br />
return $s<br />
Cette requête donnera « <strong>INF</strong> 6460 <strong>INF</strong> <strong>6450</strong> ».<br />
Voici un exemple de requête XQuery pour extraire d’un document XML tous les étudiants<br />
inscrits :<br />
<br />
{let $inscription := "inscrit"<br />
for $b in doc("http://universite.com/etu.xml")/liste/etudiant<br />
where $b/statut = $inscription<br />
order by $b/nom ascending<br />
CC BY-NC-SA
XSLT 225<br />
return <br />
{ $b/prenom }<br />
{ $b/nom }<br />
}<br />
<br />
Cet exemple est une requête de type FLWOR parce qu’elle ne contient que des instructions<br />
« for », « let », « where », « order by », et « return ». L’instruction « for » sert<br />
à définir une boucle, l’instruction « where » sert à poser une condition, l’instruction<br />
« order by » permet de trier le résultat, alors que l’instruction « return » définit le résultat.<br />
L’instruction « let » permet de définir une constante. Notez que XQuery utilise les<br />
accolades pour distinguer les requêtes XQuery et XPath du texte. La requête considère<br />
tous les éléments etudiant contenus dans l’élément-racine liste, pour chacun d’entre<br />
eux, elle vérifie qu’il contient un élément statut contenant le texte « inscrit », puis elle<br />
donne la liste des noms et prénoms triée selon le nom. Voici quel sera le résultat :<br />
<br />
<br />
Jean<br />
Aaron<br />
<br />
<br />
Pierre<br />
Laroche<br />
<br />
<br />
On peut attribuer un compteur aux nœuds :<br />
<br />
{<br />
for $b at $pos in doc("http://universite.com/etu.xml")/liste/etudiant<br />
order by $b/nom descending<br />
return<br />
$pos -<br />
{ $b/prenom }<br />
{ $b/nom }<br />
<br />
}<br />
<br />
Le résultat sera alors :<br />
<br />
3-<br />
Jean<br />
Pouf<br />
<br />
1-<br />
CC BY-NC-SA
Module 3 : Technologies XML 226<br />
Pierre<br />
Laroche<br />
<br />
2-<br />
Jean<br />
Aaron<br />
<br />
<br />
On peut combiner les requêtes FLWOR, comme dans cet exemple :<br />
<br />
{for $e in doc("http://universite.com/etu.xml")//etudiant<br />
return<br />
<br />
{ for $v in $e/cours return<br />
{number($v/note)}<br />
}<br />
<br />
}<br />
<br />
Cette requête va considérer chaque élément etudiant du document XML et créer une<br />
liste de notes obtenues pour cet étudiant, dans ce cas, le résultat sera :<br />
<br />
<br />
54<br />
44<br />
<br />
<br />
56<br />
46<br />
<br />
<br />
<br />
L’expression suivante va calculer la moyenne de notes (50) :<br />
<br />
avg(<br />
for $n in doc("http://universite.com/etu.xml")//note<br />
return $n<br />
)<br />
<br />
Par défaut, les documents XQuery utilisent le jeu de caractères Unicode UTF-8. On<br />
peut stipuler un jeu de caractères différent dans la déclaration XQuery optionnelle<br />
comme dans cet exemple :<br />
CC BY-NC-SA
XSLT 227<br />
xquery version "1.0" encoding "utf-8";<br />
for $s in distinct-values(doc("etu.xml")//sigle)<br />
return $s<br />
Certains moteurs de bases de données comme MonetDB ou eXist supportent les requêtes<br />
XQuery. Il y a aussi d’excellents tutoriels sur le web. Elliotte Rusty Harold nous<br />
offre une excellente page sur XQuery qui résume bien les points essentiels avec des<br />
exemples.<br />
3.2.49 XPath versus XSLT<br />
Les expressions XPath sont très utilisées en XSLT. Apprendre le XSLT, c’est aussi<br />
apprendre XPath. Par contre, tout ce qui ressemble à une expression XPath, n’est pas<br />
nécessairement une expression XPath. Par exemple, les fonctions current, document,<br />
generate-id et key sont des fonctions XSLT qui ne sont pas disponibles en XPath, mais<br />
qui s’utilisent au sein des expressions XPath. On peut aussi utiliser les expressions<br />
XPath en Java, en ECMAScript, avec XQuery, etc. Avec XSLT 2.0, il est possible de<br />
définir ses propres fonctions qui s’utilisent au sein des expressions XPath.<br />
3.2.50 En terminant<br />
Le langage XSLT est beaucoup plus riche que ce que nous venons de vous présenter.<br />
Nous pouvons pratiquement tout faire avec le XSLT. En fait, le XSLT est un langage<br />
<strong>complet</strong> (au sens de Turing) et, en principe, tout ce qui peut être fait comme transformation<br />
en Java, peut être fait en utilisant le XSLT. En pratique, le XSLT est particulièrement<br />
approprié si nous voulons faire des transformations simples.<br />
Il est aussi possible d’utiliser le XSLT pour résoudre automatiquement des problèmes<br />
intéressants. Supposons que vous deviez communiquer avec une institution qui utilise<br />
aussi le XML, mais avec des fichiers XML légèrement différents. Il est possible qu’une<br />
simple transformation XSLT permette de transformer les fichiers XML de l’autre institution<br />
en des fichiers similaires aux vôtres.<br />
Le XSLT peut sembler un peu déroutant, mais il faut simplement prendre de l’expérience<br />
avec ce type de programmation.<br />
3.2.51 Livres de référence<br />
– Sal Mangano, XSLT Cookbook, O’Reilly Media, 2006, 751 pages.<br />
– Jeni Tennison, Beginning XSLT, Apress, 2004, 800 pages.<br />
CC BY-NC-SA
Module 3 : Technologies XML 228<br />
3.2.52 Questions d’auto-évaluation<br />
1. Parmi les suivants, quels sont les documents XSLT corrects Choisissez toutes<br />
les réponses qui s’appliquent.<br />
(a)<br />
(b)<br />
(c)<br />
(d)<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
2. Étant donné le document XML suivant...<br />
<br />
<br />
<br />
Jean<br />
Graton<br />
<br />
<br />
et le fichier XSLT suivant...<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
XSLT 229<br />
<br />
<br />
<br />
Qu’est-ce qui s’affichera à l’écran<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Jean Graton<br />
(b) JeanGraton<br />
(c) Jean Graton<br />
(d) Jean Graton<br />
(e) Jean Graton<br />
(f) Jean Graton<br />
(g) Rien<br />
(h) Jean<br />
(i) Graton<br />
3. Étant donné le document XML suivant...<br />
<br />
<br />
<br />
Jean<br />
Graton<br />
<br />
<br />
et le fichier XSLT suivant...<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 230<br />
<br />
<br />
Qu’est-ce qui s’affichera à l’écran<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Jean Graton<br />
(b) Jean Graton<br />
(c) Jean Graton<br />
(d) Jean Graton<br />
(e) Jean Graton<br />
(f) Rien<br />
(g) Jean<br />
(h) Graton<br />
4. Étant donné le document XML suivant...<br />
<br />
<br />
<br />
Jean<br />
Graton<br />
<br />
<br />
et le fichier XSLT suivant...<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Qu’est-ce qui s’affichera à l’écran<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Jean Graton<br />
CC BY-NC-SA
XSLT 231<br />
(b) Jean Graton<br />
(c) Jean Graton<br />
(d) Jean Graton<br />
(e) Jean Graton<br />
(f) Rien<br />
(g) Jean<br />
(h) Graton<br />
5. Étant donné le document XML suivant...<br />
<br />
<br />
<br />
lait<br />
Je dois acheter beaucoup de lait.<br />
<br />
<br />
pomme de terre<br />
Même si la pomme de terre est mauvaise pour la santé,<br />
je dois en acheter beaucoup.<br />
<br />
<br />
et le fichier XSLT suivant...<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
()<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 232<br />
<br />
Qu’est-ce qui s’affichera à l’écran<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) lait (50 $) pomme de terre<br />
(b) – lait (50 $)<br />
– pomme de terre (20 $)<br />
(c) – lait (50 $)Je dois acheter beaucoup de lait.<br />
– pomme de terre (20 $)Même si la pomme de terre est mauvaise pour la<br />
santé, je dois en acheter beaucoup.<br />
6. Qu’est-ce qui décrit le mieux le document XSLT suivant<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il va produire la liste des balises des documents XML.<br />
(b) Il va produire des documents vides.<br />
(c) Il va produire des versions des documents XML, mais sans les balises.<br />
(d) Ce document XSLT n’est pas valable.<br />
(e) Ce document XSLT est valable, mais ne pourra pas s’exécuter.<br />
7. Si on applique le document XSLT suivant...<br />
<br />
<br />
<br />
CC BY-NC-SA
XSLT 233<br />
<br />
<br />
<br />
au document XML suivant...<br />
<br />
<br />
<strong>INF</strong> 102 Introduction avancée<br />
<strong>INF</strong> 101 Introduction<br />
Un cours d’introduction à l’informatique pour futurs<br />
ingénieurs.<br />
<strong>INF</strong> 101 Introduction<br />
Un cours d’introduction à l’informatique pour les<br />
étudiants en éducation.<br />
<strong>INF</strong> 103 Java<br />
description>Un cours d’introduction au Java<br />
<br />
Quel sera le résultat<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Le chiffre « 1 ».<br />
(b) Le chiffre « 2 ».<br />
(c) Le chiffre « 3 ».<br />
(d) Le chiffre « 4 ».<br />
(e) Un document vide.<br />
8. Qu’est-ce qui décrit le mieux le document XSLT suivant<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il donne le nom de tous les éléments dans le document.<br />
(b) Il donne le nom de tous les éléments et attributs dans le document.<br />
(c) Il donne le nom de l’élément-racine.<br />
(d) Il donne le nom de l’élément-racine et de tout attribut qu’il pourrait avoir.<br />
CC BY-NC-SA
Module 3 : Technologies XML 234<br />
9. Qu’est-ce qui décrit le mieux le document XSLT suivant<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il donne le contenu textuel (sans les balises) de tous les éléments « cours »<br />
ou « universite » du document XML.<br />
(b) Il donne « cours » si l’élément-racine est de type « cours ».<br />
(c) Il donne « cours » ou « universite », autant de fois qu’il y a d’éléments<br />
« cours » ou « universite » dans le document, et rien d’autre.<br />
(d) Il donne « cours » ou « universite », autant de fois qu’il y a d’éléments<br />
« cours » ou « universite » dans le document, et le contenu textuel de tous<br />
les autres éléments qui ne sont pas contenus dans un élément « cours » ou<br />
dans un élément « université ».<br />
10. Qu’est-ce qui décrit le mieux le document XSLT suivant<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il donne le nom de tous les éléments contenus dans l’élément-racine.<br />
(b) Il donne le nom de l’élément-racine.<br />
(c) Il donne le nom de tous les éléments du document XML.<br />
11. Qu’est-ce qui décrit le mieux le document XSLT suivant<br />
<br />
<br />
<br />
[]<br />
<br />
CC BY-NC-SA
XSLT 235<br />
<br />
<br />
<br />
[]<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il donne une liste d’identifiants, un et un seul identifiant pour chaque élément<br />
du document XML. Il n’y a pas deux identifiants égaux.<br />
(b) Il donne une liste d’identifiants, chacun étant répété deux fois.<br />
(c) Il donne une liste d’identifiants dont certains sont répétés deux fois.<br />
12. Qu’est-ce qui décrit le mieux le document XSLT suivant<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il donne le contenu textuel de tous les éléments « nom » immédiatement<br />
contenus dans des éléments « cours »<br />
(b) Il donne le contenu textuel de tous les éléments « nom » immédiatement<br />
contenus dans des éléments « cours », eux-mêmes immédiatement contenus<br />
dans des éléments « universite ».<br />
(c) Il donne un document vide.<br />
(d) Il donne le contenu textuel de tous les éléments « nom » immédiatement<br />
contenus dans des éléments « cours », eux-mêmes immédiatement contenus<br />
dans l’élément-racine « universite ».<br />
13. Qu’est-ce qui décrit le mieux le document XSLT suivant<br />
CC BY-NC-SA
Module 3 : Technologies XML 236<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il donne le nom de tous les éléments.<br />
(b) Il donne le nom de l’élément-racine.<br />
(c) Il donne un document vide.<br />
14. Qu’est-ce qui décrit le mieux le document XSLT suivant<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il donne le document XML original, où les éléments ont tous été remplacés<br />
par des éléments de nom « a ».<br />
(b) Il remplace le document XML original par un document ne contenant que<br />
des éléments « a » sans contenu textuel.<br />
(c) Il donne le document XML original.<br />
15. Quelle est la valeur de l’expression XPath « client.nom » Choisissez la bonne<br />
réponse parmi les choix suivants.<br />
(a) Une séquence de tous les éléments « client.nom » dans le contexte actuel.<br />
(b) Tous les éléments « nom » contenus dans les éléments « client » qui se<br />
trouvent dans le contexte actuel.<br />
(c) Les éléments « client » qui précèdent le contexte actuel, ainsi que les éléments<br />
« nom » qui suivent le contexte actuel.<br />
CC BY-NC-SA
XSLT 237<br />
16. Quelle est la valeur de l’expression XPath « ./client » Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) L’élément « client » qui se trouve dans le contexte actuel.<br />
(b) Une séquence de tous les éléments « client » dans le contexte actuel.<br />
(c) Une séquence de tous les éléments et attributs « client » dans le contexte<br />
actuel.<br />
17. Quelle est la valeur de l’expression XPath « client » Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) L’élément « client » qui se trouve dans le contexte actuel.<br />
(b) Une séquence de tous les éléments « client » dans le contexte actuel.<br />
(c) Une séquence de tous les éléments et attributs « client » dans le contexte<br />
actuel.<br />
18. Quelle est la valeur de l’expression XPath « /client » Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) L’élément « client » voisin de l’élément courant.<br />
(b) Le premier élément « client » rencontré dans le document.<br />
(c) L’élément-racine si celui-ci se nomme « client ».<br />
19. Quelle est la valeur de l’expression XPath « //client » Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) Le deuxième élément « client » rencontré.<br />
(b) La séquence de tous les éléments « client » du document.<br />
(c) L’élément-racine si celui-ci se nomme « client ».<br />
20. Quelle est la valeur de l’expression XPath<br />
« client[current()/@telephone=@telephone] » Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) Les éléments « client » dans l’élément courant ayant un attribut « telephone<br />
».<br />
(b) Les éléments « client » dans l’élément courant dont l’attribut « telephone »<br />
a la même valeur que l’attribut « telephone » de l’élément courant.<br />
(c) Les valeurs des attributs « telephone » de tous les éléments « client » dans<br />
l’élément courant.<br />
21. Quelle est la valeur de l’expression XPath « client/*|client/@* » Choisissez la<br />
bonne réponse parmi les choix suivants.<br />
(a) Tous les éléments contenus dans des éléments « client » dans le contexte<br />
actuel.<br />
(b) Tous les éléments et attributs contenus dans des éléments « client » dans le<br />
contexte actuel.<br />
CC BY-NC-SA
Module 3 : Technologies XML 238<br />
(c) L’ensemble des attributs contenus dans des éléments « client » enfant d’éléments<br />
contenus dans des éléments « client ».<br />
22. Quelle est la valeur de l’expression XPath « *[@telephone] » Choisissez la<br />
bonne réponse parmi les choix suivants.<br />
(a) La valeur de l’attribut « telephone » de l’élément courant.<br />
(b) L’élément courant s’il contient un attribut « telephone ».<br />
(c) Tous les éléments dans le contexte courant ayant un attribut « telephone ».<br />
23. Quelle est la valeur de l’expression XPath « (vendeur/client)[2] » Choisissez la<br />
bonne réponse parmi les choix suivants.<br />
(a) Le deuxième élément « client » dans la liste des éléments « client » contenus<br />
dans des éléments « vendeur ».<br />
(b) Le deuxième élément « vendeur » dans la liste des éléments « client »<br />
contenus dans des éléments « vendeur ».<br />
(c) Le deuxième élément « client » contenu dans un élément « vendeur ».<br />
24. Quelle est la valeur de l’expression XPath « vendeur/client[2] » Choisissez la<br />
bonne réponse parmi les choix suivants.<br />
(a) Le deuxième élément « client » dans la liste des éléments « client » contenus<br />
dans des éléments « vendeur ».<br />
(b) Le deuxième élément « vendeur » dans la liste des éléments « client »<br />
contenus dans des éléments « vendeur ».<br />
(c) Le deuxième élément « client » contenu dans un élément « vendeur ».<br />
25. Quelle est la valeur de l’expression XPath « vendeur[2]/client[1] » Choisissez<br />
la bonne réponse parmi les choix suivants.<br />
(a) Le second élément « client » contenu dans le premier élément « vendeur »<br />
rencontré.<br />
(b) Est équivalent à « vendeur/vendeur/client[1] ».<br />
(c) Le premier élément « client » contenu dans le deuxième élément « vendeur<br />
».<br />
26. Est-ce que « //p=//c » et « //c=//z » implique « //p=//z » Choisissez la bonne<br />
réponse parmi les choix suivants.<br />
(a) Oui<br />
(b) Non.<br />
27. Que signifie XSL Choisissez la bonne réponse parmi les choix suivants.<br />
(a) eXtensible Stylesheet Language<br />
(b) eXtensible Style Language<br />
(c) eXtensible Style Laboratory<br />
CC BY-NC-SA
XSLT 239<br />
28. Comment fait-on appel à un fichier XSLT Choisissez la bonne réponse parmi<br />
les choix suivants.<br />
(a) <br />
(b) <br />
(c) <br />
29. Que vaut « //p=//p » Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
(c) Aucune de ces réponses.<br />
30. Le XSLT transforme les documents XML en d’autres documents XML. Choisissez<br />
la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
31. Est-ce que « //p!=’jean’ » et « not(//p=’jean’) » ont la même signification Choisissez<br />
la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
32. Le XSLT ne s’applique qu’à des fichiers XML valide. Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
33. Étant donné le fichier XML suivant.<br />
<br />
<br />
<br />
Jean<br />
Coutu<br />
<br />
<br />
Quel sera le résultat de la transformation XSLT suivante<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 240<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Rien du tout<br />
(b) Jean<br />
(c) <br />
Jean<br />
Coutu<br />
<br />
(d) Jean Coutu<br />
34. Étant donné le fichier XML suivant.<br />
<br />
<br />
<br />
Jean<br />
Coutu<br />
<br />
<br />
Quel sera le résultat de la transformation XSLT suivante<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Rien du tout<br />
(b) Jean<br />
(c) Jean Coutu<br />
(d) <br />
Jean<br />
Coutu<br />
<br />
35. Étant donné le fichier XML suivant.<br />
<br />
<br />
<br />
Jean<br />
Coutu<br />
CC BY-NC-SA
XSLT 241<br />
<br />
<br />
Marie<br />
Vanasse<br />
<br />
<br />
Pierre<br />
Coutu<br />
<br />
<br />
Quel sera le résultat de la transformation XSLT suivante<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Rien du tout<br />
(b) Jean Coutu<br />
Marie Vanasse<br />
Pierre Coutu<br />
(c) Jean Coutu<br />
36. Étant donné le fichier XML suivant.<br />
<br />
<br />
<br />
Jean<br />
Coutu<br />
<br />
<br />
Marie<br />
Vanasse<br />
<br />
<br />
Pierre<br />
Coutu<br />
<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 242<br />
Quel sera le résultat de la transformation XSLT suivante<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Rien du tout<br />
(b) Jean Coutu<br />
(c) Pierre Coutu<br />
37. Étant donné le fichier XML suivant.<br />
<br />
<br />
<br />
Jean<br />
Coutu<br />
<br />
<br />
Marie<br />
Vanasse<br />
<br />
<br />
Pierre<br />
Coutu<br />
<br />
<br />
Quel sera le résultat de la transformation XSLT suivante<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
CC BY-NC-SA
XSLT 243<br />
(a) Rien du tout<br />
(b)<br />
(c)<br />
<br />
Jean<br />
Coutu<br />
<br />
<br />
Jean<br />
Coutu<br />
<br />
Marie<br />
Vanasse<br />
<br />
38. Est-ce qu’il y a une différence entre ces deux expressions XPath: "vendeur/prenom<br />
= ’Jean’ and vendeur/nom = ’Coutu’" et "vendeur[prenom = ’Jean’<br />
and nom = ’Coutu’]" Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Non aucune.<br />
(b) Oui, mais pas toujours.<br />
(c) Oui, ils sont toujours différents.<br />
39. Que vaut l’expression XPath « //a[1]=current() » Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) Vrai si le nœ courant est le premier élément a rencontré, faux autrement.<br />
(b) Vrai si le nœ courant est le premier élément a rencontré au sein d’un même<br />
élément, faux autrement.<br />
(c) Aucune de ces réponses.<br />
3.2.53 Solutions<br />
1. (a) (Bonne réponse) Oui, c’est correct : le résultat sera un document vide<br />
(contenant un espace).<br />
(b) Non. Ce n’est pas un document XML bien formé, car il n’y a pas d’élémentracine.<br />
Un document XSLT doit être un document XML bien formé.<br />
(c) Non. Bien qu’il s’agisse d’un document XML bien formé, l’élément-racine<br />
« text » n’est pas autorisé, il devrait être « transform » ou bien « stylesheet<br />
».<br />
(d) (Bonne réponse) Oui. Il s’agit d’un document XML bien formé et<br />
l’élément-racine est « transform », ce qui est autorisé.<br />
2. (a) (Bonne réponse) Effectivement. Le modèle « employe » sera utilisé, mais<br />
pas le modèle « prenom ». Il y aura bel et bien un espace entre « Jean »<br />
et « Graton », parce qu’il y a un retour de chariot entre les éléments « prenom<br />
» et « nom ». Par défaut, les espaces et les retours de chariot entre les<br />
CC BY-NC-SA
Module 3 : Technologies XML 244<br />
éléments ne sont pas ignorés dans le document XML qui est traité, mais<br />
ils le sont dans le document XSLT. Un retour de chariot, en HTML ou<br />
XHTML, s’affiche à l’écran comme un espace.<br />
(b) Non. L’instruction « value-of » va reproduire le contenu de l’élément,<br />
moins les balises, mais en respectant les espaces entre les éléments. Il<br />
n’y aurait pas d’espace entre les éléments si le document XML avait pris<br />
le forme « JeanGraton » (sans espace<br />
entre les deux éléments).<br />
(c) Non. Le modèle « prénom » n’est pas utilisé.<br />
(d) Non. Le modèle « employe » sera utilisé; le texte sera donc en caractères<br />
gras.<br />
(e) Non. Le modèle « employe » sera utilisé; il n’y aura donc pas d’italique.<br />
(f) Non. Le modèle « employe » sera utilisé; on n’aura donc pas un mélange<br />
de texte normal et de texte en caractères gras.<br />
(g) Non. Le modèle « employe » sera utilisé et « value-of » donnera le contenu<br />
textuel sans les balises.<br />
(h) Non. Le modèle « employe » sera utilisé; on n’aura donc pas de texte en<br />
italique.<br />
(i) Non. Le modèle « employe » sera utilisé; « value-of » sélectionne tout le<br />
texte, et non seulement « Graton ».<br />
3. (a) Non.<br />
(b) Non.<br />
(c) Non.<br />
(d) Non.<br />
(e) Non.<br />
(f) Non.<br />
(g) (Bonne réponse) Effectivement. Le modèle « employe » est appelé et luimême<br />
appelle le modèle « prenom ».<br />
(h) Non.<br />
4. (a) Non.<br />
(b) Non.<br />
(c) Non.<br />
(d) Non.<br />
(e) (Bonne réponse) Effectivement. Comme il n’y a pas de modèle pour l’élément<br />
« nom », le modèle par défaut s’applique et le contenu du texte est<br />
reproduit. Par contre, le modèle « prenom » est utilisé.<br />
(f) Non.<br />
(g) Non.<br />
(h) Non.<br />
CC BY-NC-SA
XSLT 245<br />
5. (a) Non. Le modèle « budget » s’applique; il doit y avoir création d’une liste.<br />
(b) (Bonne réponse) Effectivement. Le modèle « budget » s’applique et il y a<br />
création d’une liste.<br />
(c) Non. Les éléments « item » sont traités par le modèle « item » qui n’inclut<br />
pas l’élément « description ».<br />
6. (a) Non. Au contraire, car « value-of » enlève toutes les balises.<br />
(b) Non. Le modèle « b » s’applique.<br />
(c) (Bonne réponse) Exactement. Le modèle « b » s’applique, après l’application<br />
du modèle par défaut et du modèle « a ».<br />
(d) Il s’agit d’un document XSLT valable.<br />
(e) L’utilisation de « mode » est effectivement dangereuse et peut mener à des<br />
boucles sans fin, mais ce n’est pas le cas pour ce document.<br />
7. (a) Le modèle compte le nombre d’éléments « cours » dans l’élément-racine<br />
et il y a plus d’un élément « cours ».<br />
(b) Le modèle compte le nombre d’éléments « cours » dans l’élément-racine<br />
et il y a plus de deux éléments « cours ».<br />
(c) (Bonne réponse) Comme le modèle « * » ne s’applique qu’à l’élémentracine<br />
qui contient 3 éléments « cours », le résultat sera effectivement le<br />
chiffre 3.<br />
(d) Il y a bien 4 éléments « cours », mais le modèle « * » ne s’applique qu’à<br />
l’élément-racine qui lui contient 3 éléments « cours ».<br />
(e) Non. L’instruction « » sera exécutée<br />
et le résultat doit être un nombre.<br />
8. (a) Le modèle « * » ne s’applique qu’à l’élément-racine.<br />
(b) Le modèle « * » ne s’applique qu’à l’élément-racine et la fonction « name »,<br />
appliquée à un élément, ne donne que le nom de l’élément.<br />
(c) (Bonne réponse) C’est vrai. Le modèle « * » ne s’applique qu’à l’élémentracine.<br />
(d) La fonction « name » appliquée à un élément ne donne que le nom de<br />
l’élément.<br />
9. (a) Non. Si un élément « cours » ou « universite » est rencontré, seul son nom<br />
s’affiche.<br />
(b)<br />
(c) Non. La règle par défaut s’applique aux autres éléments et leur contenu<br />
textuel sera affiché.<br />
(d) (Bonne réponse) Exactement. La règle par défaut s’applique à tous les éléments,<br />
sauf aux éléments « cours » dont on ne visite pas les nœuds.<br />
10. (a) Non, car « / » est le nœud-racine (le document lui-même) et non pas<br />
l’élément-racine.<br />
CC BY-NC-SA
Module 3 : Technologies XML 246<br />
(b) (Bonne réponse) Effectivement, car « / » est le nœud-racine (le document<br />
lui-même) qui ne contient qu’un seul élément : l’élément-racine.<br />
(c) Non. Comme nous avons une règle qui est appliquée au nœud-racine, le<br />
traitement du processeur XSLT va s’arrêter immédiatement après l’application<br />
du seul modèle contenu dans le document XSLT.<br />
11. (a) Non. À cause de l’utilisation du « mode », certains identifiants sont répétés<br />
deux fois.<br />
(b) Non. Pour l’élément-racine, il n’est pas répété deux fois.<br />
(c) (Bonne réponse) Oui. Ils sont tous répétés deux fois, sauf pour l’élémentracine.<br />
12. (a) Non. Si un élément « cours » était contenu dans un autre élément « cours »,<br />
il ne serait jamais visité.<br />
(b) Non. Si l’élément « universite » n’est pas l’élément-racine, il ne sera jamais<br />
visité.<br />
(c) Seulement si les éléments « cours » rencontrés dans les éléments « universite<br />
» n’ont pas de contenu textuel dans leurs éléments « nom ».<br />
(d) (Bonne réponse) Effectivement. Il n’y a qu’un seul cas où d’autres éléments<br />
que l’élément-racine sont visités et c’est lorsque l’élément-racine est l’élément<br />
« universite ».<br />
13. (a) (Bonne réponse) Effectivement, car « . » n’est que l’élément courant (donc<br />
un ensemble d’un seul élément); « count(.) » vaut donc « 1 ».<br />
(b) Oui, mais aussi le nom des autres éléments.<br />
(c) Comme « count(.) » vaut toujours « 1 », c’est plutôt le nom de tous les<br />
éléments qui est donné.<br />
14. (a) Non. Le contenu textuel ne sera jamais modifié.<br />
(b) (Bonne réponse) Effectivement. Le nom des éléments originaux est donné<br />
par la valeur de l’attribut « valeur ».<br />
(c) Absolument pas : il n’y a plus que des éléments « a ».<br />
15. (a) (Bonne réponse) Effectivement. Le point « . » perd ici sa signification de<br />
« contexte actuel », car il fait partie d’une chaîne de caractères désignant<br />
un nom d’élément.<br />
(b) Non, ce serait « nom/client ».<br />
(c) Cette explication n’a pas de sens.<br />
16. (a) Il pourrait y avoir aucun ou plusieurs éléments « client ».<br />
(b) (Bonne réponse) Effectivement, le contexte pouvant être l’élément courant,<br />
par exemple. La séquence d’éléments peut être vide.<br />
(c) Non. Les attributs de nom « client » s’obtiennent avec la syntaxe<br />
« @client ».<br />
17. (a) Il pourrait y avoir aucun ou plusieurs éléments « client ».<br />
CC BY-NC-SA
XSLT 247<br />
(b) (Bonne réponse) Effectivement, le contexte pouvant être l’élément courant,<br />
par exemple. La séquence d’éléments peut être vide. On note que c’est la<br />
même signification que pour l’expression XPath « ./client ».<br />
(c) Non. Les attributs de nom « client » s’obtiennent avec la syntaxe<br />
« @client ».<br />
18. (a) Non, c’est plutôt vers l’élément-racine qu’on pointe.<br />
(b) Ce serait plutôt « (//client)[1] ».<br />
(c) (Bonne réponse) Vrai. Il retourne un ensemble vide dans le cas contraire.<br />
19. (a) Non, ce serait plutôt « client[2] ».<br />
(b) (Bonne réponse) Effectivement. S’il n’y en a pas, cela donne un ensemble<br />
vide.<br />
(c) Non, ce serait plutôt « /client ».<br />
20. (a) Non, ce serait plutôt « client[@telephone] ».<br />
(b) (Bonne réponse) Effectivement. On pourrait aussi écrire cette expression<br />
« client[current()/@telephone=./@telephone] ». Il s’agit d’un exemple où<br />
« current() » n’a pas la même valeur que « . ».<br />
(c) Ce serait plutôt « client/@telephone ».<br />
21. (a) Ce serait alors tout simplement « client/* ».<br />
(b) (Bonne réponse) Effectivement. S’il n’y a rien qui correspond, un ensemble<br />
vide est donné.<br />
(c) Ce serait alors « client/*/client/@* ».<br />
22. (a) Ce serait tout simplement « @telephone ».<br />
(b) Ce serait plutôt « .[@telephone] ».<br />
(c) (Bonne réponse) Effectivement, ou un ensemble vide si ça ne s’applique<br />
pas.<br />
23. (a) (Bonne réponse) Effectivement. S’il n’y a pas un tel élément, un ensemble<br />
vide est donné.<br />
(b) Non, un élément « client » est donné.<br />
(c) Non, ce serait alors « vendeur/client[2] ».<br />
24. (a) Non, ce serait plutôt « (vendeur/client)[2] ».<br />
25. (a)<br />
(b) Non, un élément « client » est donné.<br />
(c) (Bonne réponse)<br />
(b) Non. Ce type d’abréviation n’existe pas en XPath.<br />
(c) (Bonne réponse) Effectivement. Si cet élément n’existe pas, un ensemble<br />
vide est obtenu.<br />
26. (a) La première égalité est vraie s’il y a un élément p dont le contenu est égal<br />
au contenu d’un élément c, et la seconde est vraie s’il y a un élément de c<br />
qui est égal à un élément z, ce qui n’implique pas qu’il existe un élément p<br />
qui soit égal à un élément z<br />
CC BY-NC-SA
Module 3 : Technologies XML 248<br />
(b) (Bonne réponse) Effectivement.<br />
27. (a) (Bonne réponse) Effectivement.<br />
(b) Non.<br />
(c) Non.<br />
28. (a) Non.<br />
(b) (Bonne réponse) Effectivement.<br />
(c) Non.<br />
29. (a) Seulement s’il existe au moins un élément p dans le document.<br />
(b) Seulement s’il n’existe pas d’élément p dans le document.<br />
(c) (Bonne réponse) Effectivement. L’expression //p donne une liste d’éléments.<br />
La comparaison entre deux listes est vraie s’il existe au moins un<br />
élément dans la première liste égal à un élément dans la seconde liste. Cela<br />
est vrai si et seulement s’il y a au moins un élément p.<br />
30. (a) Non. Le XSLT n’a pas à produire du XML. On peut déclarer que l’on<br />
souhaite produire du texte avec une telle instruction : .<br />
(b) (Bonne réponse) Effectivement.<br />
31. (a) Non. La première expression est vraie s’il y a un élément p dont le contenu<br />
est différent de ’jean’, alors que la seconde est vraie seulement si tous les<br />
éléments sont est différents de ’jean’.<br />
(b) (Bonne réponse) Effectivement.<br />
32. (a) Non. Il suffit que le fichier XML soit bien formé.<br />
(b) (Bonne réponse) Effectivement.<br />
33. (a) Non.<br />
(b) La variable sélectionne plutôt l’élément vendeur.<br />
(c) Il s’agit bien du contenu de la variable, mais l’instruction value-of va extraire<br />
le contenu du texte.<br />
(d) (Bonne réponse) Correct.<br />
34. (a) Non.<br />
(b) La variable sélectionne plutôt l’élément vendeur.<br />
(c) Non, ce n’est pas l’effet de l’instruction copy-of.<br />
(d) (Bonne réponse) Effectivement, l’instruction copy-of donne une copie intégrale<br />
du contenu de la variable.<br />
35. (a) Non.<br />
(b) Ce n’est pas l’effet de l’instruction value-of.<br />
(c) (Bonne réponse) Effectivement, seul le contenu textuel du premier élément<br />
vendeur sera donné.<br />
36. (a) Non.<br />
CC BY-NC-SA
CSS 249<br />
(b) Non, seul le dernier élément vendeur est sélectionné, car lui seul est précédé<br />
par un élément vendeur ayant un sous-élément nom de même valeur.<br />
(c) (Bonne réponse) Effectivement, seul le dernier élément vendeur est sélectionné.<br />
37. (a) Non.<br />
(b) Non, le deuxième élément est aussi sélectionné.<br />
(c) (Bonne réponse) Effectivement, le dernier élément n’est pas sélectionné.<br />
38. (a) Non.<br />
(b) Non. Ils sont toujours différents, mais si on les utilise dans une expression<br />
conditionnelle (xsl:if), ils peuvent être équivalents.<br />
(c) (Bonne réponse) Effectivement, la première est vraie si on trouve un élément<br />
vendeur contenant un élément prenom contenant le texte Jean et un<br />
élément nom contenant le nom Coutu, sinon elle est fausse. La seconde expression<br />
sélectionne les éléments correspondants à ce critère s’ils existent.<br />
39. (a) Non. L’égalité compare plutôt le contenu des éléments, pas la position dans<br />
le document.<br />
(b) Non. L’égalité compare plutôt le contenu des éléments, pas la position au<br />
sein d’un élément.<br />
(c) (Bonne réponse) Effectivement, l’expression n’a la valeur vraie que si l’élément<br />
courant est un élément « a » ayant le même contenu que le premier<br />
élément « a » dans le document.<br />
3.3 CSS<br />
3.3.1 Objectif<br />
Utiliser des transformations XSLT et des instructions CSS.<br />
3.3.2 Activité<br />
Lisez le texte qui suit, puis répondez au questionnaire d’autoévaluation. Ce texte porte<br />
sur les CSS (Cascading StyleSheets).<br />
3.3.3 Qu’est-ce que les CSS<br />
La norme CSS a d’abord été proposée par Håkon Lie du CERN en Suisse en 1994<br />
(environ 4 ans après l’apparition de la première page web). Cette norme a été acceptée<br />
comme recommandation officielle du W3C deux ans plus tard, soit en 1996, et la seconde<br />
version (CSS 2.0) est devenue une recommandation du W3C l’année suivante,<br />
CC BY-NC-SA
Module 3 : Technologies XML 250<br />
soit en 1997. Une troisième version est en développement. À l’origine, les instructions<br />
CSS étaient destinées uniquement à indiquer aux navigateurs comment présenter<br />
le HTML (couleurs, polices, etc.); on s’est vite rendu compte qu’on pouvait aussi<br />
l’appliquer au XML et on considère maintenant les CSS comme une technologie qui<br />
s’applique autant au HTML qu’au XML (et aussi, évidemment, au XHTML).<br />
Nous avons vu que le XSLT permettait de transformer du XML en HTML pour l’affichage<br />
dans un navigateur. En général, le XSLT permet de transformer tout document<br />
XML en un autre format (HTML, XML ou autre).<br />
Un fichier CSS est beaucoup plus limité dans la mesure où il ne transforme pas le document<br />
XML. Il permet seulement de spécifier comment le contenu du document XML<br />
sera affiché. Le fichier XSLT est un outil de transformation, alors que le fichier CSS<br />
est un outil de formatage. Un document CSS permet de rendre un document XML plus<br />
lisible. D’un autre côté, le fichier CSS permet de contrôler avec beaucoup de finesse<br />
la présentation du document XML, alors qu’il peut être difficile et fastidieux d’obtenir<br />
le même résultat en XSLT, sans utiliser les CSS. Les fichiers CSS tendent aussi à être<br />
plus simples que les fichiers XSLT; il peut donc être plus facile de les modifier et de<br />
les garder à jour. Finalement, on peut utiliser à la fois des fichiers CSS et des fichiers<br />
XSLT, en combinant les avantages des deux (présentation et transformation).<br />
3.3.4 Point de vue critique<br />
CSS est un langage déclaratif relativement limité. Il n’est pas possible de définir des<br />
variables, des fonctions ou de faire de l’arithmétique en CSS. On peut, par contre,<br />
redéfinir à volonté des règles, ce qui peut rendre le comportement final difficile à comprendre<br />
pour un humain. Il n’est pas facile, en CSS, de détecter le navigateur utilisé<br />
alors que tous les navigateurs ne traitent pas les règles de la même façon.<br />
3.3.5 Notions de base<br />
Pour l’essentiel, le langage CSS prend la forme d’une succession d’affirmations de la<br />
forme élément propriété: valeur; autrepropriété: valeur;. Il s’agit d’une syntaxe très<br />
simple.<br />
Supposons un document XML comme celui-ci :<br />
<br />
<br />
<br />
Jean Rochond<br />
10.10<br />
Achat d’ordinateur<br />
<br />
<br />
Madeleine Bédard<br />
CC BY-NC-SA
CSS 251<br />
20.10<br />
Achat d’un crayon<br />
<br />
<br />
Certains navigateurs affichent le XML brut sans formatage, ce qui n’est pas très accessible.<br />
D’autres navigateurs affichent le document sans les balises :<br />
Jean Rochond<br />
10.10<br />
Achat d’ordinateur<br />
Madeleine Bédard<br />
20.10<br />
Achat d’un crayon<br />
Ce document XML est difficile à lire, même sans les balises, surtout si vous n’êtes pas<br />
un expert en XML. Sans le transformer, il est possible de l’afficher avec de la couleur<br />
ou de l’italique, comme ceci :<br />
– Jean Rochond 10.10 Achat d’ordinateur<br />
– Madeleine Bédard 20.10 Achat d’un crayon<br />
Voilà qui est nettement plus lisible! Nous pouvons obtenir ce résultat à l’aide du fichier<br />
CSS suivant :<br />
facture {<br />
display: block;<br />
margin-bottom: 30pt;<br />
}<br />
montant {<br />
color: red;<br />
}<br />
raison {<br />
display: block;<br />
font-style: italic;<br />
margin-left: 1cm;<br />
}<br />
CC BY-NC-SA
Module 3 : Technologies XML 252<br />
Pour vérifier que c’est bien le cas, il suffit de créer un fichier « chap12.css » avec le<br />
contenu CSS précédent et de modifier le fichier XML en y ajouter une ligne pointant<br />
vers le fichier CSS (), comme<br />
ceci :<br />
<br />
<br />
<br />
<br />
Jean Rochond<br />
10.10<br />
Achat d’ordinateur<br />
<br />
<br />
Madeleine Bédard<br />
20.10<br />
Achat d’un crayon<br />
<br />
<br />
Si le fichier XML est dans le même répertoire que le fichier CSS, Firefox devrait vous<br />
présenter le document XML avec le montant en rouge et le commentaire (raison) en<br />
italique, comme nous l’avons présenté plus haut.<br />
Examinons maintenant les différentes instructions du fichier CSS.<br />
– L’instruction « display: block; » déclare que l’élément devrait former son propre<br />
paragraphe. L’instruction « display: none; » rend l’élément invisible.<br />
– Les instructions « margin-bottom: 30pt; » et « margin-left: 1cm; » définissent des<br />
marges en bas et à gauche de 30 points et de 1 cm respectivement.<br />
– L’instruction « color: red; » affirme que le contenu de l’élément devrait être écrit en<br />
rouge, alors que « font-style: italic; » nous dit que le texte de l’élément devrait être<br />
en italique. On pourrait aussi contrôler la couleur de fond avec un instruction comme<br />
« background-color:red ».<br />
Dans l’éventualité où nous voulons choisir une couleur très précise, et non les couleurs<br />
courantes comme « red », « green », « blue », « yellow », « white », « black », etc., nous<br />
pouvons la spécifier selon sa composition avec les couleurs de base (« red », « green ,<br />
« blue ») avec une instruction comme « background-color:rgb(200,200,200); », où<br />
chaque valeur numérique est entre 0 et 255 inclusivement.<br />
CC BY-NC-SA
CSS 253<br />
3.3.6 Contenu en ligne ou en bloc <br />
Par défault, les éléments s’affichent en ligne, un à la suite de l’autre. On peut contrôler<br />
comment s’affiche un élément avec la propriété « display » qui peut prendre plusieurs<br />
valeurs dont celles-ci :<br />
– « display: none »: l’élément ne doit pas s’afficher. Par exemple, l’instruction « imgdisplay:<br />
none; » fait en sorte que les images ne s’affichent plus en HTML. Il est<br />
fréquent qu’avec du ECMAScript, on cache et affiche tour à tour des éléments pour<br />
donner l’impression que la page est dynamique.<br />
– « display: inline »: l’élément s’affiche à la suite du précédent comme s’il s’agissait<br />
d’un caractère.<br />
– « display: block »: l’élément s’affiche dans un bloc distinct, comme un nouveau<br />
paragraphe, par exemple.<br />
– « display: list-item »: l’élément s’affiche comme un élément d’une liste.<br />
Voici un exemple :<br />
p { display: block }<br />
strong { display: inline }<br />
li { display: list-item }<br />
img { display: none }<br />
On peut aussi définir la propriété « float » d’un élément qui lui permet de sortir du flot<br />
normal des éléments et de se placer à gauche ou à droite. Par exemple, une image en<br />
XHTML s’affiche normalement comme un bloc. On peut forcer l’image à s’intégrer<br />
au paragraphe suivant avec l’instruction « float: right » ou « float: left ». On peut aussi<br />
utiliser la propriété « float » pour créer plusieurs colonnes de texte comme dans un journal.<br />
Je vous invite à faire différentes expériences pour mieux comprendre l’utilisation<br />
de cette instruction.<br />
3.3.7 Centrer un élément<br />
Bien qu’on puisse changer la justification du texte avec une instruction comme « textalign:<br />
center », centrer un élément requiert plutôt une manipulation des marges avec la<br />
valeur spéciale « auto », comme dans cet exemple :<br />
p { width: 5cm;<br />
margin-left: auto;<br />
margin-right: auto;}<br />
Il aurait été sans doute préférable d’avoir une instruction dédiée pour centrer les éléments<br />
comme il s’agit d’une opération courante.<br />
CC BY-NC-SA
Module 3 : Technologies XML 254<br />
3.3.8 Les commentaires<br />
Tout comme en Java, on peut ajouter des commentaires à un fichier CSS qui sont systématiquement<br />
ignorés par la machine. Un bloc de commentaire débute par « /* » et se<br />
termine par « */ ».<br />
/* mon fichier css */<br />
montant {<br />
color: red; /* la couleur rouge */<br />
}<br />
3.3.9 Sélectionner le premier caractère ou la première ligne<br />
On peut sélectionner la première ligne d’un élément s’affichant en mode « block » et<br />
le premier caractère de tout élément avec les sélecteurs « :first-line » et :« :first-letter »<br />
respectivement. Voici un exemple :<br />
p:first-line {text-transform: uppercase}<br />
p:first-letter {font-size: 200%;float: left;}<br />
3.3.10 Ajouter du contenu avant et après un élément<br />
Avec CSS, on peut demander qu’une certaine chaîne de caractères apparaisse avant<br />
ou après un élément. Par exemple, si on veut ajouter automatiquement des guillemets<br />
avant et après un élément, on peut procéder comme ceci :<br />
blockquote:before {content:"«";}<br />
blockquote:after {content:"»";}<br />
Nous ne sommes pas limités au texte cependant. Il est possible, par exemple, d’ajouter<br />
automatiquement une image avant chaque élément comme ceci :<br />
p:before {content:url("monimage.png";}<br />
3.3.11 Qu’est-ce qu’un pseudo-élément<br />
Les instructions first-line, first-letter, before et after que nous venons de présenter sont<br />
les principaux exemples de pseudo-éléments.<br />
CC BY-NC-SA
CSS 255<br />
3.3.12 Sélecteurs d’intéraction<br />
Certains sélecteurs n’agissent qu’en réponse aux comportements de l’utilisateur. Par<br />
exemple, le sélecteur « p:hover » sélectionne les éléments « p » qui sont survolés par<br />
le curseur de la souris. Il existe plusieurs sélecteurs d’intéraction dont « :link » (lien<br />
non visité), « :visited » (lien visité), « active » (l’utilisateur utilise un élément), « :focus<br />
» (l’élément est sélectionné par l’utilisateur). On peut aussi combiner les sélecteurs<br />
comme dans cet exemple : « a:hover:focus ». On appelle aussi ces sélecteurs de pseudoclasses.<br />
3.3.13 Règles par défaut<br />
Dans le cas du HTML ou du XHTML, les navigateurs utilisent une liste de règles par<br />
défaut. Ces règles vont varier d’un navigateur à l’autre, mais voici un exemple de règles<br />
utilisées par Firefox :<br />
html, div {<br />
display: block;<br />
}<br />
body {<br />
display: block;<br />
margin: 8px;<br />
}<br />
p, dl, multicol {<br />
display: block;<br />
margin: 1em 0;<br />
}<br />
blockquote {<br />
display: block;<br />
margin: 1em 40px;<br />
}<br />
h1 {<br />
display: block;<br />
font-size: 2em;<br />
font-weight: bold;<br />
margin: .67em 0;<br />
}<br />
h2 {<br />
display: block;<br />
font-size: 1.5em;<br />
CC BY-NC-SA
Module 3 : Technologies XML 256<br />
}<br />
font-weight: bold;<br />
margin: .83em 0;<br />
pre {<br />
display: block;<br />
white-space: pre;<br />
margin: 1em 0;<br />
}<br />
b, strong {<br />
font-weight: bolder;<br />
}<br />
i, cite, em, var, dfn {<br />
font-style: italic;<br />
}<br />
u, ins {<br />
text-decoration: underline;<br />
}<br />
s, strike, del {<br />
text-decoration: line-through;<br />
}<br />
big {<br />
font-size: larger;<br />
}<br />
small {<br />
font-size: smaller;<br />
}<br />
sub {<br />
vertical-align: sub;<br />
font-size: smaller;<br />
line-height: normal;<br />
}<br />
sup {<br />
vertical-align: super;<br />
font-size: smaller;<br />
line-height: normal;<br />
CC BY-NC-SA
CSS 257<br />
}<br />
ul, menu, dir {<br />
display: block;<br />
list-style-type: disc;<br />
margin: 1em 0;<br />
}<br />
ol {<br />
display: block;<br />
list-style-type: decimal;<br />
margin: 1em 0;<br />
}<br />
li {<br />
display: list-item;<br />
}<br />
area, base, basefont, head, meta, script, style, title,<br />
noembed, param {<br />
display: none;<br />
}<br />
3.3.14 L’astérisque<br />
L’astérisque nous permet d’appliquer une règle à tous les éléments, comme dans cet<br />
exemple : « * color:red; ».<br />
3.3.15 Sélection sur la base des attributs<br />
Avec les CSS, en utilisant les crochets, nous pouvons sélectionner tous les éléments<br />
ayant un attribut donné. Par exemple, l’instruction « *[monattribut] color:red; » mettra<br />
en rouge tous les éléments ayant un attribut portant le nom « monattribut ». Nous<br />
pouvons aussi, bien sûr, limiter la sélection à des éléments portant un nom donné<br />
comme dans cet exemple : « maman[monattribut] color:red; » où les éléments « maman<br />
» ayant un attribut « monattribut » seront en rouge. Finalement, nous pouvons de<br />
plus limiter la sélection à des attributs ayant une certaine valeur, comme dans « maman[monattribut="papa"]<br />
color:red; ».<br />
Il arrive fréquemment qu’une valeur d’attribut contiennent plusieurs mots, comme dans<br />
« ». Pour séléctionner tous les élément dont<br />
un attribut contiennent un mot particulier, on remplace « = » par « = » comme dans<br />
l’instruction « *[pays ="Canada"] color:red; » qui mettra en rouge tout élément dont<br />
l’attribut « pays » contient le mot « Canada ». Les mots doivent être séparés par<br />
CC BY-NC-SA
Module 3 : Technologies XML 258<br />
des espaces. Dans l’éventualité où les mots sont séparés par des tirets, comme dans<br />
« », on peut obtenir le même résultat avec « |= »<br />
comme dans « *[pays|="Canada"] color:red; ».<br />
3.3.16 Les espaces de noms<br />
Les espaces de noms ne sont pas supportés en CSS 1 ou CSS 2. Ainsi « monelement<br />
color:red; » met en rouge le contenu de tous les éléments monelement, peu importe leur<br />
espace de noms. Il est incorrect d’utiliser la syntaxe « xhtml:monelement color:red; ».<br />
3.3.17 Sélection de la langue<br />
On a vu qu’il est possible en XML de spécifier la langue dans laquelle est écrit un texte<br />
avec l’attribut « xml:lang. ». On pourrait penser que pour mettre le texte déclaré comme<br />
étant en anglais en rouge, il suffirait de l’instruction « *[lang="fr"] color:red; », mais<br />
que se passera-t-il si on a utilisé un code de région avec la langue comme « fr-CA »<br />
Une solution plus élégante consiste alors à utiliser la sélection sur la langue avec une<br />
instruction comme « :lang(en) color:red; ». Une alternative est d’utiliser « *[lang|="fr"]<br />
color:red; ».<br />
3.3.18 Sélection de plusieurs éléments<br />
Supposons maintenant que nous voulions afficher en rouge tous les éléments « facture »<br />
et « maison ». Nous pouvons le faire avec deux instructions :<br />
facture { color:red;}<br />
maison { color:red;}<br />
En pratique cependant, il est préférable d’utiliser la virgule pour grouper les éléments,<br />
comme ceci :<br />
facture, maison { color:red;}<br />
Les deux instructions et cette dernière forme sont exactement équivalentes.<br />
3.3.19 Sélection sur la base de la relation entre les éléments<br />
Supposons maintenant que nous ne voulions pas afficher tous les éléments « personne »<br />
en rouge, mais seulement les éléments « personne » contenus dans un élément « facture<br />
». Nous obtiendrons ce résultat en plaçant les deux noms d’élément côte-à-côte<br />
(séparé par un espace). Ainsi, l’instruction « facture personne color:red; » affichera<br />
CC BY-NC-SA
CSS 259<br />
en rouge tous les éléments « personne » contenus dans un élément « facture », comme<br />
dans l’exemple qui suit :<br />
<br />
<br />
<br />
<br />
Jean Rochond<br />
<br />
<br />
ou dans ce deuxième exemple...<br />
<br />
<br />
<br />
<br />
Jean Rochond<br />
<br />
<br />
Nous pourrions vouloir que seuls les éléments immédiatement contenus dans l’élément<br />
« facture », comme dans le premier exemple, soient en rouge, et non pas ceux qui<br />
sont contenus dans des éléments eux-mêmes dans un élément « facture » (deuxième<br />
exemple). Nous pouvons obtenir ce résultat avec l’instruction « facture > personne<br />
color:red; ».<br />
En somme, la règle « a b color:red; » s’applique à l’élément « b », si l’élément<br />
« b » est contenu dans un élément « a » comme dans « » ou<br />
« ».<br />
Par contre, la règle « a > b color:red; » s’applique à l’élément « b », si et seulement<br />
si l’élément « b » est immédiatement contenu dans un élément « a », comme dans<br />
« ». Elle ne s’applique toutefois pas si « b » est contenu dans un<br />
élément lui-même contenu dans « a », comme dans « ».<br />
Supposons maintenant, dans l’exemple suivant, que nous voulions indenter le premier<br />
paragraphe (élément « p ») suivant le titre (élément « titre ») :<br />
<br />
Mon histoire<br />
C’est triste.<br />
Oui, c’est triste.<br />
Ce résultat s’obtient avec l’instruction « titre + p text-indent: 0cm; ». La syntaxe « a<br />
+ b ... » s’applique à l’élément « b » quand les éléments « a » et « b » sont contenus<br />
CC BY-NC-SA
Module 3 : Technologies XML 260<br />
dans le même élément, et que « b » est immédiatement après « a ». Notez que la règle<br />
« a + b ... » s’applique à « b », mais ne s’applique pas à « a ».<br />
Supposons que nous désirions indenter le premier paragraphe (élément « p ») dans<br />
l’élément « section » :<br />
<br />
<br />
C’est triste.<br />
Oui, c’est triste.<br />
<br />
On peut obtenir ce résultat avec la sélecteur « section > p:firstchild ... » où « :firstchild<br />
» signifie que seuls les éléments « p » étant le premier élément au sein d’un autre<br />
élément sont sélectionnés. En fait, dans cet exemple particulier, on obtiendrait aussi le<br />
résultat voulu avec le sélecteur « p:firstchild ... ».<br />
Par ailleurs, nous pouvons combiner les espaces, les « + », les virgules et les « > » dans<br />
un même sélecteur. Par exemple, « a + b, c ... » s’applique aux éléments « c » et aux<br />
éléments « b » qui suivent immédiatement un élément « a ».<br />
3.3.20 Sélection d’élément par valeur ID<br />
Si vous avez des éléments ayant des attributs ayant une valeur de type « ID », on sait<br />
alors que leur valeur est un nom XML et qu’elle ne doit être utilisée qu’une seule<br />
fois. C’est le cas des attributs de la forme « id="xxx" » que l’on peut utiliser avec<br />
pratiquement tous les éléments XHTML. On peut sélectionner un élément basé sur la<br />
valeur d’un tel attribut en utilisant le symbole « # » :<br />
#xxx {<br />
color: red;<br />
}<br />
Dans ce cas, le contenu d’un élément comme une balise XHTML « test » s’affichera en rouge. On peut combiner les sélecteurs « # » avec<br />
les autres règles que nous avons traitées , par exemple, le code suivant ne mettra en<br />
rouge que les éléments « i » contenus dans un élément ayant un attribut de type « ID »<br />
avec pour valeur « xxx » :<br />
#xxx i{<br />
color: red;<br />
}<br />
CC BY-NC-SA
CSS 261<br />
3.3.21 Mais que se passe-t-il en cas de conflit<br />
Plusieurs instructions peuvent s’appliquer en même temps: un texte peut être en rouge<br />
et souligné. Il peut arriver cependant que deux instructions CSS se contredisent. Par<br />
exemple, un texte ne peut être à la fois en rouge et en bleu. Dans ce cas, la sélection la<br />
plus spécifique l’emporte. Ainsi, dans l’exemple qui suit...<br />
* {<br />
color: black;<br />
}<br />
montant {<br />
color: red;<br />
}<br />
montant > montant {<br />
color: yellow;<br />
}<br />
les éléments « montant » seront en rouge, sauf s’ils sont immédiatement contenus dans<br />
un autre élément « montant », auquel cas ils seront en jaune.<br />
Par ailleurs, si deux sélections de même spécificité sont rencontrées, c’est la dernière<br />
qui l’emporte. Ainsi, dans l’exemple qui suit...<br />
montant {<br />
color: red;<br />
}<br />
montant {<br />
color: black;<br />
}<br />
les éléments « montant » seront en noir.<br />
On peut cependant forcer le navigateur à considérer une règle qui apparaît avant une<br />
autre comme ayant tout de même priorité (à spécificité égale). Il suffit d’utiliser la<br />
mention !important...<br />
montant {<br />
color: red !important;<br />
}<br />
montant {<br />
color: black;<br />
}<br />
CC BY-NC-SA
Module 3 : Technologies XML 262<br />
les éléments « montant » seront en rouge. Notez que la mention !important permet<br />
souvent d’ignorer la spécificité de la règle: les règles avec cette mention l’emportent<br />
toujours sur les autres. (Si une autre règle avec la mention !important a une plus grande<br />
spécificité, elle aura bien sûr priorité.)<br />
Les règles par défaut utilisées par votre navigateur dans le cas du HTML ou du XHTML<br />
sont lues en premier. De cette manières, toutes les règles qui vous stipulez dans vos<br />
propres fichiers CSS et à même le XML ou HTML ont priorité pour une même spécificité.<br />
On peut considérer que les règles avec la mention !important sont lues en dernier<br />
dans la mesure où ils l’emportent toujours sur les autres.<br />
Calculer la spécificité des règles n’est pas une mince affaire, mais c’est pourtant nécessaire<br />
dans certains cas difficiles. La spécificité se mesure avec une valeur à 4 chiffres<br />
(a,b,c,d). Lorsqu’on compare deux spécificités (a1,b1,c1,d1) et (a2,b2,c2,d2), on utilise<br />
l’ordre lexicographique pour déterminer lequel est supérieur. Ainsi, si a1 est plus<br />
grand que a2, alors (a1,b1,c1,d1) a une plus grande spécificité que (a2,b2,c2,d2), si a1<br />
est égal à a2, alors on compare b1 et b2, et ainsi de suite.<br />
– La première valeur (a) vaut 1 si et seulement si la règle apparaît dans le fichier<br />
XML, HTML ou XHTML dans un attribut style. Par exemple, si on a un élément<br />
paragraphe en HTML de cette forme , alors la règle color:red<br />
aura une très grande spécificité.<br />
– La seconde valeur (b) est le nombre de sélections sur la valeur ID utilisée par la<br />
règle. Ainsi, la règle #x color:red pourra avoir une spécificité de 0,1,0,0. En pratique,<br />
la sélection par valeur ID l’emporte souvent sur les autres règles.<br />
– La troisième valeur (c) est le nombre de valeurs d’attributs utilisées par la règle (excluant<br />
l’attribut ID). Ainsi, la règle *[monattribut] color:red; pourrait avoir comme<br />
spécificité 0,0,1,0. Les pseudo-classes comptent comme des attributs.<br />
– La quatrième valeur (c) est le nombre d’éléments utilisés par la règle. Ainsi, la règle<br />
p[monattribut] color:red; pourrait avoir comme spécificité 0,0,1,1.<br />
Pour mieux comprendre, prenons un exemple concret...<br />
z[x] > a[i] {color: blue;}<br />
z z[x] a {text-decoration: underline;}<br />
z > z a , z z z + a { color: red ;}<br />
Il est plus facile de comptabiliser la spécificité si on écrit les règles individuellement<br />
(sans la virgule). Voyez si vous êtes capable de voir pourquoi les différentes règles ont<br />
les spécificités annoncées dans les commentaires...<br />
/* spécificité: 0,0,2,2 */<br />
z[x] > a[i] {color: blue;}<br />
/* spécificité: 0,0,0,3 */<br />
z > z a { color: red ; }<br />
CC BY-NC-SA
CSS 263<br />
/* spécificité: 0,0,0,4 */<br />
z z z + a { color: red; }<br />
/* spécificité: 0,0,1,3 */<br />
z z[x] a {text-decoration: underline;}<br />
Prenons maintenant un fichier XML auquel on applique les instructions CSS précédente.<br />
L’élément a dans le fichier suivant est sélectionné par les 4 règles du fichier<br />
CSS. Comment sera affiché le texte dans votre navigateur<br />
<br />
<br />
<br />
<br />
mon texte<br />
<br />
<br />
Le texte apparaîtra en bleu et sera souligné. Si on ajoute une instruction avec la mention<br />
!important comme « * color: black !important; » alors on peut faire en sorte que le<br />
texte soit noir.<br />
3.3.22 Le modèle de boîte CSS<br />
En CSS, on peut spécifier la hauteur et la largeur d’un objet à l’aide des instructions<br />
« width » et « height ». Par exemple, pour indiquer qu’un paragraphe devrait n’avoir<br />
qu’une largeur de 20 pixels, on utilise un sélecteur comme celui-ci :<br />
p{<br />
width: 20px;<br />
}<br />
Le CSS supporte plusieurs unités de mesure outre les pixels dont les pouces (in), les<br />
centimètres (cm), pourcentage (%), etc.<br />
On peut ensuite définir une marge (margin en anglais) autour de tout objet. La marge<br />
est une région où rien ne peut apparaître, incluant un autre objet. Mais la marge ne fait<br />
pas partie de l’objet lui-même. Ainsi, si un objet fait 10 pixels de hauteur et de largeur,<br />
et que vous définissez une marge de 10 pixels tout autour de l’objet, un espace d’une<br />
superficie de 900 pixels sera occupée sur l’écran. Voici un exemple de marge :<br />
p{<br />
margin-top:10px;<br />
margin-bottom:10px;<br />
margin-right:10px;<br />
margin-left:10px;<br />
CC BY-NC-SA
Module 3 : Technologies XML 264<br />
}<br />
Outre la marge, on peut aussi définir une région d’espacement (padding en anglais).<br />
Contrairement à la marge, la région d’espacement fait partie de l’objet dans la mesure<br />
où, si vous définissez une couleur de fond pour l’objet, la région d’espacement sera<br />
colorée, car elle fait partie de l’objet. Tout comme la marge, rien n’occupe cette région<br />
et elle n’est pas comptabilisée dans la hauteur et la largeur de l’objet.<br />
p{<br />
padding-top:10px;<br />
padding-bottom:10px;<br />
padding-right:10px;<br />
padding-left:10px;<br />
}<br />
On peut définir une bordure (border en anglais) afin de tracer un ligne tout autour de<br />
l’objet. La bordure se place entre la région d’espacement et la marge. La bordure peut<br />
prendre différente épaisseurs (telles que thin, medium, et thick) et aussi une couleur.<br />
p{<br />
border-color: black;<br />
border-width: medium;<br />
}<br />
Voici un diagramme qui résume les différentes définitions :<br />
bordure (border)<br />
margin−left<br />
padding−left<br />
margin−top<br />
padding−top<br />
Contenu ici<br />
espacement (padding): espace laissé<br />
vacant<br />
padding−right<br />
rmargin−right<br />
hauteur de l’objet (height)<br />
marge (margin): rien ne peut apparaître ici<br />
margin:bottom<br />
largeur de l’objet (width)<br />
CC BY-NC-SA
CSS 265<br />
3.3.23 Quand le contenu excède le contenant<br />
Il arrive qu’une image ou qu’un texte excède la taille de l’élément dans lequel il a été<br />
placé. Par défaut, ce texte ou cet image s’affichera au-delà du cadre de sa boîte (« overflow:visible<br />
»). L’instruction « overflow:hidden » permet de faire disparaître la partie<br />
d’un texte ou d’une image qui excède la boîte, alors que l’instruction « overflow:scroll »<br />
va faire apparaître des barres de défilement pour permettre à l’utilisateur d’avoir accès<br />
à tout le contenu sans pour autant avoir un dépassement..<br />
3.3.24 Encodage des caractères<br />
Il peut être utile de spécifier l’encodage des caractères utilisé pour créer le document<br />
CSS. Il suffit d’inclure une instruction « @charset » au tout début du document. Voici<br />
deux exemples :<br />
@charset "UTF-8";<br />
@charset "ISO-8859-1";<br />
3.3.25 Différentes règles pour différents média<br />
Il arrive qu’on veuille qu’une page s’affiche différemment selon qu’on utilise un écran,<br />
qu’on l’imprime sur papier ou qu’on utilise un téléphone cellulaire. L’instruction<br />
« @media » permet de préciser quel médium est concerné par la règle. Plusieurs média<br />
sont reconnus dont « handheld » (appareil portable comme un téléphone cellulaire),<br />
« screen » (à l’écran), « tv » (sur un téléviseur), « print » (sur papier), etc. Lorsque<br />
l’instruction « @media » n’est pas précisée, la règle s’applique tout le temps. Voici un<br />
exemple :<br />
@media print, handheld {<br />
img { display: none }<br />
h1 {color: black }<br />
}<br />
@media screen, tv {<br />
h1 {color: blue }<br />
}<br />
3.3.26 Inclure d’autres fichiers CSS<br />
Il arrive parfois qu’on veuille adopter une approche modulaire et créer plusieurs petits<br />
fichiers CSS. L’instruction « @import » apparaissant avant le début des règles, mais<br />
après une éventuelle instruction « @charset » permet d’inclure un ou plusieurs fichiers<br />
CSS. On peut aussi spécifier le type de médium concerné.<br />
CC BY-NC-SA
Module 3 : Technologies XML 266<br />
@import "mineure.css";<br />
@import "print-mineure.css" print;<br />
3.3.27 Indentation de la première ligne d’un paragraphe<br />
On peut indenter la première ligne d’un paragraphe avec l’instruction « text-indent ».<br />
Par exemple, pour indenter la première ligne de tous les paragraphes par 1 cm, on peut<br />
utiliser l’instruction « text-indent: 1cm ».<br />
3.3.28 Modifier la casse du texte<br />
L’instruction « text-transform » permet de modifier la casse du texte ce qui est particulièrement<br />
utile avec les titres. Par exemple, « text-transform: capitalize » modifie le<br />
texte de manière à ce que le premier caractère de chaque mot soit en majuscule. Les<br />
instructions « text-transform: uppercase » et « text-transform: lowercase » permettent<br />
de passer à une casse uniforme (majuscule ou minuscule). Finalement, l’instruction<br />
« text-transform: capitalize » met le premier caractère de chaque mot en majuscule.<br />
3.3.29 Autres variantes des polices<br />
Il est possible de modifier de diverses façons les polices : « font-style:italic », « fontstyle:oblique<br />
» « font-family: sans-serif », « font-family: serif », « font-weight: bold »,<br />
« font-weight: bolder », « font-weight: lighter ». On peut modifier la taille des caractères<br />
: « font-size: large », « font-size: small ». On peut ajouter des lignes sous, sur ou<br />
au dessus le texte, ou faire clignoter le texte : « text-decoration: underline », « textdecoration:<br />
overline », « text-decoration: line-through », « text-decoration: blink ».<br />
Vous pouvez aussi spécifier l’apparence que prendra le curseur avec l’attribut « cursor<br />
» qui prend la valeur « text » par défaut, et la valeur « pointer » pour les hyperliens.<br />
3.3.30 Ajouter des compteurs<br />
On peut définir des compteurs pour, par exemple, numéroter des chapitres ou paragraphes.<br />
Ce premier exemple numérote les paragraphes (éléments « p ») contenus entre<br />
chaque élément « h1 » avec des nombres romains :<br />
p {counter-increment: par-num}<br />
h1 {counter-reset: par-num}<br />
p:before {content: counter(par-num, upper-roman) ". "}<br />
Ce second exemple numérote les éléments « h1 » avec des nombres arabes :<br />
CC BY-NC-SA
CSS 267<br />
h1 {counter-increment: h1-num}<br />
h1:before {content: counter(h1-num, decimal) ". "}<br />
Ce troisième exemple « numérote » les éléments « h1 » et « h2 » avec des lettres<br />
(a,b,c,...) :<br />
h1 {counter-reset: h2counter; counter-increment: h1counter}<br />
h2 {counter-increment: h1counter}<br />
h1:before {content: counter(h1counter, lower-latin) ". "}<br />
h2:before {<br />
content: counter(h1counter, lower-latin) "."<br />
counter(h2counter, lower-latin) ". " }<br />
3.3.31 Traitement des retours de chariot<br />
Par défaut, le contenu textuel d’un élément est affiché sans tenir compte des retours<br />
de chariot présents dans le fichier XML, mais en insérant plutôt des retours de chariot<br />
au besoin. Avec l’instruction « white-space : pre », on force le maintient des retours<br />
de chariot là où ils sont, ce qui est très utile pour présenter du code informatique.<br />
L’instruction « white-space : nowrap » élimine toute utilisation des retours de chariot,<br />
alors que l’instruction« white-space : normal » correspond au comportement pas défaut.<br />
3.3.32 Des nouveautés en CSS 3<br />
La prochaine version du CSS, CSS 3, apporte de nombreuses améliorations. En particulier,<br />
elle ajoute plusieurs sélecteurs. Voici un tableau qui résume certains des sélecteurs<br />
les plus utilisés ainsi que le niveau CSS correspondant.<br />
Sélecteur Signification Niveau CSS<br />
* tout élément 2<br />
E un élément de nom E 1<br />
E[foo]<br />
un élément E ayant un attribut<br />
2<br />
foo<br />
E[foo="bar"]<br />
un élément E ayant un attribut<br />
2<br />
foo dont la valeur<br />
est « bar »<br />
E[foo ="bar"]<br />
un élément E ayant un attribut<br />
2<br />
foo dont la valeur<br />
contient le mot « bar » séparé<br />
par des espaces<br />
E[fooˆ="bar"]<br />
un élément E ayant un attribut<br />
foo débute par le<br />
texte « bar »<br />
3<br />
CC BY-NC-SA
Module 3 : Technologies XML 268<br />
Sélecteur Signification Niveau CSS<br />
E[foo$="bar"]<br />
un élément E ayant un attribut<br />
3<br />
foo se termine par<br />
le texte « bar »<br />
E[foo*="bar"]<br />
un élément E ayant un attribut<br />
3<br />
foo dont la valeur<br />
contient le texte « bar »<br />
E[foo|="bar"]<br />
un élément E ayant un attribut<br />
2<br />
foo dont la valeur<br />
contient le mot « bar » séparé<br />
par des tirets<br />
E F un élément F contenu 1<br />
dans un élément E<br />
E > F<br />
un élément F contenu directement<br />
2<br />
dans un élé-<br />
ment E<br />
E + F un élément F précédé 2<br />
immédiatement par un<br />
élément-voisin E<br />
E F<br />
un élément F précédé par<br />
un élément-voisin E<br />
3<br />
Avec CSS 3, il devient donc possible, par exemple, de sélectionner tous les hyperliens<br />
ayant une adresse (attribut « href ») débutant par « http » avec le sélecteur<br />
« a[hrefˆ="http"] », ce qui pourrait être utilisé pour indiquer visuellement les liens<br />
externes.<br />
3.3.33 Optimisation des fichiers CSS<br />
Il y a plusieurs façons d’écrire un même ensemble d’instructions. Par exemple, ce fichier<br />
CSS est trop long et difficile à comprendre :<br />
montant {<br />
color: red;<br />
font-weight: bold;<br />
background:white;<br />
font-style: normal;<br />
text-align: center;<br />
}<br />
nom {<br />
color: white;<br />
background:white;<br />
font-style: normal;<br />
text-align: left;<br />
}<br />
CC BY-NC-SA
CSS 269<br />
texte {<br />
color: black;<br />
text-align: center;<br />
font-style: normal;<br />
background:white;<br />
text-align: left;<br />
}<br />
On peut le réécrire dans un format plus concis et plus clair :<br />
montant {<br />
color: red;<br />
font-weight: bold;<br />
text-align: center;<br />
}<br />
nom {<br />
color: white;<br />
text-align: left;<br />
}<br />
texte {<br />
color: black;<br />
text-align: left;<br />
}<br />
montant, nom, texte {<br />
background: white;<br />
font-style: normal;<br />
}<br />
Il existe de nombreux outils pour optimiser les fichiers CSS dont CSSTidy qui est<br />
disponible en ligne.<br />
3.3.34 En terminant<br />
La syntaxe CSS est beaucoup plus riche que ce que nous venons de voir. Pour<br />
plus d’information, nous vous invitons à lire le document de référence http://<br />
www.yoyodesign.org/doc/w3c/css2/ ou les articles du site mozilla.org (http://developer.mozilla.org/en/docs/CSS).<br />
.<br />
3.3.35 Livres de référence<br />
– David Sawyer McFarland, CSS: The Missing Manual, O’Reilly Media, 2006, 476<br />
pages.<br />
CC BY-NC-SA
Module 3 : Technologies XML 270<br />
– Charles Wyke-Smith, CSS 2, guide du designer, Pearson Education France, 2005,<br />
268 pages.<br />
3.3.36 Questions d’auto-évaluation<br />
1. Quelle affirmation décrit le mieux un document CSS Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) Un document CSS doit être un document XML valable.<br />
(b) Un document CSS doit spécifier le document XML auquel il se rattache.<br />
(c) Un document CSS précise une façon de présenter certains éléments XML.<br />
2. Supposons que j’applique un fichier CSS vide au document XML suivant...<br />
<br />
Marc Popowich<br />
1010.24<br />
Achat d’ordinateur<br />
<br />
Qu’est-ce que le navigateur devrait afficher<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Rien.<br />
(b) Marc Popowich 1010.24 Achat d’ordinateur<br />
(c) Marc Popowich 1010.24 Achat d’ordinateur<br />
(d) Marc Popowich 1010.24 Achat d’ordinateur<br />
(e) Marc Popowich<br />
3. Supposons que j’applique le fichier CSS suivant...<br />
* {<br />
font-style: italic;<br />
}<br />
montant {<br />
text-decoration: underline;<br />
}<br />
au document XML suivant...<br />
<br />
Marc Popowich<br />
1010.24<br />
Achat d’ordinateur<br />
<br />
CC BY-NC-SA
CSS 271<br />
Qu’est-ce que le navigateur devrait afficher<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Rien.<br />
(b) Marc Popowich 1010.24 Achat d’ordinateur<br />
(c) Marc Popowich 1010.24 Achat d’ordinateur<br />
(d) Marc Popowich 1010.24 Achat d’ordinateur<br />
(e) Marc Popowich<br />
4. Étant donné le document XML suivant :<br />
<br />
<br />
<br />
Marc<br />
Antoine<br />
Popowich<br />
<br />
<br />
Quels documents CSS mettront « Marc » et « Antoine » en rouge, et rien d’autre.<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) personne prenom {<br />
color: red;<br />
}<br />
(b) prenom personne {<br />
color: red;<br />
}<br />
(c) facture prenom {<br />
color: red;<br />
}<br />
(d) facture > prenom {<br />
color: red;<br />
}<br />
(e) personne > prenom {<br />
color: red;<br />
}<br />
CC BY-NC-SA
Module 3 : Technologies XML 272<br />
(f) prenom + prenom {<br />
color: red;<br />
}<br />
5. Étant donné le document XML suivant :<br />
<br />
<br />
<br />
Marc<br />
Antoine<br />
Popowich<br />
<br />
<br />
Quels documents CSS permettent d’afficher uniquement « Marc Popowich »<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) prenom {<br />
display: none;<br />
}<br />
(b) prenom[special] {<br />
display: none;<br />
}<br />
(c) prenom[num] {<br />
display: none;<br />
}<br />
(d) *[special] {<br />
display: none;<br />
}<br />
(e) *[num="2"] {<br />
display: none;<br />
}<br />
6. Quelle instruction CSS sélectionnera les éléments « facture » et « montant »<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) facture | montant<br />
(b) facture > montant<br />
(c) facture + montant<br />
CC BY-NC-SA
CSS 273<br />
(d) facture, montant<br />
7. Quelle instruction CSS ne sélectionnera que les éléments nommés « racine »<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) racine<br />
(b) * racine<br />
(c) #racine<br />
(d) racine ()<br />
8. Quelle instruction CSS ne sélectionnera que les éléments « input » avec l’attribut<br />
« type="text" » Choisissez la bonne réponse parmi les choix suivants.<br />
(a) input[type="text"]<br />
(b) input[.text]<br />
(c) input.text<br />
(d) input[type:"text"]<br />
9. Quelle instruction CSS ne sélectionnera que les éléments « a », « b » et « c »<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) a | b | c<br />
(b) a, b, c<br />
(c) a b c<br />
(d) a + b + c<br />
10. Quelle instruction CSS sélectionnera les éléments « p » qui sont contenus dans<br />
un élément « li » Choisissez la bonne réponse parmi les choix suivants.<br />
(a) li < p<br />
(b) li p<br />
(c) li.p<br />
11. Quelle instruction CSS sélectionnera les éléments « p » directement contenus<br />
dans un élément « li » (« p » est un enfant immédiat de « li ») Choisissez la<br />
bonne réponse parmi les choix suivants.<br />
(a) li p<br />
(b) li > p<br />
(c) li < p<br />
(d) li.p<br />
CC BY-NC-SA
Module 3 : Technologies XML 274<br />
3.3.37 Solutions<br />
1. (a) Non. En fait, un document CSS n’est pas du XML.<br />
(b) Non. En général, un document CSS peut être utilisé par plusieurs documents<br />
XML.<br />
(c) (Bonne réponse) Oui, c’est une façon de décrire ce qu’est un document<br />
CSS.<br />
2. (a) Non. Par défaut, un texte devrait s’afficher.<br />
(b) (Bonne réponse) Exact. La présentation par défaut affiche le texte en ligne,<br />
normalement.<br />
(c) Non.<br />
(d) Non, il n’y a aucune raison pour que le texte soit en italique.<br />
(e) Non.<br />
3. (a) Non.<br />
(b) Non.<br />
(c) (Bonne réponse) Exact. Tous les éléments sont en italique et l’élément<br />
« montant » est souligné.<br />
(d) Non, l’élément montant est en italique, mais il n’est pas souligné.<br />
(e) Non.<br />
4. (a) (Bonne réponse) Correct. Ce code met en rouge tous les éléments « prenom<br />
» contenus dans des éléments « personne ».<br />
(b) Non. Ce code ne met en rouge que les éléments « personne » qui suivent<br />
des éléments « prenom », ce qui ne se produit pas dans le document XML<br />
fourni.<br />
(c) (Bonne réponse) Correct. Ce code met en rouge tous les éléments « prenom<br />
» contenus dans des éléments « facture », même si c’est au deuxième<br />
niveau, par l’élément « personne ».<br />
(d) Non. Ce code ne met en rouge que les éléments « prenom » contenus au<br />
premier niveau, soit dans l’élément « facture », mais pas dans un autre<br />
élément.<br />
(e) (Bonne réponse) Oui. Ce code ne met en rouge que les éléments « prenom »<br />
contenus au premier niveau, soit dans l’élément « personne », mais pas dans<br />
un autre élément.<br />
(f) Non. Dans ce cas, seul le second élément « prenom » rencontré sera en<br />
rouge. En effet, le symbole « + » fonctionne de la manière suivante : si on<br />
a « ab », alors la clause CSS « A+B propriete: valeur »<br />
ne s’applique qu’à l’élément « B ».<br />
5. (a) Non. Si on utilise ce fichier CSS, seulement le nom « Popowich » s’affichera.<br />
(b) (Bonne réponse) Oui. Seuls les éléments « prenom » avec un attribut ayant<br />
pour nom « special » seront cachés.<br />
CC BY-NC-SA
CSS 275<br />
(c) Non. Si on utilise ce fichier CSS, on n’affichera que le nom Popowich<br />
(d) (Bonne réponse) Oui. Seuls les éléments avec un attribut ayant pour nom<br />
« special » seront cachés.<br />
(e) (Bonne réponse) Oui. Seuls les éléments avec l’attribut « num="2" » seront<br />
cachés.<br />
6. (a) Le symbole « | » n’est pas permis.<br />
(b) Cette instruction ne sélectionne que les éléments « montant » qui sont immédiatement<br />
contenus dans un élément « facture ».<br />
(c) Cette instruction ne sélectionne que les éléments « montant » qui suivent<br />
immédiatement un élément « facture ».<br />
(d) (Bonne réponse) Effectivement. Cela est équivalent à deux instructions :<br />
l’une avec « facture » et l’autre avec « montant ».<br />
7. (a) (Bonne réponse) C’est juste. Seuls les éléments « racine » sont sélectionnés.<br />
(b) Cette syntaxe sélectionne tous les éléments « racine », sauf s’ils sont un<br />
élément-racine.<br />
(c) Dans le contexte du XHTML, cette instruction sélectionne tous les éléments<br />
qui ont un attribut « id="racine" ».<br />
(d) Cette instruction n’est pas valable en CSS.<br />
8. (a) (Bonne réponse) Oui.<br />
(b) Cette instruction n’est pas valable : elle sélectionnerait les éléments « input<br />
» ayant un attribut nommé « .text », mais ce nom n’est pas permis pour<br />
les attributs.<br />
(c) Dans le contexte du XHTML, cette instruction sélectionnera les éléments<br />
« input » ayant un attribut « class="text" ».<br />
(d) Cette syntaxe n’est pas valable en CSS.<br />
9. (a) Le symbole « | » n’est pas permis.<br />
(b) (Bonne réponse) Oui. En effet, on peut combiner plus de deux éléments<br />
avec des virgules.<br />
(c) Bien qu’il s’agisse de CSS valable, cette instruction ne sélectionnerait que<br />
les éléments « c », à certaines conditions (« c » contenu dans « b », luimême<br />
contenu dans « a »).<br />
(d) Bien qu’il s’agisse de CSS valable, cette instruction ne sélectionnerait que<br />
les éléments « c », à certaines conditions (« c » qui suit « b » qui suit « a »).<br />
10. (a) Le symbole « < » n’est pas permis.<br />
(b) (Bonne réponse) Oui.<br />
(c) Dans le contexte du XHTML, cette instruction sélectionnerait les éléments<br />
« li » ayant l’attribut « class="p" ».<br />
11. (a) Non. Elle ne requiert pas que « p » soit immédiatement dans « li ».<br />
CC BY-NC-SA
Module 3 : Technologies XML 276<br />
(b) (Bonne réponse) Oui.<br />
(c) Le symbole « < » n’est pas permis.<br />
(d) Dans le contexte du XHTML, cette instruction sélectionnerait les éléments<br />
« li » ayant l’attribut « class="p" ».<br />
3.4 Travail noté 4<br />
3.4.1 Objectifs et pondération<br />
Ce travail compte pour 10 % de la note globale du cours.<br />
Il contribue à l’objectif suivant :<br />
– Utiliser des transformations XSLT et des instructions CSS.<br />
Le travail comprend cinq exercices : le premier vaut 3 points, le deuxième vaut 2 points,<br />
le troisième vaut 2 points, le quatrième vaut 2 points, et le cinquième vaut 1 point.<br />
3.4.2 Consignes<br />
Faites les exercices et répondez aux questions en utilisant Firefox comme moteur XSLT<br />
et comme navigateur; les exercices ont été conçus en fonction de ce navigateur. Certains<br />
étudiants trouvent pratique d’utiliser l’outil de traitement en ligne disponible sur<br />
le blogue du cours (http://www.daniel-lemire.com/blogue/xsltprocessor.html). En effectuant<br />
les exercices, n’utilisez que des fonctions disponibles dans Firefox. De plus,<br />
n’utilisez pas les éléments « xsl:key » ou la fonction XPath « key » dans vos solutions.<br />
Une fois votre travail terminé, transmettez à votre personne tutrice, par courriel, un<br />
document (Word 97/2000/XP, ODF, PDF, RTF ou en format texte) en fichier attaché.<br />
L’objet de votre courriel doit commencer par « [<strong>INF</strong><strong>6450</strong>][TRAVAIL4] »; dans<br />
le message, indiquez votre nom, votre numéro d’étudiant (8 chiffres), la date de<br />
remise de votre travail et le nom de votre personne tutrice, ainsi que les mentions<br />
« Travail noté 4 » et « <strong>INF</strong> <strong>6450</strong> ». Il s’agit d’un travail personnel et vous ne devez<br />
pas partager vos solutions.<br />
Bon travail!<br />
3.4.3 Exercice 1<br />
Étant donné le document XML suivant, rédigez le contenu du document CSS<br />
« test.css », de telle sorte que les mots « Rouge » s’affichent en rouge, les mots « Noir »<br />
s’affichent en noir, les mots « majuscule » s’affichent en majuscule et ainsi de suite.<br />
CC BY-NC-SA
Travail noté 4 277<br />
Votre document CSS doit contenir au plus 5 instructions CSS de la forme « quelque<br />
chose autre chose ».<br />
Indice : Vous pouvez utiliser « color:red », « color:olive », « color:black », « color:blue<br />
», et ainsi de suite pour fixer la couleur du texte.<br />
<br />
<br />
<br />
Rouge<br />
Olive<br />
Bleu<br />
Noir<br />
Olive<br />
Bleu<br />
Rouge<br />
Noir<br />
<br />
Rouge<br />
Noir<br />
majuscule<br />
<br />
3.4.4 Exercice 2<br />
Supposons que toutes les notes des étudiants, dans différents cours, se trouvent dans le<br />
document XML suivant :<br />
<br />
<br />
<br />
Réjean Tremblay<br />
<br />
<br />
<br />
Martin Lambert<br />
<br />
<br />
<br />
Luc Alain<br />
<br />
<br />
<br />
Olive Saint-Amant<br />
<br />
CC BY-NC-SA
Module 3 : Technologies XML 278<br />
<br />
<br />
À partir de ce document XML, fournissez le document XSLT « class.xsl » qui calcule<br />
les moyennes des étudiants, d’après les éléments « cours » associés aux éléments « étudiant<br />
», et qui trie les étudiants par ordre alphabétique de leur nom de famille. Votre<br />
document XSLT doit fonctionner même si on change le nom des étudiants, l’ordre des<br />
éléments et le nom des cours. En conséquence, le nom des étudiants ou le nom des<br />
cours ne peuvent apparaître dans votre document XSLT. En outre, vous ne devez pas<br />
utiliser les crochets « [ ] » dans votre solution.<br />
Indices<br />
1. Le tableau ci-dessous devrait vous permettre de vérifier votre réponse.<br />
Étudiant<br />
Moyenne<br />
Luc Alain 69.0<br />
Martin Lambert 73.3<br />
Olive Saint-Amant 95.0<br />
Réjean Tremblay 77.7<br />
2. Vous pouvez trier les étudiants selon leur nom de famille, en remplaçant<br />
« » par :<br />
<br />
<br />
<br />
3. Vous pouvez formater les nombres à virgule flottante comme dans le tableau,<br />
en utilisant des appels de fonction XSLT tels que « format-number(10.1324,<br />
’##.0’) ».<br />
3.4.5 Exercice 3<br />
Utilisez le même document XML qu’à l’exercice précédent. Cette fois-ci, comptez<br />
le nombre d’étudiants dans chaque cours et calculez la moyenne par cours. Encore<br />
une fois, les noms des cours ou des étudiants ne doivent pas apparaître dans votre<br />
document XSLT.<br />
Le tableau qui suit présente le résultat.<br />
Sigle Nombre d’étudiants Moyenne du cours<br />
<strong>INF</strong>8430 3 85.0<br />
<strong>INF</strong>1030 3 76.7<br />
<strong>INF</strong>1230 4 81.5<br />
<strong>INF</strong>9430 1 39.0<br />
CC BY-NC-SA
Travail noté 4 279<br />
Bien que cet exercice soit très similaire au précédent et que la solution soit de même<br />
longueur, vous le trouverez probablement plus difficile.<br />
Note. Si vous aviez le droit d’utiliser XSLT 2.0, la nouvelle instruction « xsl:for-eachgroup<br />
» rendrait ce problème plus facile. Mais rappelez-vous que vous devez vous<br />
limiter à XSLT 1.0.<br />
3.4.6 Exercice 4<br />
Supposons que vous ayiez des documents contenant exclusivement une déclaration<br />
XML, des éléments et des attributs. Il n’y a pas d’espace de noms. Vous souhaitez<br />
filtrer les documents XML de telle manière que seuls les éléments dont le nom contient<br />
la lettre a sont inclus. Naturellement, les éléments, peu importe leur nom, qui ne sont<br />
pas contenus dans un élément dont le nom contient la lettre a doivent être omis. Le<br />
document XML devra contenir une instruction xml-stylesheet, mais elle ne doit pas<br />
être reproduite dans le document sortant.<br />
Par exemple, si on prend cet exemple:<br />
<br />
<br />
<br />
Testz<br />
z<br />
<br />
On souhaite que le document sortant soit celui-ci:<br />
<br />
<br />
z<br />
<br />
Vous devez proposer deux documents XSLT permettant de réaliser ce filtrage. Le premier<br />
document ne devra pas contenir d’élément « xsl:element », alors que le second ne<br />
contiendra pas d’élément « xsl:copy ».<br />
3.4.7 Exercice 5<br />
Considérez le fichier XML de la question 2 comprenant les notes des étudiants. Écrivez<br />
une requête XQuery qui calcule la moyenne des notes de chaque cours et la présente<br />
sous cette forme :<br />
<br />
85<br />
76.66666666666667<br />
CC BY-NC-SA
Module 3 : Technologies XML 280<br />
81.5<br />
39<br />
<br />
Vous pouvez utiliser la fonction avg qui calcule la moyenne.<br />
CC BY-NC-SA
Module 4 : Traitement du XML<br />
en Java<br />
4.1 Aperçu<br />
4.1.1 Objectifs<br />
Dans le premier module, nous avons appris ce qu’était le XML du point de vue technique.<br />
Dans le module 2, nous avons vu le rôle que jouait le XML dans l’organisation<br />
et sur le web. Le module 3 portait sur les technologies propres aux XML pour la présentation<br />
et la transformation des documents. Le module 4 porte sur le traitement du<br />
XML à partir d’un langage orienté objet, particulièrement Java.<br />
En pratique, le XML n’opère pas en vase clos. Les entreprises ont déjà des bases de<br />
données relationnelles, des logiciels spécialisés, des serveurs et ainsi de suite. Même<br />
si nous le pouvions, il serait impossible d’utiliser uniquement du XML : il faut nécessairement<br />
utiliser d’autres technologies, telle la programmation orientée objet, Java par<br />
exemple.<br />
On pourrait écrire ses propres fonctions pour traiter le XML, mais on utilise plus souvent<br />
une API. Rappelons qu’une API (Application and Programming Interface en anglais<br />
ou Interface pour la programmation d’applications en français) est un ensemble<br />
de fonctions et d’objets facilitant la programmation d’applications.<br />
Pour le traitement du XML en Java, il y a deux aspects importants à prendre en compte.<br />
Il faut d’abord bien connaître l’approche DOM (Document Object Model) qui sert de<br />
référence à toutes les API orientées objets destinées au traitement du XML. En outre, il<br />
faut acquérir suffisamment d’expérience dans ce domaine pour pouvoir juger convenablement<br />
de la quantité de travail nécessaire au développement d’une application Java<br />
utilisant le XML.<br />
Les objectifs spécifiques du module sont :<br />
– Apprécier les coûts de développement de solutions XML au sein d’une organisation.<br />
281
Module 4 : Traitement du XML en Java 282<br />
– Appliquer la méthodologie orientée objet pour la consommation, la fusion et le filtrage<br />
des fichiers XML.<br />
Une activité nécessitant de la programmation, le travail noté 5, nous permettra d’évaluer<br />
votre atteinte de cet objectif.<br />
4.1.2 Démarche<br />
Avant de commencer l’étude du module 4, vous devez avoir terminé les modules 1 et 3.<br />
Il n’est toutefois pas nécessaire de terminer ce module avant de passer au module 5.<br />
Nous vous invitons à étudier ce module dans l’ordre suivant :<br />
– Modèles de programmation<br />
– Rappel sur la programmation Java<br />
– Tutoriel sur DOM et AJAX<br />
– DOM (autoévaluation)<br />
Lisez les textes et vérifiez vos connaissances en répondant aux questionnaires d’autoévaluation,<br />
s’il y a lieu; réalisez ensuite le travail noté 5 qui prend la forme d’une activité<br />
de programmation.<br />
Important.- Avant de réaliser le travail noté 5, vous devriez avoir répondu aux deux<br />
questionnaires d’autoévaluation, en maîtriser le contenu et avoir terminé l’étude du<br />
module 3.<br />
4.2 Modèles de programmation<br />
4.2.1 Objectif<br />
Connaître des méthodologies de traitement du XML, dont l’approche DOM.<br />
4.2.2 Activité<br />
Lisez le texte qui suit, puis répondez au questionnaire d’autoévaluation. Ce texte porte<br />
sur les modèles de programmation en XML et présente les méthodologies communes<br />
pour la programmation en vue de traiter du XML. Il conclut avec quelques problèmes<br />
communs.<br />
Il y a plusieurs façons de traiter du XML. Chaque méthode a ses avantages et ses inconvénients.<br />
Bien que ce module s’intéresse surtout à l’approche DOM, il est important<br />
de connaître l’ensemble des méthodologies possibles et d’avoir une idée des forces et<br />
faiblesses relatives de chacune.<br />
CC BY-NC-SA
Modèles de programmation 283<br />
4.2.3 Traitement du XML comme du texte<br />
Un fichier XML est d’abord un fichier texte. Comme certains langages, tel Java, savent<br />
bien traiter les fichiers en format texte, ils peuvent directement traiter le XML. En fait,<br />
du moment où nous utilisons un éditeur de texte pour écrire du XML, c’est exactement<br />
ce que nous faisons : nous utilisons, comme outil XML, un programme prévu pour<br />
traiter du texte.<br />
Par exemple, nous pouvons produire du XML à partir d’un programme Java avec des<br />
instructions comme celles qui suivent :<br />
int montant = 10;<br />
String nom= "Gérard Beauford";<br />
System.out.println(" "+montant<br />
+""+nom+"");<br />
Cependant, comment savoir si le XML produit est bien formé Dans l’exemple précédent,<br />
le document XML affiché à l’écran avec l’instruction « System.out.println » ne<br />
sera pas du XML bien formé. Pourquoi Il y a un accent dans le nom et la plupart des<br />
environnement de commande n’utilisent pas la norme UTF-8. En principe, il est possible<br />
d’écrire un programme Java qui génère du XML bien formé la plupart du temps;<br />
mais, une fois de temps en temps, il se produira une erreur dans le XML. Cette erreur<br />
pourrait toutefois être suffisamment sérieuse et entraîner un bogue important : Mozilla<br />
Firefox refusera d’afficher du XML qui n’est pas bien formé. Pour cette raison, il est<br />
préférable, quand cela en vaut la peine, d’utiliser des librairies ou outils dédiés au XML<br />
pour une meilleure productivité.<br />
De la même façon, lire du XML sans avoir recours à des librairies peut être difficile;<br />
par exemple, supposons qu’il faille écrire un programme Java sans utiliser des librairies<br />
capables d’extraire le nom et le montant du fichier XML suivant :<br />
<br />
432<br />
Gérard Beauford<br />
Un tel programme peut être relativement difficile à écrire. Nous pouvons toutefois bien<br />
y arriver avec les expressions régulières (voir le paquetage « java.util.regex » en Java),<br />
mais dans le cas de fichiers XML plus complexes, le programme risque de devenir long<br />
et fastidieux.<br />
Illustrons comment les choses peuvent se corser davantage en étudiant l’exemple suivant<br />
:<br />
<br />
<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 284<br />
<br />
<br />
]><br />
432Gérard Beauford<br />
Supposons maintenant que vous deviez écrire un programme Java pour déterminer la<br />
valeur de l’attribut « surnom » de l’élément « nom » de ce document XML. Nous<br />
constatons qu’il faut traiter non seulement le XML, mais aussi la DTD. Et nous savons<br />
que les DTD sont le plus souvent externes, ce qui rend le problème encore plus difficile.<br />
Supporter l’ensemble des normes XML devient rapidement très fastidieux : pensons<br />
aux entités, déclarations XML, et ainsi de suite.<br />
Donc, le traitement du XML en tant que texte est une méthode qui, sans être inappropriée,<br />
a ses limites.<br />
4.2.4 Traitement événementiel<br />
Le traitement événementiel est une approche très simple pour traiter le XML, mais<br />
qui peut être difficile pour le programmeur. En fait, une API, souvent l’API SAX,<br />
est utilisée pour lire le XML en séquence. Une alternative à SAX est XNI (Xerces<br />
Native Interface). Chaque fois qu’une nouvelle balise ou tout autre élément significatif<br />
(instruction XML, contenu XML, etc.) est rencontré, un « événement » est généré.<br />
C’est le même type de traitement qui est utilisé pour gérer l’interface graphique avec<br />
boutons, fenêtres, etc.; dans ce type de traitement toutefois, l’événement « presse le<br />
bouton » est plutôt du type « nouvel élément rencontré ».<br />
Par exemple, avec le document XML qui suit...<br />
432Maman<br />
nous aurons les « événements » suivants (avec la librairie Sax) :<br />
1. Début du document<br />
2. Début d’un élément « facture »<br />
3. Début d’un élément « montant »<br />
4. Texte « 432 »<br />
5. Fin d’un élément « montant »<br />
6. Début d’un élément « nom »<br />
7. Texte « Maman »<br />
8. Fin d’un élément « nom »<br />
9. Fin d’un élément « facture »<br />
10. Fin du document<br />
CC BY-NC-SA
Modèles de programmation 285<br />
La programmation événementielle peut être plus facile et plus fiable que le traitement<br />
du XML en tant que texte parce qu’au lieu de traiter chaque caractère, nous n’avons<br />
qu’à traiter ce qui est significatif pour le XML (balises de début et de fin, texte, etc.). Par<br />
exemple, les commentaires en XML seront automatiquement reconnus par un parseur<br />
événementiel. En fait, le parseur peut parfaitement omettre de générer un événement<br />
quand un commentaire est rencontré : c’est pourquoi les commentaires ne doivent jamais<br />
contenir des informations importantes. Les valeurs d’attributs par défaut, comme<br />
« surnom » dans l’exemple précédent, peuvent être traitées automatiquement.<br />
Le traitement événementiel implique quand même beaucoup de travail de la part du<br />
programmeur, particulièrement s’il doit prendre en compte plusieurs informations dans<br />
le document. Par exemple, s’il est nécessaire de connaître le contenu de tous les éléments<br />
du document XML, il faut enregistrer toutes ces informations, car le traitement<br />
événementiel ne permet pas les retours en arrière : le fichier est lu en séquence et nous<br />
devons faire le reste.<br />
Il y a des cas où le traitement événementiel est la meilleure solution. Lorsque nous<br />
devons traiter des fichiers XML très lourds, faisant plusieurs Mo, ou que l’on travaille<br />
sur des machines avec peu de mémoire (comme un téléphone cellulaire), ce type de<br />
traitement permet de faire une utilisation judicieuse de la mémoire vive. Un cas intéressant<br />
est celui où seuls quelques éléments d’un document XML nous intéressent. Par<br />
exemple, nous cherchons la valeur des éléments « nom » : le traitement événementiel<br />
permet de parcourir tout le document, mais de ne retenir que l’information voulue.<br />
En général, nous pouvons dire que la programmation événementielle du XML est réservée<br />
à des cas particuliers, tels les documents lourds, et aux experts.<br />
L’utilisation de SAX2 est fort simple à la base comme le montre le<br />
programme MonApplicationSAX. Il suffit de créer une classe dérivée de<br />
org.xml.sax.helpers.DefaultHandler où l’on surcharge des méthodes comme « startElement<br />
», « endElement » et « characters » qui nous permettent de gérer les événements<br />
« début d’un élément », « fin d’un élément » et « nœud de texte » respectivement. On<br />
peut aussi gérer d’autres événements comme le début du document (méthode « startDocument<br />
») et sa fin (méthode « endDocument »). Ce type de programmation orientéeobjet<br />
correspond au motif de l’observateur : on construit une classe qui est chargée de<br />
recevoir les différents événements et d’y réagir. Même les programmeurs expérimentés<br />
utilisent peu souvent ce type de motif.<br />
import java.io.*;<br />
import org.xml.sax.*;<br />
import org.xml.sax.helpers.*;<br />
/**<br />
* <strong>INF</strong> <strong>6450</strong><br />
* Daniel Lemire<br />
*/<br />
public class MonApplicationSAX extends DefaultHandler {<br />
/**<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 286<br />
}<br />
* Événement correspondant au début d’un élément<br />
*/<br />
public void startElement (String uri, String name, String qName,<br />
Attributes atts) {<br />
if(uri.length()>0)<br />
System.out.println("Début de l’élément "+uri+":"+qName);<br />
else<br />
System.out.println("Début de l’élément "+name);<br />
}<br />
/**<br />
* Événement correspondant à la fin d’un élément<br />
*/<br />
public void endElement (String uri, String name, String qName) {<br />
if(uri.length()>0)<br />
System.out.println("Fin de l’élément "+uri+":"+qName);<br />
else<br />
System.out.println("Fin de l’élément "+name);<br />
}<br />
/**<br />
* Ici on traite l’événement correspondant à un noeud de texte<br />
*/<br />
public void characters (char charac[], int debut, int longueur) {<br />
for (int i = debut; i < longueur+debut; ++i)<br />
System.out.print(charac[i]);<br />
System.out.println();<br />
}<br />
/**<br />
* on traite un fichier offert en ligne de commande.<br />
* Utilisation: java MonApplicationSAX nomdufichier.xml<br />
*/<br />
public static void main (String args[]) throws Exception {<br />
XMLReader xr = XMLReaderFactory.createXMLReader();<br />
xr.setContentHandler(new MonApplicationSAX());<br />
xr.parse(new InputSource(new FileReader(args[0])));<br />
}<br />
CC BY-NC-SA
Modèles de programmation 287<br />
4.2.5 Traitement avec itérateurs<br />
Le traitement événementiel n’est pas très intuitif. Par contre, la plupart des programmeurs<br />
Java connaissent le traitement itératif. Voici un exemple très simple de programmation<br />
avec un itérateur :<br />
import java.util.*;<br />
public class myvec {<br />
public static void main(String[] arg) {<br />
Vector v= new Vector();<br />
v.add("parent");<br />
v.add("enfant");<br />
Iterator i = v.iterator();<br />
while(i.hasNext())<br />
System.out.println(i.next());<br />
}<br />
}<br />
Au lieu de créer une classe qui attend passivement de recevoir des événements, on fait<br />
une simple boucle. La Streaming API for XML (StAX) permet de faire un peu la même<br />
chose avec du XML. Voici un exemple, observez bien la présence d’une seule boucle<br />
et l’absence de plusieurs méthodes :<br />
// ce programme nécessite l’installation d’une<br />
// librairie StAX<br />
// voir http://dev2dev.bea.com/xml/stax.html<br />
//<br />
import javax.xml.stream.*;<br />
import java.net.*;<br />
import java.io.*;<br />
public class staxex {<br />
public static void main(String[] args) {<br />
String input = args[0];<br />
try {<br />
URL u = new URL(input);<br />
InputStream in = u.openStream();<br />
XMLInputFactory factory = XMLInputFactory.newInstance();<br />
XMLStreamReader parser = factory.createXMLStreamReader(in);<br />
for (int event = parser.next();<br />
event != XMLStreamConstants.END_DOCUMENT;<br />
event = parser.next()) {<br />
switch (event) {<br />
case XMLStreamConstants.START_ELEMENT:<br />
System.out.println(parser.getLocalName());<br />
break;<br />
case XMLStreamConstants.END_ELEMENT:<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 288<br />
System.out.println(parser.getLocalName());<br />
break;<br />
case XMLStreamConstants.CDATA:<br />
System.out.print(parser.getText());<br />
break;<br />
}<br />
}<br />
parser.close();<br />
}<br />
catch (XMLStreamException ex) {<br />
System.out.println(ex);<br />
}<br />
catch (IOException ex) {<br />
System.out.println(ex);<br />
}<br />
}<br />
}<br />
StAX est une norme Java officielle (JSR 173). La librairie open source Woodstox offre<br />
une implémentation de l’API StAX.<br />
4.2.6 Traitement avec modèle en arbre<br />
Un document XML peut être vu comme un arbre avec un élément-racine contenant luimême<br />
des éléments, qui eux-mêmes contiennent des éléments, et ainsi de suite. Ainsi,<br />
en utilisant le traitement événementiel par exemple, une librairie peut d’abord lire le<br />
document XML et créer un modèle en arbre. Le modèle en arbre XML le plus connu<br />
et qui sert de référence est le Document Object Model (DOM). Il est facile de trouver<br />
des librairies qui supportent le DOM ou une variante. Nous traiterons du DOM dans<br />
un prochain texte.<br />
Ainsi, étant donné le document XML suivant...<br />
<br />
<br />
<br />
<br />
]><br />
432<br />
Gérard Beauford<br />
un modèle en arbre aura comme objet-racine un objet représentant le document luimême<br />
ayant comme enfant l’élément « facture ». Cet objet aura lui-même une liste<br />
CC BY-NC-SA
Modèles de programmation 289<br />
d’enfants, c’est-à-dire deux objets représentant les éléments « montant » et « nom ». La<br />
valeur d’attribut de « surnom » se trouvera dans l’objet représentant l’élément « nom ».<br />
De façon simpliste, nous pouvons représenter le document XML précédent avec le<br />
diagramme en arbre suivant :<br />
Document - déclaration de type<br />
|<br />
facture<br />
| |<br />
montant nom (surnom="Joe")<br />
| |<br />
"432" "Gérard Beauford"<br />
La programmation avec des modèles en arbre n’est pas toujours facile. Il y a un grand<br />
nombre d’objets à manipuler (un pour chaque élément de l’arbre) et donc beaucoup<br />
d’appels de fonctions. De plus, ce type de programmation exige beaucoup de mémoire<br />
parce que, généralement, le parseur va d’abord visiter le document en entier, le transformer<br />
en objets, puis tout stocker en mémoire.<br />
D’un autre côté, ce type de programmation (avec modèle en arbre) est sans doute<br />
l’une des façons les plus conviviales de traiter de petits fichiers XML à partir d’un<br />
langage orienté-objet comme Java. Il est relativement facile d’apprendre à écrire des<br />
programmes en Java pour traiter le XML, en utilisant le DOM.<br />
De la même façon, à partir d’un modèle en arbre, nous pouvons produire un document<br />
XML. Si nous utilisons une bonne librairie, nous sommes certains que le document<br />
XML généré sera bien formé et conforme à notre intention. Il faut par contre bien<br />
comprendre que le même modèle en arbre peut correspondre à plusieurs fichiers XML<br />
différents. Dans l’exemple précédent, il est possible qu’une librairie, qui a comme paramètre<br />
l’arbre que nous avons dessiné, génère un fichier XML comme celui-ci :<br />
<br />
432<br />
Gérard Beauford<br />
4.2.7 Transformations<br />
Le XSLT est une autre façon de traiter le XML par la programmation. Dans les cas les<br />
plus simples, c’est probablement le meilleur outil. Cependant, pour un traitement plus<br />
complexe, avec intégration dans un système d’information, il ne suffira généralement<br />
pas. Par exemple, le XSLT n’est pas conçu pour aller chercher des informations dans<br />
une base de données et les transformer en XML bien formé.<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 290<br />
4.2.8 XPath<br />
Si nous devons extraire de l’information d’un document XML à partir d’un langage<br />
comme Java, il sera souvent plus simple d’utiliser une API qui supporte XPath. C’est<br />
le cas notamment du « SDK Java 1.5 ». Nous avons étudié les expressions XPath dans le<br />
module 3. Comme nous pouvons le voir avec l’exemple suivant, l’utilisation de XPath<br />
en Java requiert la création de plusieurs objets intermédiaires, ce qui n’est pas toujours<br />
très pratique. Le traitement XPath se fait sur un document chargé complètement en<br />
mémoire ce qui rend son application prohibitive sur de gros documents. Par contre, la<br />
syntaxe XPath est très expressive et peut éviter d’avoir à écrire de longs programmes<br />
Java.<br />
/* on doit toujours importer ces deux paquetages: */<br />
import javax.xml.parsers.*;<br />
import javax.xml.xpath.*;<br />
/* on doit construire une instance du document XML */<br />
DocumentBuilderFactory dbfact = DocumentBuilderFactory.newInstance();<br />
DocumentBuilder builder = dbfact.newDocumentBuilder();<br />
/* on peut traiter directement un URL */<br />
Document document =<br />
builder.parse("http://www.mondomaine.com/monfichier.xml");<br />
/* on construit un objet XPath */<br />
XPathFactory fact = XPathFactory.newInstance();<br />
XPath xpath = fact.newXPath();<br />
/* finalement, on peut émettre sa requête XPath sur le document */<br />
String title = xpath.evaluate("//nom/text()", document);<br />
4.2.9 XML comme extension d’un langage<br />
Tout comme les structures de données simples, tel que les tableaux, font souvent partie<br />
intégrante des langages de programmation, on choisit parfois d’intégrer le traitement<br />
du XML à même le langage. À titre d’exemple, EAX (ECMAScript for XML) est une<br />
norme qui définit une extension du langage ECMAScript pour le traitement du XML.<br />
Avec ce type d’intégration, on peut définir un document XML directement dans le code<br />
comme dans cet exemple.<br />
var sales = <br />
<br />
<br />
<br />
;<br />
On peut aussi traiter les documents XML comme s’ils étaient des structures de données<br />
intégrées au langage, comme dans cet exemple.<br />
CC BY-NC-SA
Modèles de programmation 291<br />
for each( var price in sales..@price ) {<br />
alert( price );<br />
}<br />
EAX est supporté par les implémentations du ECMAScript de Firefox (JavaScript)<br />
et de Flash (ActionScript). Ce n’est pas le seul exemple d’intégration du XML à un<br />
langage.<br />
4.2.10 Traitement par abstraction<br />
Nous pouvons utiliser des outils et des librairies qui n’exigent aucune connaissance du<br />
XML, mais qui peuvent utiliser et générer du XML. Par exemple, la plupart des bases<br />
de données relationnelles permettent d’importer et d’exporter des données en XML,<br />
sans jamais devoir manipuler le XML directement. Une entreprise pourra écrire sa<br />
propre librairie de traitement du XML dans le contexte d’une application XML spécifique.<br />
Par exemple, imaginons une application XML pour les factures; nous pourrions<br />
écrire une fonction qui prend en paramètre le montant et la personne à qui est destinée<br />
la facture, et qui génère le XML, sans que nous n’ayons même à savoir ce qu’est le<br />
XML.<br />
4.2.11 Sérialisation XML<br />
Comme exemple de traitement par abstraction, on a la sérialisation XML des objets en<br />
Java. On définit le terme sérialisation XML comme la transformation d’un objet Java<br />
en un fichier XML de manière à ce qu’on puisse reconstuire l’objet par la suite. On<br />
peut utiliser la sérialisation pour rapidement enregistrer des informations sur le disque<br />
ou transmettre des objets vers un autre programme au travers un réseau. Par exemple,<br />
le programme Serialization.java enregistre sur le disque un fichier XML contenant la<br />
description complète d’un objet « java.lang.String ».<br />
import java.beans.*;<br />
import java.io.*;<br />
/**<br />
* <strong>INF</strong> <strong>6450</strong><br />
* Daniel Lemire<br />
*/<br />
public class Serialization {<br />
/**<br />
* Écrit l’objet en XML dans le fichier spécifié<br />
* (ce qu’on appelle une "sérialisation")<br />
*/<br />
public static void ecrireObjet(Object o, File f) throws IOException {<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 292<br />
XMLEncoder e = new XMLEncoder(<br />
new BufferedOutputStream(<br />
new FileOutputStream(f)));<br />
e.writeObject(o);<br />
e.close();<br />
}<br />
/**<br />
* Lit un objet "sérialisé" en XML dans le fichier spécifié<br />
*/<br />
public static Object lireObjet(File f) throws IOException {<br />
XMLDecoder e = new XMLDecoder(<br />
new BufferedInputStream(<br />
new FileInputStream(f)));<br />
Object o = e.readObject();<br />
e.close();<br />
return o;<br />
}<br />
/**<br />
* lit un fichier et l’affiche à l’écran!<br />
*/<br />
public static void affiche(File f) throws IOException {<br />
BufferedReader br = new BufferedReader(new FileReader(f));<br />
String ligne;<br />
while((ligne = br.readLine()) != null) {<br />
System.out.println(ligne);<br />
}<br />
br.close();<br />
}<br />
public static void main(String[] args) throws IOException {<br />
// je crée un objet java, dans ce cas, une chaîne de carac.<br />
String o = new String("Un objet java");<br />
// je vais enregistrer le résultat dans un fichier XML<br />
File fichier = new File("test.xml");<br />
ecrireObjet(o,fichier);<br />
affiche(fichier);<br />
Object lu = lireObjet(fichier);<br />
// ensuite, je vérifie que l’objet lu est bien identique<br />
// à l’objet écrit<br />
assert(lu.equals(o));<br />
}<br />
}<br />
Après l’exécution de ce programme, le contenu du fichier XML « test.xml » est :<br />
CC BY-NC-SA
Modèles de programmation 293<br />
<br />
<br />
Un objet java<br />
<br />
On peut aussi utiliser la sérialisation avec ses propres objets à la condition qu’il s’agisse<br />
de « Beans » : tous les attributs de votre objet doivent être modifiés et lus par des<br />
méthodes qui débutent par « set » et « get » respectivement. Voici un exemple typique<br />
d’objet Bean qui peut facilement être sérialisé :<br />
public class UneClasse {<br />
int x, y;<br />
public UneClasse() {<br />
}<br />
public int getX() {return x;}<br />
public int getY() {return y;}<br />
public void setX(int i) {x=i;}<br />
public void setY(int i) {y=i;}<br />
}<br />
Voici un exemple de sérialisation XML de cet objet :<br />
<br />
<br />
<br />
<br />
1<br />
<br />
<br />
2<br />
<br />
<br />
<br />
Il faut, bien entendu, que le programme qui lit vos objets sérialisés ait accès aux classes<br />
de vos objets.<br />
4.2.12 Services web<br />
Bien qu’il ne s’agisse pas d’une façon de traiter du XML, les services web font partie<br />
intégrante des méthodes de programmation utilisant le XML. La définition même de ce<br />
qu’est un service web peut varier, mais pour l’essentiel, il s’agit d’un service pouvant<br />
être utilisé au sein d’application logicielle. Le service est généralement accessible sur<br />
le web et répond aux requêtes par du XML. On peut transmettre les requêtes sous<br />
diverses formes : requêtes HTTP simples (GET), transmission de documents XML,<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 294<br />
etc. De nombreux sites web nous permettent d’utiliser des services web. Par exemple,<br />
Amazon, la librairie en ligne, vous permet d’utiliser un service web pour récupérer<br />
automatiquement les descriptions de produits. En principe, on peut combiner plusieurs<br />
services web pour composer des applications riches et originales, ou simplement pour<br />
ajouter une fonction particulière à un site web. Plusieurs protocoles peuvent être utilisés<br />
dont le Simple Object Access Protocol (SOAP) ou le Search/Retrieve via URL (SRU).<br />
On distingue généralement deux types de services web. Les services web « REST »<br />
tels que SRU se servent exclusivement du protocole HTTP et il est toujours possible<br />
de faire des requêtes en entrant simplement un URL dans un navigateur. Les services<br />
web REST font l’objet d’une spécification Java (Java Specification Request 311: Java<br />
API for RESTful Web Services). Les autres services web, dont ceux utilisant SOAP,<br />
exigent plutôt souvent que toutes les requêtes prennent la forme d’un fichier XML et<br />
ils ne tiennent pas compte particulièrement du protocole HTTP.<br />
Le protocole HTTP (RFC 2616) est relativement simple. Toutes les requêtes se font du<br />
client vers le serveur et se distinguent par un URI et une méthode. Votre navigateur fait<br />
des requêtes GET à chaque fois que vous chargez une page. La plupart des formulaires<br />
que vous utilisez sur le web emploie la méthode POST. On choisit généralement une<br />
des méthodes suivantes :<br />
Méthode<br />
GET<br />
POST<br />
PUT<br />
DELETE<br />
Explication<br />
Requête visant à obtenir la ressource<br />
(par exemple, un document XML)<br />
identifié par l’URI. Il s’agit du type de<br />
requête le plus utilisé: c’est celui utilisé<br />
généralement par les navigateurs<br />
pour charger les pages web. Une telle<br />
requête ne doit pas modifier l’état de la<br />
ressource.<br />
Ajouter une nouvelle ressource (un document,<br />
une image, un texte) en lien<br />
avec l’URI ou annoter ou modifier une<br />
ressource existante. L’URI fourni ne<br />
sera pas l’URI de la ressource si une<br />
nouvelle ressource est créée.<br />
Créer ou remplacer une ressource ayant<br />
l’URI fourni. En général, les requêtes<br />
PUT sont utilisées pour remplacer les<br />
ressources (comme un fichier XML).<br />
Supprimer une ressource (comme un<br />
document).<br />
Les méthodes GET, PUT et DELETE sont idempotentes : on peut répéter la requête<br />
autant de fois qu’on le désire, et on obtiendra le même résultat qu’une seule requête.<br />
La méthode POST, par contre, n’est pas idempotente : sa répétition pourrait entraîner<br />
la création ou la modification de ressources. La méthode GET est sécuritaire : on peut<br />
l’employer sans crainte de créer ou de modifier une ressource.<br />
CC BY-NC-SA
Modèles de programmation 295<br />
Un exemple de service web REST simple, utilisant le protocole SRU, est offert par la<br />
librairie du congrès du gouvernement américain. À l’aide d’une simple requêtre prenant<br />
la forme d’un URL, on peut demander de recevoir un fichier XML décrivant n’importe<br />
quel livre connu de la librairie. Voici un exemple de code Java fonctionnel permettant<br />
de faire une telle requête :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
import javax.xml.xpath.*;<br />
public class example {<br />
public static void main(String[] args) throws Exception {<br />
String base = "http://z3950.loc.gov:7090/voyager";<br />
String autre =<br />
"operation=searchRetrieve&version=1.1&recordPacking=xml";<br />
String autre2 =<br />
"&startRecord=1&maximumRecords=20&query=";<br />
String requete ="(dc.title=%22First Impressions of the New World%22) and<br />
(dc.creator all %22Trotter Isabella Strange%22)";<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser = factory.newDocumentBuilder();<br />
Document doc = parser.parse(base+autre+autre2+requete);<br />
Element racine = doc.getDocumentElement();<br />
XPathFactory fact = XPathFactory.newInstance();<br />
XPath xpath = fact.newXPath();<br />
System.out.println("code: "+xpath.evaluate("//leader/text()", doc));<br />
}<br />
}<br />
En examinant le code, on peut voir qu’on cherche de l’information sur tous les livres<br />
ayant pour titre « First Impressions of the New World » et écrits par « Trotter Isabella<br />
Strange ». Le résultat de la requête SRU est plutôt incompréhensible dans ce cas précis.<br />
Il est surtout destiné aux spécialistes en bibliothéconomie :<br />
<br />
<br />
1.11<br />
<br />
info:srw/schema/1/marcxml-v1.1<br />
xml<br />
01007cam a2200265u 4500<br />
8662129<br />
20011206111958.0<br />
830108s1859 enkb a 000 0 eng<br />
<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 296<br />
<br />
(DLC) 02002686<br />
<br />
<br />
0<br />
cbc<br />
premunv<br />
u<br />
ncip<br />
19<br />
y-gencatlg<br />
<br />
<br />
02002686 <br />
<br />
<br />
DLC<br />
CarP<br />
DLC<br />
<br />
<br />
n-cn---<br />
n-us---<br />
<br />
<br />
E166<br />
.T85<br />
<br />
<br />
Microfilm 32043 E<br />
<br />
<br />
[Trotter, Isabella (Strange)],<br />
1816-1878. [from old catalog]<br />
<br />
<br />
First impressions of the New world on two travellers<br />
from the Old, in the autumn of 1858.<br />
<br />
<br />
London,<br />
Longman, Brown, Green, Longmans, &<br />
Roberts,<br />
1859.<br />
<br />
<br />
CC BY-NC-SA
Modèles de programmation 297<br />
xi, 308 p.<br />
front. (fold. map)<br />
20 cm.<br />
<br />
<br />
Replace;<br />
LC copy replaced by preservation microfilm<br />
DLC<br />
<br />
<br />
United States<br />
Description and travel. [from old catalog]<br />
<br />
<br />
Canada<br />
Description and travel. [from old catalog]<br />
<br />
<br />
pmosl<br />
<br />
<br />
mvp<br />
zz01<br />
<br />
<br />
c-MicRR<br />
Microfilm 32043 E<br />
Copy 1<br />
PREM<br />
<br />
1<br />
Pour une description, des services web utilisant SOAP, vous pouvez consulter la rubrique<br />
correspondante sur wikipédia. Ils sont généralement plus complexes que les<br />
services web REST.<br />
4.2.13 Questions d’auto-évaluation<br />
1. Si vous faites la lecture d’un document XML avec une librairie supportant DOM<br />
et que, par la suite, vous utilisez la même librairie pour sauvegarder exactement<br />
le même modèle en arbre, est-ce que le fichier nouvellement produit sera identique<br />
au fichier d’origine Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Oui<br />
(b) Non<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 298<br />
2. Si vous voulez absolument produire du XML bien formé, quelle est la meilleure<br />
méthode Choisissez la bonne réponse parmi les choix suivants.<br />
(a) En traitant le XML comme du texte (System.out en Java).<br />
(b) En utilisant le XSLT.<br />
(c) En utilisant une librairie avec modèle DOM.<br />
3. Est-ce qu’une librairie événementielle nous avertit de la présence d’un commentaire<br />
dans le texte XML Est-ce que le modèle en arbre doit contenir les commentaires<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Oui. Dans les deux cas.<br />
(b) Non. Dans les deux cas.<br />
4. Quel type de modèle est le DOM Choisissez la bonne réponse parmi les choix<br />
suivants.<br />
(a) En arbre<br />
(b) Événementiel<br />
(c) Texte<br />
5. Si, dans un document XML, seule la valeur des attributs « montant » vous intéresse,<br />
quelle serait le meilleur modèle de programmation Choisissez la bonne<br />
réponse parmi les choix suivants.<br />
(a) En arbre<br />
(b) Événementiel<br />
(c) Texte<br />
4.2.14 Solutions<br />
1. (a) Il y a plusieurs façons de représenter un même arbre XML. Par<br />
exemple, l’espace entre les éléments n’est pas significatif en XML et<br />
« fdsfds » est équivalent à « fds<br />
fds ».<br />
(b) (Bonne réponse) Effectivement, il peut y avoir des différences.<br />
2. (a) S’il est important que votre document soit bien formé, ce n’est probablement<br />
pas la meilleure méthode, à moins que le travail ne soit relativement<br />
simple.<br />
(b) Non. Le XSLT ne permet pas de vérifier que le document produit est du<br />
XML bien formé. Il est possible de générer du XML incorrect à partir du<br />
XSLT : par exemple, ayant deux éléments-racines.<br />
(c) (Bonne réponse) Oui. Une bonne librairie devrait nous assurer que le document<br />
produit est du XML bien formé.<br />
CC BY-NC-SA
Rappel sur la programmation Java 299<br />
3. (a) Non. C’est pourquoi les commentaires ne devraient pas contenir des informations<br />
importantes, car les parseurs peuvent omettre les commentaires.<br />
(b) (Bonne réponse) Effectivement. Certains parseurs omettent les commentaires;<br />
si les les commentaires XML servent à stocker des informations<br />
importantes, cela peut entraîner un problème.<br />
4. (a) (Bonne réponse) Oui. C’est même le modèle en arbre de référence.<br />
(b) Non, mais on peut utiliser un traitement événementiel pour produire<br />
un DOM.<br />
(c) Non.<br />
5. (a) Non. Il peut être fastidieux et coûter beaucoup de mémoire que de tout<br />
mettre dans un arbre pour n’aller chercher que quelques valeurs.<br />
(b) (Bonne réponse) Effectivement. Vous pourriez ainsi aller chercher que ce<br />
dont vous avez besoin.<br />
(c) Le traitement du XML comme texte peut fonctionner dans certains cas<br />
simples, mais pas en général.<br />
4.3 Rappel sur la programmation Java<br />
4.3.1 Objectif<br />
Ramener à votre mémoire les notions que vous connaissez déjà sur le langage de programmation<br />
Java.<br />
4.3.2 Activité<br />
Lisez les définitions qui suivent, puis compilez et exécutez les programmes suggérés<br />
dans la section « Exemples ».<br />
4.3.3 Définitions<br />
Notion d’objet<br />
Java est un langage orienté objet. Le terme « orienté objet » signifie que l’on modélise<br />
le problème en utilisant des « objets ». Les objets possèdent des données (les attributs)<br />
et des comportements (les méthodes). Dans la plupart des langages orientés objets, les<br />
objets appartiennent à une « classe » qui en définit le type.<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 300<br />
Notion de classe<br />
Une classe est un modèle pour créer des objets qui ont des caractéristiques communes.<br />
La classe comporte la structure d’un objet (ses attributs et ses méthodes). On dit qu’un<br />
objet est l’instance d’une classe et on parle d’instanciation. En Java, tous les objets sont<br />
créés à partir d’une classe.<br />
Notion de méthode<br />
Une méthode est une fonction qui peut être appliquée aux objets ou qui est appliquée<br />
par les objets. Par exemple, pour une classe « Voiture », une méthode pourrait être<br />
« Freiner » ou « Accélérer ».<br />
Notion d’interface<br />
Une interface est définie par un ensemble de méthodes et de variables à la manière<br />
d’une classe; mais, à la différence d’une classe, on ne peut l’utiliser comme modèle<br />
pour créer un objet. On dit d’une classe qui contient toutes les méthodes spécifiées par<br />
l’interface qu’elle implémente l’interface en question.<br />
En pratique, l’interface peut se traiter comme une classe : si la classe « Voiture » implémente<br />
l’interface « Vehicule », alors tous les objets instanciés à partir de « Voiture »<br />
peuvent être traités comme des objets de type « Vehicule ». Une même classe peut<br />
implémenter plusieurs interfaces.<br />
Notion d’héritage<br />
L’héritage est un lien entre des classes. Si une classe est créée à partir d’une classe<br />
déjà existante, elle « hérite » de ses attributs et de ses méthodes. Par exemple, la classe<br />
« voiture » pourrait hériter de la classe « engin ».<br />
Notion d’encapsulation<br />
L’encapsulation consiste à protéger un objet, en empêchant l’accès à ses données par<br />
un autre moyen que les méthodes proposées.<br />
4.3.4 Exemples<br />
Les deux exemples proposés sont très simples. Toutefois, faites-les pour vous remémorer<br />
la programmation Java.<br />
CC BY-NC-SA
Rappel sur la programmation Java 301<br />
Commençons par le commencement. Créons un programme qui affichera « Bonjour ! ».<br />
Tapez le texte suivant, avec Notepad/Bloc-notes, et enregistrez-le sous le nom « bonjour.java<br />
».<br />
public class bonjour{<br />
public static void main (String[] args){<br />
System.out.println("Bonjour !");<br />
}<br />
}<br />
Pour tester ce programme, ouvrez une fenêtre de commande et placez-vous dans le<br />
dossier où vous avez enregistré le fichier « bonjour.java », puis tapez « javac bonjour.java<br />
» pour compiler le programme. N’oubliez pas d’indiquer le chemin du fichier<br />
« javac.exe »; au besoin, par exemple, tapez, dans la fenêtre de commande,<br />
« PATH=C:/j2sdk1.4.2_06/bin », suivi d’un retour du chariot. Cette commande va<br />
créer un fichier « bonjour.class » qui contient le programme compilé. Pour exécuter<br />
le programme, il suffit de taper « java bonjour ». Normalement, le texte « Bonjour ! »<br />
s’affichera.<br />
Créons maintenant un autre programme qui prend comme argument le nom d’une personne<br />
et qui affiche « Bonjour nom ! ». Il suffit de modifier le programme précédent.<br />
Nommons ce programme « bonjourbis » et le fichier « bonjourbis.java ».<br />
public class bonjourbis{<br />
public static void main (String[] args){<br />
String nom = new String(args[0]);<br />
System.out.println("Bonjour "+nom+" !");<br />
}<br />
}<br />
Pour compiler le fichier, il suffit de taper « javac bonjourbis.java ». Pour l’exécuter<br />
avec « Lucie » comme argument, il suffit d’ajouter l’argument à la fin de la ligne de<br />
commande : « java bonjourbis Lucie ». Et le texte « Bonjour Lucie ! » s’affichera.<br />
4.3.5 Exemples avancés<br />
Supposons que Voiture et Bicyclette sont des classes qui héritent de Vehicule ou alors,<br />
des classes qui implémentent l’interface Vehicule. Supposons que vous avez un objet<br />
de type Vehicule, comment savoir s’il s’agit d’un objet de classe Voiture ou Bicyclette <br />
Vous pouvez tester son type avec le mot-clef « instanceof », comme ceci :<br />
public void afficheType (Vehicule v){<br />
if(v instanceof Voiture) {<br />
System.out.println("Objet de classe Voiture!");<br />
} else if (v instanceof Bicyclette) {<br />
System.out.println("Objet de classe Bicyclette!");<br />
} else {<br />
System.out.println("Erreur!");<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 302<br />
}<br />
}<br />
Supposons maintenant qu’on vous passe un objet de type Vehicule alors que vous savez<br />
très bien que c’est un objet de classe Voiture, ça peut être bien embêtant surtout si<br />
l’objet Voiture a des méthodes ou attributs que le type Vehicule n’a pas ! Vous pouvez<br />
dire à Java, explicitement, que vous voulez qu’il traite l’objet comme ayant la classe<br />
Voiture comme ceci :<br />
public void traiteType (Vehicule v){<br />
Voiture w = (Voiture) v;<br />
(...)<br />
}<br />
Attention cependant ! Si l’objet n’est pas de la classe Voiture, une exception sera générée<br />
(ClassCastException).<br />
4.3.6 Lecture de fichiers<br />
On peut lire un fichier au format text en Java, ligne par ligne, en utilisant la classe<br />
BufferReader du paquetage java.io.<br />
import java.io.*;<br />
(...)<br />
BufferedReader br = new BufferedReader(<br />
new InputStreamReader(new FileInputStream(nomdufichier)));<br />
String ligne;<br />
while ((ligne = br.readLine()) != null) {<br />
(...)<br />
}<br />
br.close();<br />
4.3.7 Astuces<br />
– La casse est importante en Java. La variable « i » n’est pas la même que la variable<br />
« I ».<br />
– Votre fichier java ne peut contenir qu’une seule classe « public » et le fichier doit<br />
avoir le même nom que cette classe.<br />
– Les instructions, dans une fonction, doivent être séparées par le point-virgule ( ; ).<br />
4.3.8 Retour sur l’activité<br />
Est-ce que vous avez pu compiler et exécuter les programmes en java Si oui, passez<br />
aux autres activités, sinon contactez la personne tutrice ou cherchez encore un peu.<br />
CC BY-NC-SA
Tutoriel sur DOM 303<br />
4.4 Tutoriel sur DOM<br />
4.4.1 Objectifs<br />
– Apprendre à lire et à écrire du XML à partir de Java.<br />
– Comprendre le modèle DOM, en particulier sa structure en arbre.<br />
4.4.2 Activité<br />
Ce tutoriel vous fournira une compréhension pratique de DOM (version 2.0) en Java.<br />
Lisez attentivement le texte qui suit et, au fur et à mesure, faites les exemples proposés.<br />
4.4.3 Le tutoriel pour se familiariser avec le DOM<br />
Introduction<br />
Nous supposons que vous disposez d’un environnement de développement Java et que<br />
vous ferez les exemples de ce tutoriel afin de mieux comprendre. Notre objectif est<br />
avant tout de vous rendre suffisamment à l’aise avec DOM pour pouvoir l’utiliser; nous<br />
vous invitons toutefois à naviguer dans le web pour en apprendre davantage sur le sujet,<br />
au besoin.<br />
L’API Java elle-même est disponible sur le site de Sun Microsystems. Pour pouvoir<br />
faire vos propres programmes, consultez l’API Java qui comprend tous les objets et<br />
fonctions du tutoriel.<br />
4.4.4 Notions de base<br />
On dit qu’un modèle DOM est une structure en arbre. En informatique, un arbre est<br />
un graphe ou une structure constituée de nœuds, de façon telle que chaque nœud a un<br />
et un seul parent - ou aucun -, lequel a un seul ou plusieurs enfants. Un seul nœud est<br />
autorisé à ne pas avoir de parent, c’est le nœud-racine. Pour illustrer notre propos, nous<br />
pouvons penser à une cellule qui se divise : chaque cellule a une et une seule celluleparente,<br />
et chaque cellule peut se diviser (souvent en deux) ou mourir avant de pouvoir<br />
se diviser. On dit d’un nœud qui n’a pas d’enfant qu’il est un nœud-feuille.<br />
Comme nous allons le voir, dans un arbre DOM, tous les éléments, les déclarations<br />
XML, etc., sont représentés par un nœud. Le nœud-racine est le document lui-même<br />
qui peut contenir la déclaration XML, la déclaration de type de document et l’élémentracine,<br />
comme ses enfants.<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 304<br />
4.4.5 Point de vue critique<br />
L’API DOM est très utilisée. Elle est supportée dans plusieurs langages, dont ECMAScript,<br />
Java, C#, C++, etc. parce qu’elle a été spécifiée avec l’Interface description language.<br />
Par contre, comme c’est un traitement du XML en arbre, les implémentations<br />
de l’API DOM consomment beaucoup de mémoire. En plus, l’API DOM fait travailler<br />
le programmeur en exigeant beaucoup de lignes de code pour faire les choses les plus<br />
simples. Il arrive aussi qu’une implémentation de l’API DOM soit beaucoup plus lente<br />
que des alternatives plus simples. Malgré tous ces défauts, le fait que l’API DOM soit<br />
si bien supportée en fait une référence incontournable.<br />
4.4.6 Un document XML<br />
Créons d’abord un document XML, que nous nommerons « test.xml », et un répertoire<br />
pour y déposer le fichier en question, ainsi que le code Java pour ce tutoriel.<br />
<br />
<br />
<br />
Jean<br />
32<br />
<br />
<br />
Marie<br />
54<br />
<br />
<br />
4.4.7 Charger un document XML en Java<br />
Écrivons maintenant un programme en Java qui va lire ce fichier XML. Pour ce<br />
faire, créons avec Notepad/Bloc-notes ou avec tout autre éditeur approprié, un fichier<br />
« test.java » contenant le texte suivant :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser = factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
}<br />
}<br />
CC BY-NC-SA
Tutoriel sur DOM 305<br />
Ensuite, compilons et exécutons le programme :<br />
javac test.java<br />
java test test.xml<br />
Si tout se passe bien, vous ne devriez rien voir s’afficher sur votre écran. En effet, les<br />
trois lignes de code Java utilisées plus haut ne font que créer l’objet « Document » qui<br />
contient, selon un modèle en arbre, notre document « test.xml ».<br />
Java utilise un traitement événementiel (SAX) pour charger le fichier. Cependant, une<br />
fois que l’objet doc a été créé, vous pourriez effacer le fichier du disque sans mal. Le<br />
traitement du document se fait entièrement en mémoire.<br />
4.4.8 Accès à l’élément-racine<br />
Le premier élément que nous voulons consulter est l’élément-racine qui, dans notre<br />
cas, est un élément « liste ». Nous obtiendrons le résultat désiré en utilisant la méthode<br />
« getDocumentElement », comme ceci :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser = factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
}<br />
}<br />
Cet exemple n’est pas très intéressant puisque, encore une fois, rien ne s’affiche à<br />
l’écran. Par contre, nous avons maintenant un objet « racine » qui est un modèle de<br />
l’élément-racine du document XML et qui a le type d’une interface « Element ».<br />
L’interface « Element » est l’interface la plus importante en DOM. Notre nouvel objet<br />
« racine » a une méthode « getTagName() » qui permet de connaître le nom de<br />
l’élément. Par exemple, le code suivant devrait afficher le texte « liste » à l’écran.<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser = factory.newDocumentBuilder();<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 306<br />
}<br />
}<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
System.out.println(racine.getTagName());<br />
Voici deux des méthodes importantes de l’interface « Element » :<br />
Méthode<br />
Résultat<br />
getTagName()<br />
Donne le nom de l’élément<br />
getAttribute(String nom)<br />
Donne la valeur d’un attribut<br />
Point technique : Dans le cas où vous devez faire afficher du texte en ligne de commande<br />
sous un environnement Windows, il arrive que les accents ne passent pas. En<br />
effet, le jeu de caractère utilisé par l’outil de ligne de commande Windows est souvent<br />
Cp850. Il faut donc en informer Java en ajouter la ligne « System.setOut(new PrintStream(System.out,<br />
true, "Cp850")); » avant d’utiliser la méthode System.out.<br />
4.4.9 L’interface « Node »<br />
Dans le modèle DOM, l’arbre est un arbre fait de nœuds ou « nodes », en anglais.<br />
Plusieurs choses sont représentées par l’interface « Node » : du texte, un élément,<br />
une instruction de traitement, une déclaration de type de document, une entité, etc.<br />
L’arbre DOM commence à la racine par le document lui-même. Les attributs peuvent<br />
être traités comme des « Node », même s’ils ne font pas partie de l’arbre DOM : un<br />
attribut est une propriété d’un élément de l’arbre. Le modèle en arbre DOM peut être<br />
décrit ainsi : un document contient des « Node », et chaque « Node » contient d’autres<br />
« Node », etc.<br />
L’interface « Node » possède deux méthodes très importantes : « getNodeName() »<br />
et « getNodeValue() ». La valeur donnée par l’une ou l’autre de ces deux méthodes<br />
dépend du type de nœud représenté. Le tableau suivant résume le comportement de ces<br />
méthodes pour différents types importants :<br />
type de nœud nom DOM valeur de getNodeName()<br />
valeur de getNodeValue()<br />
attribut Attr nom de l’attribut valeur de l’attribut<br />
élément Element nom de l’élément null<br />
instruction de traitemention<br />
ProcessingInstructioncible de l’instruc-<br />
contenu entier de<br />
l’instruction sans<br />
la cible<br />
texte Text la chaîne « #text » le texte<br />
Une autre méthode importante est « getNodeType ». Par exemple, si « e » est un nœud<br />
et que nous voulons vérifier s’il s’agit d’un élément, nous pouvons le faire comme ceci :<br />
if( e.getNodeType() == Node.ELEMENT_NODE) {<br />
CC BY-NC-SA
Tutoriel sur DOM 307<br />
System.out.println(" Ce noeud est un élément!!! ");<br />
}<br />
Demandons maintenant à DOM de nous fournir tous les sous-éléments « joueur » de<br />
l’élément-racine, comme ceci :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser = factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
NodeList nl = racine.getElementsByTagName("joueur");<br />
}<br />
}<br />
Nous avons utilisé la méthode « getElementsByTagName » qui nous permet d’obtenir<br />
la liste des sous-éléments ayant le nom XML donné. Une alternative est d’utiliser la<br />
méthode « getElementById » qui donne le seul élément ayant un attribut de type « ID »<br />
correspondant à la chaîne de caractères founie. En XHTML, par exemple, on peut ajouter<br />
un attribut nommé « id » qui a comme une valeur « ID ». Rappelons qu’un attribut<br />
a une valeur de type « ID » si elle est un nom XML et si toutes les valeurs de type<br />
« ID » dans le document sont différentes. L’avantage sur la méthode « getElementsBy-<br />
TagName » est qu’on peut rapidement sélectionner un unique élément.<br />
L’interface « NodeList » est, quant à elle, très simple. Elle n’a que deux méthodes :<br />
« getLength() », qui retourne le nombre de « Node », et « item(int) », qui nous donne<br />
accès au « Node » en question. Donc, pour visiter tous les sous-éléments de l’élémentracine,<br />
nous pouvons faire comme ceci :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
NodeList nl = racine.getChildNodes();<br />
for (int i = 0; i < nl.getLength(); ++i) {<br />
Node n = nl.item(i);<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 308<br />
}<br />
}<br />
}<br />
Les deux sous-éléments « joueur » de l’élément « liste » sont visités. Parce que les<br />
deux « Node » en question sont des éléments, nous aurions très bien pu écrire :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
NodeList nl = racine.getChildNodes();<br />
for (int i = 0; i < nl.getLength(); ++i) {<br />
Element n = (Element) nl.item(i);<br />
}<br />
}<br />
}<br />
Supposons maintenant que nous voulions afficher le contenu des deux éléments<br />
« joueur ». Nous pouvons y arriver en commençant comme ceci :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
NodeList nl = racine.getElementsByTagName("joueur");<br />
for (int i = 0; i < nl.getLength(); ++i) {<br />
Element joueur = (Element) nl.item(i);<br />
NodeList listedenoms = joueur.getElementsByTagName("nom");<br />
Element nom = (Element) listedenoms.item(0);<br />
}<br />
}<br />
}<br />
CC BY-NC-SA
Tutoriel sur DOM 309<br />
En principe, nous avons maintenant les éléments « nom » des joueurs, mais comment<br />
faire pour obtenir le contenu textuel d’un élément Nous devons savoir que<br />
le texte est lui-même un « Node ». Il suffit donc de sélectionner le premier et seul<br />
« Node » contenu dans l’élément « nom » et d’aller en chercher la valeur (getFirst-<br />
Child().getNodeValue()), comme ceci :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
NodeList nl = racine.getElementsByTagName("joueur");<br />
for (int i = 0; i < nl.getLength(); ++i) {<br />
Element joueur = (Element) nl.item(i);<br />
NodeList listedenoms = joueur.getElementsByTagName("nom");<br />
Element nom = (Element) listedenoms.item(0);<br />
System.out.println(nom.getFirstChild().getNodeValue());<br />
}<br />
}<br />
}<br />
Essayez maintenant ce programme. Vous devriez voir les noms des joueurs qui s’affichent.<br />
Si vous souhaitez ajouter le nombre de buts correspondant à chaque joueur,<br />
rien de plus facile! Il suffit de répéter le code comme dans l’exemple qui suit :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
NodeList nl = racine.getElementsByTagName("joueur");<br />
for (int i = 0; i < nl.getLength(); ++i) {<br />
Element joueur = (Element) nl.item(i);<br />
NodeList listedenoms = joueur.getElementsByTagName("nom");<br />
Element nom = (Element) listedenoms.item(0);<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 310<br />
}<br />
}<br />
}<br />
System.out.println(nom.getFirstChild().getNodeValue());<br />
NodeList listedebuts = joueur.getElementsByTagName("buts");<br />
Element buts = (Element) listedebuts.item(0);<br />
System.out.println(buts.getFirstChild().getNodeValue());<br />
Dans l’éventualité ou un élément nom ne contiendrait pas de texte, la méthode<br />
getFirstChild() retourne la valeur null. Il faudrait donc cette éventualité<br />
(buts.getFirstChild()==null) afin d’éviter un plantage du programme.<br />
Vous vous rappelez sans doute que les éléments « nom » ont un attribut « surnom ».<br />
Pour aller en chercher la valeur, il suffit d’utiliser la méthode « getAttribute » comme<br />
ceci :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class test {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
NodeList nl = racine.getElementsByTagName("joueur");<br />
for (int i = 0; i < nl.getLength(); ++i) {<br />
Element joueur = (Element) nl.item(i);<br />
NodeList listedenoms = joueur.getElementsByTagName("nom");<br />
Element nom = (Element) listedenoms.item(0);<br />
System.out.println(nom.getFirstChild().getNodeValue());<br />
System.out.println(nom.getAttribute("surnom"));<br />
NodeList listedebuts = joueur.getElementsByTagName("buts");<br />
Element buts = (Element) listedebuts.item(0);<br />
System.out.println(buts.getFirstChild().getNodeValue());<br />
}<br />
}<br />
}<br />
Nous constatons que les attributs ne sont pas des « Node » et qu’ils sont donc plutôt<br />
traités comme faisant partie d’un élément. C’est logique; puisqu’un attribut ne peut<br />
contenir d’autres attributs, il ne forme donc pas un élément essentiel d’une structure en<br />
arbre, contrairement aux éléments.<br />
Et c’est tout ce qu’il nous faut pour lire complètement le fichier XML « test.xml ».<br />
Vous pouvez bien sûr créer un programme plus sophistiqué!<br />
CC BY-NC-SA
Tutoriel sur DOM 311<br />
4.4.10 Création de documents<br />
À partir d’une structure DOM, nous pouvons créer un document XML en Java à l’aide<br />
de quelques lignes et du paquetage « javax.xml.transform » et de ses sous-paquetages.<br />
L’écriture d’une structure DOM se fait vers un objet de type « Writer ». Si nous voulons<br />
écrire dans un fichier, nous devons créer un « FileWriter » et si nous voulons afficher à<br />
l’écran, nous passerons en paramètre l’objet « System.out ».<br />
Par exemple, pour lire le document « test.xml », en faire une structure DOM et l’enregistrer,<br />
nous pouvons utiliser le programme suivant :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
import java.io.*;<br />
import javax.xml.transform.*;<br />
import javax.xml.transform.dom.*;<br />
import javax.xml.transform.stream.*;<br />
public class construction {<br />
public static void main(String[] args) throws Exception {<br />
// lecture d’un document<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
// écriture d’un document<br />
TransformerFactory tfact =<br />
TransformerFactory.newInstance();<br />
Transformer transformer =<br />
tfact.newTransformer();<br />
DOMSource source = new DOMSource(doc);<br />
FileWriter fw = new FileWriter(args[1]);<br />
StreamResult result = new StreamResult(fw);<br />
transformer.transform(source, result);<br />
}<br />
}<br />
Pour afficher à l’écran, nous aurions pu utiliser la syntaxe « new StreamResult(System.out);<br />
».<br />
Si nous enregistrons ce code Java dans un fichier nommé « construction.java », il suffira<br />
ensuite de taper :<br />
javac construction.java<br />
java construction test.xml copy.xml<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 312<br />
Le fichier qui en résulte, « copy.xml », devrait être pratiquement identique à<br />
« test.xml ». Nous pouvons évidemment utiliser cette approche pour créer des documents<br />
XML.<br />
Nous allons maintenant créer un document XML « vide », avant de lui ajouter du<br />
contenu. Nommons le fichier du programme « construction2.java ». Nous utilisons la<br />
méthode « newDocument » :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
import java.io.*;<br />
import javax.xml.transform.*;<br />
import javax.xml.transform.dom.*;<br />
import javax.xml.transform.stream.*;<br />
public class construction2 {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.newDocument();<br />
}<br />
}<br />
Si nous enregistrons ce document, il n’y aura que la déclaration XML. Créons maintenant<br />
un élément « liste » et ajoutons-le à notre document. Pour ce faire, nous utiliserons<br />
la méthode « createElement » de l’interface « Document »<br />
et la méthode « appendChild », comme ceci :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
import java.io.*;<br />
import javax.xml.transform.*;<br />
import javax.xml.transform.dom.*;<br />
import javax.xml.transform.stream.*;<br />
public class construction2 {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.newDocument();<br />
Element liste = doc.createElement("liste");<br />
doc.appendChild(liste);<br />
}<br />
CC BY-NC-SA
Tutoriel sur DOM 313<br />
}<br />
Il est important de noter qu’on ne peut créer un élément ou autre nœud sans avoir<br />
d’abord un document. Un nœud DOM contient toujours une référence au document<br />
auquel il appartient, même si on ne l’a pas encore inséré dans le document avec une<br />
fonction « appendChild ». Il est impossible de prendre un élément d’un document et de<br />
l’insérer dans un autre document : vous risquez ainsi de vous retrouver avec un document<br />
dysfonctionnel. On peut cependant copier un nœud d’un document pour l’amener<br />
dans un nouveau document avec la méthode « importNode » de l’interface « Document<br />
».<br />
Nous pouvons donc créer un nouveau fichier avec le contenu de « test.xml », entièrement<br />
à partir de fonctions en Java. À chaque nœud, nous pouvons ajouter des enfants<br />
à l’aide de la méthode « appendChild ». Nous pouvons aussi créer des nœuds de texte<br />
à partir de la méthode « createTextNode » de l’interface « Document ». Finalement,<br />
l’interface « Element » a une méthode « setAttribute » pour créer un attribut.<br />
Comme nous utilisons souvent « ISO-8859-1 » pour l’encodage de caractères, nous<br />
vous suggérons de spécifier l’attribut « encoding » du document XML, comme ceci :<br />
TransformerFactory tfact =<br />
TransformerFactory.newInstance();<br />
Transformer transformer =<br />
tfact.newTransformer();<br />
transformer.setOutputProperty("encoding", "ISO-8859-1");<br />
Le programme suivant va créer un document « nouveaufichier.xml » équivalent au<br />
fichier « test.xml » défini plus haut. Nous appellerons le fichier « construction3.java ».<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
import java.io.*;<br />
import javax.xml.transform.*;<br />
import javax.xml.transform.dom.*;<br />
import javax.xml.transform.stream.*;<br />
public class construction3 {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.newDocument();<br />
Element liste = doc.createElement("liste");<br />
doc.appendChild(liste);<br />
Element joueur1 = doc.createElement("joueur");<br />
Element joueur2 = doc.createElement("joueur");<br />
liste.appendChild(joueur1);<br />
liste.appendChild(joueur2);<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 314<br />
}<br />
}<br />
Element nom1 = doc.createElement("nom");<br />
nom1.appendChild(doc.createTextNode("Jean"));<br />
Element nom2 = doc.createElement("nom");<br />
nom2.appendChild(doc.createTextNode("Marie"));<br />
joueur1.appendChild(nom1);<br />
joueur2.appendChild(nom2);<br />
Element but1 = doc.createElement("buts");<br />
but1.appendChild(doc.createTextNode("32"));<br />
Element but2 = doc.createElement("buts");<br />
but2.appendChild(doc.createTextNode("54"));<br />
joueur1.appendChild(but1);<br />
joueur2.appendChild(but2);<br />
nom1.setAttribute("surnom","jojo");<br />
nom2.setAttribute("surnom","Ma");<br />
TransformerFactory tfact =<br />
TransformerFactory.newInstance();<br />
Transformer transformer =<br />
tfact.newTransformer();<br />
transformer.setOutputProperty("encoding", "ISO-8859-1");<br />
DOMSource source = new DOMSource(doc);<br />
FileWriter fw = new FileWriter("nouveaufichier.xml");<br />
StreamResult result = new StreamResult(fw);<br />
transformer.transform(source, result);<br />
Testez ce programme et modifiez-le pour explorer différentes possibilités. Il peut être<br />
utile de vérifier les fonctions disponibles dans le cadre de l’API Java.<br />
Il est intéressant d’observer qu’il est possible d’ajouter à plusieurs reprises un nœud de<br />
texte à même un élément :<br />
e.appendChild(doc.createElement("a"));<br />
e.appendChild(doc.createElement("b"));<br />
e.appendChild(doc.createElement("c"));<br />
Le contenu de l’élément, dans cet exemple, sera tout simplement le texte « abc » décomposé<br />
en 3 nœud.<br />
4.4.11 Modifier un « Document »<br />
Nous observons que l’écriture d’un document XML se fait à partir d’un objet « Document<br />
». Rien ne nous empêche donc de charger un document XML, de le modifier et<br />
de l’enregistrer à nouveau.<br />
Voici un tableau qui donne quelques fréquentes opérations de modification :<br />
CC BY-NC-SA
Tutoriel sur DOM 315<br />
Code<br />
e.getParentNode().removeChild(e);<br />
e.getParentNode().replaceChild(e,f);<br />
e.setAttribute(String nom, String valeur)<br />
e.removeAttribute(String nom)<br />
Résultat<br />
Permet d’éliminer un nœud<br />
Permet de remplacer un nœud par un<br />
autre<br />
Permet de modifier un attribut<br />
Permet d’éliminer un attribut<br />
Par exemple, le programme suivant, « Modif.java », permet d’ajouter un attribut à<br />
l’élément-racine de tout document XML :<br />
import org.w3c.dom.*;<br />
import java.io.*;<br />
import javax.xml.parsers.*;<br />
import javax.xml.transform.*;<br />
import javax.xml.transform.dom.*;<br />
import javax.xml.transform.stream.*;<br />
public class Modif {<br />
}<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
racine.setAttribute("unattribut","une valeur");<br />
TransformerFactory tfact =<br />
TransformerFactory.newInstance();<br />
Transformer transformer =<br />
tfact.newTransformer();<br />
transformer.setOutputProperty("encoding", "ISO-8859-1");<br />
DOMSource source = new DOMSource(doc);<br />
FileWriter fw = new FileWriter(args[0]);<br />
StreamResult result = new StreamResult(fw);<br />
transformer.transform(source, result);<br />
}<br />
Il suffit de l’appeler avec la syntaxe « java Modif monfichier.xml ».<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 316<br />
4.4.12 Les espaces de noms<br />
L’utilisation des espaces de noms est prévue en DOM (version 2.0). Par exemple, pour<br />
créer un élément appartenant à un espace de noms, il faut utiliser la syntaxe « createElementNS(String<br />
espace, String nom) », où « espace » prend la valeur de l’URI<br />
et « nom » contient le préfixe et le nom de l’élément. Cette nouvelle méthode vient<br />
remplacer le simple « createElement(String nom) ». Il existe aussi une méthode correspondante<br />
« setAttributeNS(String espace, String nom, String valeur) ».<br />
Considérons l’exemple de document XML suivant :<br />
<br />
<br />
<br />
Pour le produire en DOM, il faudrait utiliser un code comme celui-ci :<br />
import org.w3c.dom.*;<br />
import java.io.*;<br />
import javax.xml.parsers.*;<br />
import javax.xml.transform.*;<br />
import javax.xml.transform.dom.*;<br />
import javax.xml.transform.stream.*;<br />
public class Espace {<br />
public static void main(String[] args) throws Exception {<br />
String uri= "http://www.mondomaine.com/";<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser =<br />
factory.newDocumentBuilder();<br />
Document doc = parser.newDocument();<br />
Element racine = doc.createElementNS(uri,"md:racine");<br />
racine.setAttribute("xmlns:md",uri);<br />
doc.appendChild(racine);<br />
Element e = doc.createElementNS(uri,"md:element");<br />
racine.appendChild(e);<br />
e.setAttributeNS(uri,"md:unattribut","sa valeur");<br />
TransformerFactory tfact =<br />
TransformerFactory.newInstance();<br />
Transformer transformer =<br />
tfact.newTransformer();<br />
transformer.setOutputProperty("encoding", "ISO-8859-1");<br />
DOMSource source = new DOMSource(doc);<br />
StreamResult result = new StreamResult(System.out);<br />
transformer.transform(source, result);<br />
CC BY-NC-SA
Tutoriel sur DOM 317<br />
}<br />
}<br />
Il faut nommer le fichier « Espace.java ».<br />
Nous pouvons aussi retrouver l’espace de noms d’un élément à l’aide de la méthode<br />
« getNamespaceURI() » de l’interface « Node ». Cependant, par défaut, la classe « DocumentBuilderFactory<br />
» ignore les espaces de noms et il faut, par conséquent, ajouter la<br />
ligne « factory.setNamespaceAware(true); ». L’exemple du code qui suit donne l’espace<br />
de noms (URI), le préfixe et le nom de l’élément (avec le préfixe) de tout fichier XML<br />
saisi dans une ligne de commande :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class LireEspace {<br />
}<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
factory.setNamespaceAware(true);<br />
DocumentBuilder parser = factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
Element racine = doc.getDocumentElement();<br />
System.out.println(racine.getNamespaceURI()+" "<br />
+racine.getPrefix()+" "+ racine.getTagName());<br />
}<br />
Il faut nommer le fichier « LireEspace.java », et l’exécuter avec la syntaxe « java LireEspace<br />
monfichier.xml ».<br />
4.4.13 Deux problèmes avec solution<br />
Pour vous aider à maîtriser le modèle DOM, nous vous proposons deux problèmes et<br />
une solution possible pour chacun.<br />
Problème 1<br />
Créez une classe « Arbre » (fichier « Arbre.java ») qui donne l’arbre DOM d’un document<br />
XML. Pour chaque nœud, donnez son nom et sa valeur (indices : « getNode-<br />
Name », « get NodeValue »). Enfin, indentez les nœuds selon le nombre de parents<br />
qu’ils ont.<br />
Ainsi, étant donné le fichier « test.xml » suivant :<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 318<br />
<br />
Jean32<br />
La commande « java Arbre test.xml » devrait afficher à l’écran le résultat suivant :<br />
Nom: #document Valeur: null<br />
Nom: joueur Valeur: null<br />
Nom: nom Valeur: null<br />
Nom: #text Valeur: Jean<br />
Nom: buts Valeur: null<br />
Nom: #text Valeur: 32<br />
Solution du problème 1<br />
Voici une solution possible :<br />
import org.w3c.dom.*;<br />
import javax.xml.parsers.*;<br />
public class Arbre {<br />
public static void traite(Node node, int i) {<br />
String s= ""; for (int k = 0; k < i; ++k) s+=" ";<br />
System.out.println(s+"Nom: "+ node.getNodeName() +<br />
" Valeur: "+node.getNodeValue());<br />
NodeList nl = node.getChildNodes();<br />
if(nl != null) {<br />
for (int k = 0; k < nl.getLength(); ++k) {<br />
traite( nl.item(k),i+2);<br />
}<br />
}<br />
}<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
DocumentBuilder parser = factory.newDocumentBuilder();<br />
Document doc = parser.parse(args[0]);<br />
traite(doc,0);<br />
}<br />
}<br />
CC BY-NC-SA
Tutoriel sur DOM 319<br />
Problème 2<br />
Nous pouvons utiliser un fichier XML comme archive d’une base de données primitive.<br />
Cette fois-ci, nous vous demandons d’écrire un programme qui permet de chercher,<br />
d’effacer et d’ajouter des noms dans un bottin téléphonique.<br />
Stockez les numéros dans un fichier XML nommé « bottin.xml » et ayant le contenu<br />
qui suit :<br />
<br />
<br />
<br />
<br />
<br />
Concevez un programme dont le code source sera contenu dans un fichier nommé<br />
« Bottin.java ». Votre programme doit posséder les trois fonctions suivantes :<br />
– « java Bottin efface "Jean Réjean" » : élimine du fichier « bottin.xml » tout élément<br />
« personne » ayant comme attribut « nom="Jean Réjean" ».<br />
– « java Bottin cherche "Jean Réjean" » : donne le numéro de téléphone correspondant<br />
au nom donné à partir du contenu du fichier « bottin.xml », et ne retourne rien si le<br />
nom donné n’est pas trouvé.<br />
– « java Bottin ajoute "Jean Réjean" 432-4421 » : fait en sorte que le nom « Jean<br />
Réjean » soit associé au seul numéro de téléphone « 432-4421 ».<br />
Vous pouvez supposer que le fichier « bottin.xml » existe et se trouve dans le même répertoire<br />
que le fichier « Bottin.java ». Vous pouvez également supposer que l’élémentracine<br />
est « bottin ».<br />
Solution du problème 2<br />
Voici une solution possible :<br />
import org.w3c.dom.*;<br />
import java.io.*;<br />
import javax.xml.parsers.*;<br />
import javax.xml.transform.*;<br />
import javax.xml.transform.dom.*;<br />
import javax.xml.transform.stream.*;<br />
public class Bottin {<br />
public static void main(String[] args) throws Exception {<br />
DocumentBuilderFactory factory =<br />
DocumentBuilderFactory.newInstance();<br />
factory.setNamespaceAware(true);<br />
DocumentBuilder parser =<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 320<br />
factory.newDocumentBuilder();<br />
Document doc = parser.parse("bottin.xml");<br />
Element racine = doc.getDocumentElement();<br />
NodeList nl = racine.getChildNodes();<br />
if(args[0].equals("efface")) {<br />
for (int k = 0; k < nl.getLength(); ++k) {<br />
if(nl.item(k).getNodeType()==Node.ELEMENT_NODE) {<br />
Element e = (Element) nl.item(k);<br />
if(e.getAttribute("nom").equals(args[1])) {<br />
e.getParentNode().removeChild(e);<br />
}<br />
}<br />
}<br />
} else if (args[0].equals("cherche")) {<br />
for (int k = 0; k < nl.getLength(); ++k) {<br />
if(nl.item(k).getNodeType()==Node.ELEMENT_NODE) {<br />
Element e = (Element) nl.item(k);<br />
if(e.getAttribute("nom").equals(args[1])) {<br />
System.out.println(e.getAttribute("téléphone"));<br />
}<br />
}<br />
}<br />
} else if (args[0].equals("ajoute")) {<br />
boolean ajout = false;<br />
for (int k = 0; k < nl.getLength(); ++k) {<br />
if(nl.item(k).getNodeType()==Node.ELEMENT_NODE) {<br />
Element e = (Element) nl.item(k);<br />
if(e.getAttribute("nom").equals(args[1])) {<br />
e.setAttribute("téléphone",args[2]);<br />
ajout=true;<br />
}<br />
}<br />
}<br />
if( ! ajout) {<br />
Element p = doc.createElement("personne");<br />
p.setAttribute("nom", args[1]);<br />
p.setAttribute("téléphone", args[2]);<br />
racine.appendChild(p);<br />
}<br />
}<br />
TransformerFactory tfact = TransformerFactory.newInstance();<br />
Transformer transformer = tfact.newTransformer();<br />
transformer.setOutputProperty("encoding", "ISO-8859-1");<br />
DOMSource source = new DOMSource(doc);<br />
FileWriter fw = new FileWriter("bottin.xml");<br />
StreamResult result = new StreamResult(fw);<br />
CC BY-NC-SA
Tutoriel sur DOM 321<br />
}<br />
transformer.transform(source, result);<br />
}<br />
4.4.14 DOM et ECMAScript<br />
ECMAScript est un langage similaire au Java quant à sa syntaxe de base et qui s’exécute<br />
souvent dans un navigateur. Il fut inventé par Netscape en 1995 sous le nom de<br />
JavaScript. Il s’agit d’une norme de l’European Computer Manufacturers Association<br />
(ECMA) depuis 1997. L’implémentation du ECMAScript que l’on retrouve dans le<br />
navigateur Firefox se nomme toujours JavaScript, alors que Microsoft nomme son implémentation<br />
JScript. L’ECMAScript n’est pas une forme de Java, même s’ils ont une<br />
ressemblance superficielle, adoptant tous les deux une syntaxe proche du langage C. Il<br />
existe de nombreux tutoriels sur le ECMAScript incluant le tutoriel de Jean-Paul Davalan<br />
se trouvant à l’URL http://perso.wanadoo.fr/jean-paul.davalan/lang/jsc/ ou encore<br />
le tutoriel de commentcamarche.net. Le site xul.fr offre un résumé du langage, le site<br />
mozilla.org offre une description complète du langage (en anglais).<br />
Si vous ne connaissez pas le langage ECMAScript, vous devriez prendre quelques instants<br />
pour en faire un survol.<br />
Les implémentations ECMAScript supportent bien l’API DOM en général. La documentation<br />
de l’API DOM pour l’implémentation de ECMAScript de Firefox se trouve à<br />
l’adresse http://developer.mozilla.org/en/docs/Gecko_DOM_Reference. La principale<br />
différence entre DOM en ECMAScript et DOM en Java est que certaines méthodes en<br />
Java deviennent des attributs en ECMAScript (getNodeValue() devient nodeValue).<br />
ECMAScript peut donc lire et traiter des documents XML avec l’API DOM. En particulier,<br />
si ECMAScript est utilisé au sein d’une page XHTML, le script peut modifier la<br />
page dynamiquement en utilisant l’API DOM. La principale différence entre l’utilisation<br />
de DOM en Java et ECMAScript est qu’à l’exception des méthodes getAttribute,<br />
setAttribute, getAttributeNS, setAttributeNS, getAttributeNode, setAttributeNode, getAttributeNodeNS,<br />
setAttributeNodeNS, getElementsByTagName et getElementById,<br />
toutes les méthodes dont le nom commence par « get » ou « set » sont remplacées par un<br />
attribut de l’objet (ou « property » en anglais). Au lieu d’écrire « e.getChildNodes(); »,<br />
on écrit « e.childNodes; », au lieu d’écrire « e.setNodeValue("texte"); », on écrit<br />
« e.nodeValue="texte"; », et ainsi de suite.<br />
Par exemple, le script suivant va ajouter du texte lorsque la souris passera sur l’élément<br />
ayant un attribut « id=’javatest’ »..<br />
monele=document.getElementById(’javatest’);<br />
monele.childNodes.item(0).nodeValue+=’ (passage de souris) ’;<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 322<br />
4.4.15 Asynchronous JavaScript And XML (AJAX)<br />
Normalement, sur un site web, pour aller chercher de l’information supplémentaire sur<br />
le serveur, tel que la description d’un produit ou l’horaire d’un film, il faut charger une<br />
nouvelle page web. Cependant, si l’information en question est disponible au format<br />
XML, un script ECMAScript peut la récupérer sans forcer le chargement d’une nouvelle<br />
page ce qui donne l’impression à l’utilisateur que l’application web est rapide, car<br />
il ne voit pas de chargement de pages. Le fait de pouvoir charger un fichier XML du<br />
serveur d’origine à partir d’un script ECMAScript constitue l’essentiel d’une technique<br />
appelée Asynchronous JavaScript And XML (AJAX) (JavaScript asynchrone et XML).<br />
Notons qu’à cause du modèle de sécurité ECMAScript, le fichier XML doit être sur le<br />
même serveur et être du même nom de domaine que la page HTML.<br />
Vous avez sans doute déjà utilisé une application AJAX. Les sites de courriel en ligne<br />
comme Google Mail l’utilisent presque tous pour charger le contenu d’un message sans<br />
forcer le chargement d’une nouvelle page.<br />
Si vous connaissez l’API DOM, la programmation d’une application AJAX n’est pas<br />
bien difficile. Il vous suffit d’apprendre un peu de ECMAScript. La classe XMLHttpRequest<br />
rend AJAX facile parce qu’elle permet d’aller chercher un fichier XML sur<br />
le serveur en quelques lignes de code. Voici un exemple simple de page web comportant<br />
un script ECMAScript et chargeant du contenu XML, en l’occurence, deux des<br />
pages web du cours:<br />
<br />
<br />
<br />
Exemple AJAX<br />
<br />
/* Cette fonction va chercher un document XML sur<br />
le serveur et appelle la fonction afficherTitre lorsque<br />
c’est fait! */<br />
function chargeDocument(URI) {<br />
xmlhttp = new XMLHttpRequest();<br />
xmlhttp.open("GET", URI,true);<br />
xmlhttp.onreadystatechange=function() {<br />
if (xmlhttp.readyState==4) {<br />
afficheTitre(xmlhttp.responseXML);<br />
}<br />
}<br />
xmlhttp.send(null);<br />
}<br />
/* Cette fonction est appelée lorsque le document XML est<br />
chargé */<br />
CC BY-NC-SA
Tutoriel sur DOM 323<br />
function afficheTitre(doc) {<br />
// on récupère le contenu de l’unique élément titre<br />
titreele = doc.getElementsByTagName("title").item(0);<br />
if(titreele.firstChild != null)<br />
titre=titreele.nodeValue;<br />
else<br />
titre = "";<br />
// on ajoute un élément au document courant<br />
// "document" est le document XHTML, à ne pas confondre avec "doc"<br />
elementp = document.createElement("p");<br />
elementp.appendChild(document.createTextNode(titre));<br />
body = document.getElementsByTagName("body").item(0);<br />
body.appendChild(elementp);<br />
}<br />
<br />
<br />
<br />
Vous pouvez cliquer sur les liens suivants plus d’une fois.<br />
À chaque fois, votre navigateur charge un document XHTML et en<br />
affiche le titre.<br />
<br />
<br />
Récupère et affiche<br />
le titre du document domtutoriel.xhtml.<br />
<br />
Récupère et affiche<br />
le titre du document travail5.xhtml.<br />
<br />
<br />
<br />
Le code ECMAScript n’est pas très long comme vous pouvez le constater. L’attribut<br />
readyState de l’objet xmlhttp nous permet de déterminer quand le document XML a<br />
été chargé (xmlhttp.readyState==4). La propriété onreadystatechange est quant à elle<br />
appelée chaque fois que l’objet de type XMLHttpRequest change d’état. Lorsque le<br />
document XML est chargé, on peut donc appeler une fonction qui manipule le contenu<br />
de la page web (fonction afficheTitre).<br />
Voici un exemple similaire, mais qui récupère, cette fois-ci, le fichier RSS du journal<br />
le Devoir et en affiche les principales manchettes (le fichier RSS est une représentation<br />
en XML du contenu du journal). Il faut au préalable charger le fichier ledevoir.xml et le<br />
déposer dans le même répertoire que le fichier XHTML contenant le script AJAX, sur<br />
votre disque.Le fil de nouvelles du devoir se trouve normalement à l’adresse « http://<br />
www.ledevoir.com/rss/ledevoir.xml ».<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 324<br />
<br />
<br />
<br />
Exemple plus avancé en AJAX<br />
<br />
/* Cette fonction va chercher un document XML sur<br />
le serveur et appelle la fonction afficherTitres lorsque<br />
c’est fait! */<br />
function chargeDocument(URI) {<br />
try {<br />
xmlhttp = new XMLHttpRequest();<br />
xmlhttp.open("GET", URI,true);<br />
xmlhttp.onreadystatechange=function() {<br />
if (xmlhttp.readyState==4) {<br />
afficheTitres(xmlhttp.responseXML);<br />
}<br />
}<br />
xmlhttp.send(null);<br />
} catch(o) {alert(o);}<br />
}<br />
/* Cette fonction est appelé lorsque le document XML est<br />
chargé */<br />
function afficheTitres(doc) {<br />
titres = doc.getElementsByTagName("title");<br />
elementol = document.createElement("ol");<br />
var longueur = titres.length;<br />
for ( k = 0; k < longueur ; ++k) {<br />
elementli = document.createElement("li");<br />
elementli.appendChild(<br />
document.createTextNode(<br />
titres[k].firstChild.nodeValue<br />
)<br />
);<br />
elementol.appendChild(elementli);<br />
}<br />
body = document.getElementsByTagName("body").item(0);<br />
body.appendChild(elementol);<br />
}<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Tutoriel sur DOM 325<br />
Récupère<br />
et affiche les nouvelles du devoir.<br />
<br />
<br />
<br />
Finalement, si on souhaite insérer non pas seulement du texte, mais des éléments provenant<br />
d’un autre document, on peut obtenir ce résultat avec la fonction importNode :<br />
<br />
<br />
<br />
Exemple AJAX avec importNode<br />
<br />
/* Cette fonction va chercher un document XML sur<br />
le serveur et appelle la fonction afficheListe lorsque<br />
c’est fait! */<br />
function chargeDocument(URI) {<br />
xmlhttp = new XMLHttpRequest();<br />
xmlhttp.open("GET", URI,true);<br />
xmlhttp.onreadystatechange=function() {<br />
if (xmlhttp.readyState==4) {<br />
afficheListe(xmlhttp.responseXML);<br />
}<br />
}<br />
xmlhttp.send(null);<br />
}<br />
/* Cette fonction est appelé lorsque le document XML est<br />
chargé */<br />
function afficheListe(doc) {<br />
ule = doc.getElementsByTagName("ul").item(0);<br />
// on récupère l’élément ul avec tout son contenu:<br />
body = document.getElementsByTagName("body").item(0)<br />
body.appendChild(document.importNode(ule,true));<br />
}<br />
<br />
<br />
<br />
Vous pouvez cliquer sur les liens suivants plus d’une fois.<br />
À chaque fois, votre navigateur charge un document XHTML et en<br />
affiche une partie du contenu.<br />
<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 326<br />
Récupère et affiche<br />
une liste du document domtutoriel.xhtml.<br />
Récupère et affiche<br />
une liste du document travail5.xhtml.<br />
<br />
<br />
<br />
La classe XMLHttpRequest fait l’objet d’une spécification du W3C. La construction<br />
d’un objet XMLHttpRequest est simple (xmlhttp = new XMLHttpRequest();) et généralement<br />
suivie de l’appel xmlhttp.open qui prend de 2 à 5 paramètres dont la méthode,<br />
l’URL, une valeur booléenne stipulant si l’appel est synchrone ou asynchrone, un nom<br />
d’utilisateur et un mot de passe. Les deux derniers paramètres sont utilisés si la ressource<br />
est protégée par mot de passe. On utilise généralement des appels asynchrone,<br />
pour éviter que le navigateur ne fige en attendant la réponse du serveur. La méthode est<br />
une des méthodes définie par le protocole HTTP (RFC 2616) dont GET, PUT, POST,<br />
et DELETE.<br />
On utilise le plus souvent AJAX avec des requêtes GET. Comme les requêtes<br />
GET ne nécessitent pas la transmission d’un document, on termine la requête avec<br />
« xmlhttp.send(null); ». Puisque la requête est asynchrone (le plus souvent) on doit<br />
définir une fonction qui sera appelée lorsque la réponse arrivera du serveur (onreadystatechange).<br />
Si la réponse du serveur est un fichier XML, on peut le récupérer avec<br />
l’attribut « responseXML ». Le document responseXML s’utilise comme tout document<br />
DOM. On peut aussi manipuler le document XHTML qui a fait l’appel AJAX<br />
avec l’API DOM.<br />
En somme, si on connaît bien l’API DOM, et si on connaît un peu d’ECMAScript,<br />
il est facile de développer des applications AJAX si on cible un navigateur comme<br />
Firefox. Par contre, les navigateurs diffèrent souvent beaucoup les uns des autres et, en<br />
particulier, Internet Explorer ne respecte pas les recommandations du W3C ce qui rend<br />
le développement plus difficile.<br />
Voici quelques sites qui utilisent AJAX :<br />
– http://www.objectgraph.com/dictionary/<br />
– http://www.google.com/webhp<strong>complet</strong>e=1&hl=en<br />
– http://maps.google.com/<br />
Le site mozilla.org a plusieurs articles sur AJAX (en anglais). Depuis mai 2006,<br />
Google rend disponible gratuitement son Google Web Toolkit qui permet de construire<br />
des applications AJAX en Java fonctionnant avec tous les principaux navigateurs. Il<br />
existe d’autres librairies AJAX telles que Dojo, Rico, et la Yahoo! User Interface<br />
Library. Une librairie particulièrement intéressante est la librairie Prototype (http://<br />
www.prototypejs.org/) qui est constituée d’un seul fichier ECMAScript.<br />
CC BY-NC-SA
DOM 327<br />
Malheureusement, le traitement d’un document XML en ECMAScript est parfois inutilement<br />
lourd. Pour cette raison, on remplace souvent le XML par du JavaScript Object<br />
Notation (JSON) ou par du HTML.<br />
4.4.16 DOM et autres langages<br />
L’API DOM est supportée en C++ (voir Xerces-C), en Python (paquetage xml.dom),<br />
en Perl (voir Xerces-P), en ECMAScript, etc. C’est d’ailleurs la principale force de<br />
cette API : peu importe le contexte, il y a fort à parier que vous aurez accès à l’API<br />
DOM. Ce n’est sans doute pas la meilleure API possible, mais son ubiquité fait en sorte<br />
qu’il vaut la peine d’apprendre à la connaître.<br />
4.4.17 Conclusion<br />
Dans ce tutoriel, nous avons appris à lire et à écrire du XML à partir du Java. Nous<br />
avons aussi appris à mieux comprendre le modèle DOM et, en particulier, sa structure<br />
en arbre. Vous devriez maintenant être en mesure de commencer à créer des applications<br />
Java, de filtrer, fusionner et modifier du XML.<br />
4.4.18 Livres de référence<br />
– Elliotte Rusty Harold, Processing XML with Java: A Guide to SAX, DOM, JDOM,<br />
JAXP, and TrAX, Addison-Wesley Professional, 2002, 1120 pages.<br />
– Frank W. Zammetti, Practical Ajax Projects with Java Technology, Apress, 2006,<br />
504 pages.<br />
– Brett McLaughlin, Head Rush AJAX, O’Reilly Media, 2006, 413 pages.<br />
4.5 DOM<br />
4.5.1 Objectif<br />
Comprendre l’approche DOM.<br />
4.5.2 Activité<br />
Lisez le texte qui suit, puis répondez au questionnaire d’autoévaluation en vous référant<br />
au tutoriel sur DOM que vous venez d’utiliser.<br />
On peut définir DOM comme un ensemble d’API (Application Program Interface) :<br />
un ensemble de fonctions et d’objets que l’on peut utiliser en Java (ou autres langages<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 328<br />
similaires) pour manipuler le XML selon un modèle en arbre. Dans ce cours, nous<br />
allons nous pencher plus particulièrement sur l’incarnation Java de DOM.<br />
Note.- Le terme DOM désigne aussi un type de modèle en arbre représentant le XML.<br />
Il y a donc deux significations au terme « DOM » : un ensemble d’API utilisant un<br />
modèle en arbre ou un certain modèle en arbre.<br />
Un des avantages de DOM est qu’il est indépendant du langage ou de la plate-forme.<br />
Ainsi, si vous connaissez DOM, vous pourrez l’utiliser dans plusieurs contextes différents.<br />
Ce qui est peut-être le plus important, c’est que les concepts propres à DOM se<br />
retrouvent dans d’autres API pour traiter le XML, qu’elles soient produites par Microsoft,<br />
Sun Microsystems ou d’autres auteurs.<br />
Dans une API DOM, tous les éléments sont immédiatement accessibles : on lit le fichier<br />
une fois et il est ensuite totalement en mémoire. La contrepartie de cet avantage est que<br />
DOM utilise beaucoup de mémoire parce qu’il doit charger la totalité des fichiers XML.<br />
Notez toutefois que, dans le contexte DOM, il serait possible, en principe, de ne pas<br />
tout charger en mémoire.<br />
Comme nous l’avons vu, l’API DOM permet de créer des documents XML, de<br />
naviguer dans des documents XML, d’ajouter, de modifier ou d’éliminer des éléments<br />
XML.<br />
4.5.3 Questions d’auto-évaluation<br />
1. Si j’ai une application DOM et que je charge 100 fichiers XML faisant un Mo<br />
chacun, je m’attends que mon programme utilise au moins 100 Mo.<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
2. Un arbre DOM est constitué d’éléments contenant d’autres éléments. Choisissez<br />
la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
3. Dans un arbre DOM, que trouve-t-on à la racine Choisissez la bonne réponse<br />
parmi les choix suivants.<br />
(a) L’élément-racine du document XML.<br />
(b) Il n’y a pas de racine unique.<br />
(c) Le document lui-même contenant, parmi d’autres choses, l’élément-racine<br />
du document XML.<br />
4. Parmi les types de nœuds DOM suivants, quels sont ceux qui ne peuvent pas<br />
avoir d’enfants Choisissez toutes les réponses qui s’appliquent.<br />
CC BY-NC-SA
DOM 329<br />
(a) DocumentType (modèle pour une déclaration de type de document)<br />
(b) Element (modèle pour un élément)<br />
(c) Comment (modèle pour un commentaire)<br />
(d) Document (modèle pour le document lui-même)<br />
(e) Text (modèle pour du texte contenu dans un élément)<br />
5. Un arbre DOM donne accès à tout le contenu en information pertinente d’un<br />
document XML. Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
6. Un arbre DOM correspond à un document XML unique. Choisissez la bonne<br />
réponse parmi les choix suivants.<br />
(a) Vrai<br />
(b) Faux<br />
4.5.4 Solutions<br />
1. (a) (Bonne réponse) Effectivement.<br />
(b) L’affirmation est correcte : DOM utilise beaucoup de mémoire.<br />
2. (a) L’affirmation est techniquement incorrecte. C’est un arbre de nœuds et les<br />
nœuds ne sont pas tous des éléments. Par exemple, une instruction de traitement<br />
ou une déclaration de type de document est un nœud.<br />
(b) (Bonne réponse) Effectivement. XML est une structure d’arbre en éléments,<br />
mais DOM utilise une structure plus générale d’arbre de nœuds,<br />
où les nœuds n’ont pas à être des éléments. En général, par contre, seuls les<br />
éléments (et le document) peuvent avoir des descendants.<br />
3. (a) Non. Si c’était le cas, on ne pourrait avoir accès à la déclaration de type de<br />
document, par exemple.<br />
(b) Ce ne serait alors pas un arbre.<br />
(c) (Bonne réponse) Effectivement.<br />
4. (a) (Bonne réponse) La déclaration de type de document n’a pas d’enfants; elle<br />
ne peut pas contenir, par exemple, des éléments.<br />
(b) Un élément peut avoir des enfants.<br />
(c) (Bonne réponse) Les commentaires ne peuvent pas avoir d’enfants.<br />
(d) Le document peut avoir des enfants.<br />
(e) (Bonne réponse) Du texte ne peut pas avoir d’enfants.<br />
5. (a) (Bonne réponse) DOM est <strong>complet</strong> : vous pouvez obtenir tout le contenu<br />
en information du document XML. Dans un logiciel normal, il ne devrait<br />
jamais être nécessaire d’utiliser autre chose que DOM pour extraire l’information<br />
contenue dans un document XML.<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 330<br />
(b) L’affirmation était correcte.<br />
6. (a) Il peut y avoir plusieurs documents disposés différemment, mais contenant<br />
la même information.<br />
(b) (Bonne réponse) C’est juste. Deux librairies DOM pourraient, avec le<br />
même arbre, générer des documents XML différents.<br />
4.6 Travail noté 5<br />
4.6.1 Objectifs et pondération<br />
Le travail noté 5, une activité de programmation Java, compte pour 15 % de la note<br />
globale du cours.<br />
Il contribue à l’atteinte des objectifs suivants :<br />
– Apprécier les coûts de développement de solutions XML au sein d’une organisation.<br />
– Appliquer la méthodologie orientée objet pour la consommation, la fusion et le filtrage<br />
des fichiers XML.<br />
Le travail comporte cinq exercices, valant respectivement 3, 4, 4, 2 et 2 points, pour un<br />
total de 15 points.<br />
4.6.2 Consignes générales<br />
1. Utilisez les noms des fichiers spécifiés dans chaque exercice.<br />
2. Vous n’avez droit qu’à un seul fichier « .java » par exercice et il ne doit pas<br />
contenir plus de 500 lignes de code. Tous les problèmes peuvent être résolus en<br />
moins de 100 lignes! Rappelons qu’une « ligne » de code comprend un maximum<br />
de 80 caractères.<br />
3. Chaque fichier doit débuter par un commentaire donnant le sigle du cours et votre<br />
nom comme ceci :<br />
/**<br />
* <strong>INF</strong> <strong>6450</strong> - Travail noté 5 - Votre nom, fait avec SDK 1.5.0_06<br />
*/<br />
4. Vous devriez pouvoir accéder à la version de votre SDK, en tapant « javac -<br />
version » ou « java -version » dans une ligne de commande.<br />
5. Ne traitez pas les cas d’exception, comme les fichiers qui n’existent pas ou ne<br />
peuvent être ouverts. Par contre, votre code doit produire un résultat correct dans<br />
des conditions normales. Par exemple, si on vous demande de produire du XML,<br />
il doit s’agir de XML bien formé. Si on vous demande de lire du XML, vous<br />
devez pouvoir lire tout XML qui se conforme aux spécifications décrites dans<br />
l’exercice. Vous devez utiliser l’API DOM.<br />
CC BY-NC-SA
Travail noté 5 331<br />
6. Il est impératif que vos fichiers compilent avec le SDK (le plus récent), sans<br />
utiliser de librairies particulières. Un fichier Java qui ne compile pas ne sera<br />
pas noté.<br />
7. Lorsque vous aurez terminé les exercices, vous devez transmettre à votre personne<br />
tutrice, par courriel, l’ensemble des fichiers avec l’extension Java comme<br />
fichiers attachés. Vous devez aussi remettre un fichier XML ainsi qu’un document<br />
(Word 97/2000/XP, ODF, PDF, RTF ou en format texte) clairement identifié<br />
à votre nom contenant l’analyse demandée à la première question du travail.<br />
L’objet de votre courriel doit commencer par « [<strong>INF</strong><strong>6450</strong>][TRAVAIL5] »;<br />
dans le message, indiquez votre nom, votre numéro d’étudiant (8 chiffres),<br />
la date de remise de votre travail et le nom de votre personne tutrice, ainsi<br />
que les mentions « Travail noté 5 » et « <strong>INF</strong> <strong>6450</strong> ». Ne transmettez pas une<br />
archive compressée (zip ou autre). Il s’agit d’un travail personnel et vous ne<br />
devez pas partager vos solutions.<br />
4.6.3 Exercice 1<br />
Supposons une liste de transactions avec un attribut « montant » pour chaque client,<br />
comme dans le document XML suivant :<br />
<br />
<br />
<br />
<br />
Quelle est la dernière marque<br />
<br />
<br />
<br />
<br />
<br />
Où puis-je trouver le modèle 2002<br />
<br />
<br />
<br />
Supposons que le fichier se nomme « transactions.xml ».<br />
Nous ne savons pas combien de transactions il peut y avoir par client; nous ne savons<br />
pas combien de clients nous avons; de plus, nous ne connaissons pas les noms<br />
des clients d’avance. Nous supposons que l’élément-racine est toujours « liste »; que<br />
tous les éléments « transaction » ont un attribut « montant »; que tous les éléments<br />
« transaction » sont dans des éléments « client »; que les éléments « client » sont tous<br />
dans l’élément-racine et ont tous un attribut « nom ». Nous supposons également qu’il<br />
n’y aura pas deux attributs « nom » avec la même valeur (même nom). Enfin, nous<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 332<br />
supposons que toutes les valeurs d’attribut de « montant » sont des entiers (« int » en<br />
Java).<br />
Écrivez un programme qui calcule la somme des valeurs de l’attribut « montant » pour<br />
chaque client (seuls les attributs « montant » des éléments « transaction »). Nous supposons<br />
qu’il s’agit de nombres entiers, des dollars par exemple. Le code source de votre<br />
programme sera dans un fichier nommé « Transactions.java ».<br />
Ainsi, la commande « java Transactions transactions.xml » devra donner :<br />
Nom du client: Jean Charles<br />
Somme: 1700<br />
Nom du client: Pierre Élisabeth<br />
Somme: 3400<br />
Comparez la solution que vous obtenez en utilisant DOM avec ce qui est possible<br />
de faire avec XSLT, en fonction du temps de développement. Donnez au moins un<br />
avantage de l’approche DOM sur l’approche XSLT et un avantage de l’approche XSLT<br />
sur DOM. Vous devez remettre une solution XSLT sous la forme d’un document XML.<br />
Vous pouvez mettre des commentaires dans votre code Java, mais la comparaison entre<br />
DOM et XSLT doit être faite dans un document à part.<br />
4.6.4 Exercice 2<br />
Avec XSLT, nous pouvons combiner plusieurs documents en utilisant la fonction « document<br />
» qui permet de charger plusieurs documents XML. Mais que se passe-t-il<br />
lorsque nous devons combiner plusieurs documents, dont certains ne sont pas en XML<br />
À ce moment, l’utilisation d’un langage comme Java et de DOM peut être très avantageuse.<br />
Supposons qu’un serveur enregistre les achats effectués sur le site, dans un fichier texte,<br />
en plaçant chaque achat sur une ligne avec des informations séparées par des virgules.<br />
Le fichier se nomme « achats.txt » :<br />
Jean Charles, 3214324565, 321, 2<br />
Yvan Richard, 5435435545, 321, 1<br />
Yvette Gagnon, 4324324243, 1, 12<br />
Sur chaque ligne, se trouvent le nom du client, son numéro de carte de crédit, le code<br />
du produit acheté et la quantité achetée. Nous supposons que le serveur est un logiciel<br />
commercial et qu’il n’est pas possible de le modifier pour obtenir le format des données<br />
en XML.<br />
Par ailleurs, nous avons un document XML contenant notre inventaire; le fichier se<br />
nomme « inventaire.xml ». Le voici :<br />
<br />
<br />
<br />
CC BY-NC-SA
Travail noté 5 333<br />
<br />
<br />
<br />
Écrivez un programme qui met à jour l’inventaire en tenant compte des achats de la<br />
journée, contenus dans le fichier « achats.txt ». Votre code source devra se trouver<br />
dans le fichier « Inventaire.java » et la commande « java Inventaire achats.txt inventaire.xml<br />
» va modifier le fichier « inventaire » pour y soustraire les produits achetés<br />
ce qui, dans le cas qui nous concerne, donnera un fichier « inventaire.xml » ayant le<br />
contenu suivant :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Nous pouvons supposer que le fichier « inventaire.xml » ne contient qu’un seul élément<br />
« produit » pour chaque valeur d’attribut « code ». Nous pouvons aussi supposer qu’aucun<br />
code invalide n’apparaît dans le fichier « achats.txt ». Par contre, nous ne savons<br />
pas combien de produits nous avons et combien d’achats il y aura. Évidemment, il est<br />
possible d’avoir un nombre négatif de produits dans notre inventaire.<br />
Indice.- Il est parfaitement possible d’écrire un tel programme en moins de 50 lignes.<br />
4.6.5 Exercice 3<br />
Il arrive que les données initiales ne soient pas en XML. Dans cet exercice, nous vous<br />
demandons de concevoir une calculatrice qui affiche ses résultats en XML (MathML<br />
pour être plus précis).<br />
Tout d’abord, pour vous convaincre qu’on peut écrire des équations en XML, transcrivez<br />
le contenu XML suivant dans un fichier nommé « math.xml » :<br />
<br />
<br />
<br />
1<br />
+<br />
2<br />
=<br />
3.0<br />
<br />
<br />
Si vous ouvrez ce ficher dans Mozilla Firefox, vous devriez voir s’afficher le texte « 1 +<br />
2 = 3 ». Cela signifie que Firefox reconnaît la syntaxe MathML. Vous pouvez constater<br />
CC BY-NC-SA
Module 4 : Traitement du XML en Java 334<br />
que cette syntaxe n’est pas très complexe, du moins pour des exemples simples. Sachez<br />
que l’espace de noms de MathML est « http://www.w3.org/1998/Math/MathML ». Il<br />
faut utiliser comme élément-racine un élément « math », lui-même contenant un élément<br />
« mrow ». L’élément « mrow » pourra contenir un succession d’éléments « mn »<br />
(pour les nombres) et d’éléments « mo » (pour les opérateurs, comme « + », « < »,<br />
« > », « - »). Si le résultat attendu est du texte, comme « vrai » ou « faux », il faut<br />
utiliser l’élément « mrow » contenant un élément « mtext » qui lui contient le texte, par<br />
exemple vrai).<br />
Vous devez créer un programme dont le code source se trouvera dans un fichier nommé<br />
« Calculatrice.java Votre programme doit utiliser l’API DOM. La calculatrice ne<br />
saura faire que 4 opérations : addition, soustraction et deux opérations de comparaison<br />
(< et >) dont la réponse est « vrai » ou « faux ». Ainsi, toutes les opérations se retrouvent<br />
dans la forme : 1 + 2, 1 - 2, 1 < 2 et 2 > 1.<br />
Par exemple, la commande « java Calculatrice 1.5 "
Travail noté 5 335<br />
4.6.6 Exercice 4<br />
Il est parfois pénible d’utiliser l’interface DOM quand on cherche une seule information<br />
précise. Écrivez un programme Java qui permet d’extraire le prix correspondant à<br />
l’item ayant le code de produit 321 dans un fichier XML ayant la forme suivante en<br />
utilisant une expression XPath.<br />
<br />
<br />
<br />
<br />
<br />
<br />
4.6.7 Exercice 5<br />
En utilisant AJAX, on peut rendre une page web dynamique. Malheureusement, pour<br />
des raisons de sécurité, un script dans une page web ne peut charger un fichier qui se<br />
trouve dans un domaine autre que celui d’origine. On vous demande donc de déposer<br />
le fichier ledevoir.xml (il faut suivre l’hyperlien) sur votre machine et de créer une<br />
page web AJAX capable de charger le fichier XML en question et d’afficher tant le<br />
titre des nouvelles que leur description complète. Attention, il ne faut récupérer que le<br />
contenu des éléments au sein des éléments item. Vous pouvez supposer que les titres et<br />
descriptions ne contiennent que du texte, sans éléments HTML. Si vous préférez, vous<br />
pouvez aussi utiliser le dernier fil de nouvelle du devoir, disponible à l’adresse « http:/<br />
/www.ledevoir.com/rss/ledevoir.xml ».<br />
Si les descriptions contiennent du texte sous la forme <a href="...">, il n’est pas<br />
nécessaire de les afficher sous la forme d’hyperliens.<br />
Certains étudiants trouvent utile d’utiliser la syntaxe « try catch(e) » de l’ECMAScript<br />
(qui fonctionne comme en Java) pour traiter les erreurs. Cependant, cette syntaxe n’est<br />
pas nécessaire.<br />
CC BY-NC-SA
Module 5 : Resource<br />
Description Framework (RDF)<br />
5.1 Aperçu<br />
5.1.1 Objectifs<br />
Les graphes annotés sont un outil puissant de représentation des connaissances; en<br />
XML, on utilise certains graphes dirigés et annotés. Le module 5 porte sur le « Resource<br />
Description Framework (RDF) », une forme de représentation des connaissances;<br />
le modèle RDF est un modèle de graphe pouvant s’écrire en XML.<br />
Bien qu’il s’agisse d’une norme qui fait appel à des concepts abstraits, dans la pratique,<br />
le RDF est très utilisé. Il suffit de faire une recherche sur le web sur des sujets comme<br />
« Dublin Core, Creative Commons, FOAF, RSS 1.0 » pour constater à quel point le<br />
RDF est présent. Le résultat d’une recherche sur Google pour « Dublin Core » donne<br />
1,2 million de pages; la recherche sur « Creative Commons » annonce 5,5 millions de<br />
pages et celle sur « FOAF » donne 1,5 million de pages. De plus, le RDF est intimement<br />
lié au XML, car très souvent des données RDF sont écrites en format XML.<br />
L’objectif spécifique du module est :<br />
– Interpréter un fichier RDF comme un tableau sujet/verbe/objet.<br />
Une activité, le travail noté 6, nous permettra d’évaluer votre atteinte de cet objectif.<br />
Avant d’entreprendre votre démarche, lisez le texte qui suit.<br />
5.1.2 Représentation des connaissances et graphes<br />
Le cours porte sur le XML en tant qu’outil pour la gestion des connaissances. Nous<br />
avons vu, dans les modules précédents, le rôle que peut jouer le XML comme outil<br />
dans la gestion des données, qui sont une forme de connaissances de premier niveau : le<br />
337
Module 5 : Resource Description Framework (RDF) 338<br />
XML rend plus facile l’échange et la transformation des données. De plus, notamment<br />
dans le module 2, nous avons vu que le XML permet le marquage « sémantique »<br />
des informations; le XML s’impose donc naturellement comme outil de gestion des<br />
connaissances. En effet, prenons cet exemple de marquage sémantique :<br />
<br />
<br />
Jean<br />
3 février 1971<br />
<br />
Ce document XML contient non seulement l’information souhaitée, mais en plus, à un<br />
niveau élémentaire, il nous permet de comprendre le sens de cette information, grâce<br />
aux noms des balises.<br />
Cependant, utiliser le nom des balises pour représenter les connaissances n’est pas<br />
toujours très pratique. Supposons que nous ayons deux documents XML semblables à<br />
celui de l’exemple précédent. Comment pouvons-nous représenter le fait que les deux<br />
personnes sont amies<br />
Une façon plus naturelle de représenter les connaissances est d’utiliser des graphes.<br />
Un graphe est un ensemble de nœuds liés par des relations d’un nœud à un autre. Par<br />
exemple, l’ensemble des pages web forme un graphe avec la relation « contient un<br />
lien vers ». On dit que le graphe est « dirigé » si les relations sont à sens unique.<br />
Le web est un exemple de graphe dirigé : une page web peut avoir un lien vers une<br />
autre page web, qui elle-même ne contient pas un lien de retour vers la page d’origine.<br />
On dit qu’un graphe est « annoté » si les relations entre deux nœuds peuvent être de<br />
différentes natures. Par exemple, une communauté d’humains forme un graphe dirigé<br />
avec les relations « est ami avec » et « est parent avec ». Supposons que les relations<br />
« est ami avec » et « est parent avec » soient réflexives, alors le graphe d’humains<br />
est annoté, mais pas dirigé. Par contre, si nous acceptons qu’une personne puisse être<br />
l’ami de quelqu’un sans que cette personne soit son ami, alors le graphe d’humains<br />
sera annoté et dirigé.<br />
Pour des raisons pratiques, nous représentons les graphes avec des tableaux en trois<br />
colonnes.<br />
5.1.3 Démarche<br />
Il faut avoir terminé le premier module avant de s’attaquer au module 5; en outre,<br />
il sera très utile d’avoir commencé les modules 2, 3 et 4 afin d’avoir suffisamment<br />
d’expérience avec le XML.<br />
Nous vous suggérons d’étudier, dans l’ordre, les deux textes proposés et de répondre<br />
aux questionnaires d’autoévaluation les accompagnant :<br />
– Introduction au RDF;<br />
– Le RDF par l’exemple, Dublin Core, Creative Commons, FOAF, RSS/Atom.<br />
CC BY-NC-SA
Introduction au RDF 339<br />
Le module se termine par le travail noté 6, qui prend la forme d’une activité de synthèse.<br />
Il est recommandé de répondre d’abord aux deux questionnaires d’autoévaluation avant<br />
de réaliser ce travail.<br />
5.1.4 Préparation à l’examen<br />
Une fois les activités du module terminées, vous devrez vous préparer à l’examen. Pour<br />
vérifier si vous êtes prêt, vous pouvez télécharger l’examen factice (PDF, 79 Ko). Si<br />
vous pouvez faire cet examen sans problème, tout va bien. Pour vérifier vos réponses,<br />
consultez le corrigé (PDF, 195 Ko).<br />
5.1.5 Évaluation du cours<br />
Lorsque vous aurez terminé le cours, répondez au questionnaire d’évaluation du cours<br />
(Microsoft Word, 163 Ko) , afin de nous aider à l’améliorer. Votre opinion et vos commentaires<br />
sont très importants pour nous. Nous vous remercions à l’avance de votre<br />
collaboration.<br />
5.2 Introduction au RDF<br />
5.2.1 Introduction<br />
Le Resource Description Framework (RDF) est un langage pour les métadonnées sur<br />
le web, c’est-à-dire un langage pour énoncer ce que l’on sait sur quelque chose ou<br />
quelqu’un. Par exemple, le RDF est idéal pour indiquer qui est l’auteur d’un document<br />
ou quel est le titre du document. De plus, le langage RDF est prévu pour être à la fois<br />
simple (mais tout est relatif), suffisamment puissant pour « tout » décrire, et facilement<br />
utilisable par des logiciels. Dans le deuxième texte que nous proposons, Le RDF par<br />
l’exemple, nous verrons quelques applications intéressantes. Pour l’instant, nous ne<br />
présentons dans ce texte que les concepts de base.<br />
5.2.2 Point de vue critique<br />
Le RDF demeure relativement peu utilisé dans des applications complexes, même s’il<br />
s’agit d’une idée simple et élégante. Une des raisons qui contribue sans aucun doute à<br />
ce manque de popularité du RDF, est la syntaxe RDF/XML qui n’est pas très jolie.<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 340<br />
5.2.3 Notions de base<br />
Le RDF a été normalisé en 1999 (par une recommandation W3C) et est un effort commun<br />
de plusieurs experts. Le RDF se veut suffisamment riche pour représenter de façon<br />
formelle la connaissance tout en étant simple à utiliser. Une des prémisses du format<br />
RDF est que tout peut être énoncé en utilisant des triplets : sujet, verbe et objet. Notez<br />
que certains auteurs utiliseront le terme « prédicat » au lieu du terme « verbe ». Par<br />
exemple, pour décrire « Jean », nous dirons que « Jean est un garçon » et nous décomposerons<br />
ainsi cette affirmation : , ou l’afficherons dans un<br />
tableau :<br />
Sujet Verbe Objet<br />
Jean est garçon<br />
Nous ne faisons pas de la grammaire, mais bien de la représentation : le verbe n’a pas<br />
à être un verbe de la langue française ou anglaise. L’important est que le verbe soit un<br />
lien, une relation, entre une première chose (sujet) et une seconde (objet). Par exemple,<br />
si nous voulons affirmer que le titre de la page web « http://www.daniel-lemire.com/ »<br />
est « Daniel Lemire’s blog », nous pouvons le faire à l’aide du tableau suivant :<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/<br />
titre<br />
Daniel Lemire’s blog<br />
Ces exemples de représentation ne sont pas encore des exemples de données « RDF »,<br />
car en RDF, le verbe doit être un URI. Le RDF, tout comme le XML, est fait pour<br />
être traité par des machines et les machines sont bêtes. Elles ne savent pas ce que<br />
signifie le mot « titre » dans le tableau précédent. Est-ce un titre à la Bourse, le titre<br />
d’une fonction (comme docteur) ou le titre d’une page Pour régler ce problème, il<br />
faut utiliser des URI (Uniform Resource Identifier), c’est-à-dire des adresses fictives<br />
qui identifient une ressource Internet.<br />
Un URI contient un protocole (http, mailto, ftp, etc.), un domaine comme « fichiers.com<br />
» et un chemin comme « /mesfichiers/index.html ». Dans ce cours, nous<br />
adoptons la norme RFC2396 et nous permettons que les URI comportent le symbole<br />
du dièse ( # ), comme « ftp://fichiers.com#maman » : tout ce qui apparaît après ce symbole<br />
forme le « fragment ». Notons que les accents ne peuvent pas être utilisés dans<br />
un URI; ainsi, « http://école.com » n’est pas un URI valable. Un protocole particulier,<br />
« urn », est parfois utilisé dans les URI. Par exemple, pour identifier un livre par son<br />
code ISBN, nous pouvons utiliser l’URI « urn:ISBN:0-123-12345-1 ». La casse est significative<br />
dans un URI sauf pour le nom du protocole (HTTP ou http) et le nom du<br />
domaine (xerox.com ou XEROX.COM).<br />
Toutes les URL (Uniform Resource Locator) utilisées sur le web, comme<br />
« http://www.google.com », « mailto:bill@microsoft.com », « ftp://fichiers.com »,<br />
ainsi que d’autres adresses ayant la même syntaxe, mais qui ne pointent pas nécessairement<br />
vers une ressource Internet existante, sont des exemples d’URI. Ainsi, si l’on vous<br />
donne l’URI « http://www.mydomain.com/daniel », il n’est pas certain qu’une page<br />
CC BY-NC-SA
Introduction au RDF 341<br />
web se trouve à cette adresse. Le seul but des URI est d’identifier des ressources. Le mot<br />
« ressource » a un sens très, très large : tout peut être considéré comme une ressource.<br />
Par exemple, pour identifier l’humoriste « Daniel Lemire », nous pouvons adopter<br />
l’URI « http://www.daniellemire.com/luimeme »; ce sera un bon choix si l’humoriste<br />
en question est propriétaire du nom de domaine (daniellemire.com) et compte le garder<br />
longtemps. Par ailleurs, on pourra utiliser l’URI « http://www.daniel-lemire.com/fr/ »<br />
pour identifier le professeur « Daniel Lemire » qui est responsable d’un cours portant<br />
sur le XML. Dans ce dernier exemple, l’URI est aussi un URL qui pointe vers la page<br />
personnelle du professeur. Nous voyons immédiatement l’avantage des URI : alors que<br />
l’ordinateur ne saura pas toujours faire la différence entre « Daniel Lemire » l’humoriste<br />
et « Daniel Lemire » le professeur, nous pourrons, en utilisant des URI, analyser<br />
automatiquement l’information, à la condition que tous utilisent le même URI pour<br />
représenter la même ressource. Pour distinguer les individus, nous pourrions utiliser<br />
leur numéro d’assurance sociale... Mais comme le concept de ressource est général, il<br />
faut aussi pouvoir distinguer les différentes significations que peuvent prendre le mot<br />
« titre », et ainsi de suite. La langue française (ou anglaise) permet à un mot d’avoir<br />
plusieurs sens, alors que chaque URI représente un concept et un concept seulement.<br />
Supposons maintenant que nous voulions décrire l’affirmation suivante en RDF :<br />
« Il y a une personne appelée Daniel Lemire dont l’adresse de courriel est dlemire@teluq.uqam.ca<br />
et qui est professeur. » Cette phrase peut être très difficile à<br />
analyser par un ordinateur. Commençons par la décomposer en affirmations simples :<br />
sujet/verbe/objet. D’abord, pour qu’il n’y ait pas de confusion, nous allons identifier<br />
l’individu s’appelant Daniel Lemire par l’URI « http://www.daniel-lemire.com/fr/ ».<br />
– http://www.daniel-lemire.com/fr/ est une personne.<br />
– http://www.daniel-lemire.com/fr/ s’appelle Daniel Lemire.<br />
– http://www.daniel-lemire.com/fr/ peut être joint par courriel à dlemire@teluq.uqam.ca.<br />
– http://www.daniel-lemire.com/fr/ a le titre de professeur.<br />
Rappelons ici que tous les verbes et tous les sujets doivent être identifiés par des URI.<br />
En ce qui nous concerne, il n’y a qu’un seul sujet identifié par « http://www.daniellemire.com/fr/<br />
». Il reste à trouver des URI pour les verbes et certains objets. Prenons<br />
d’abord la première affirmation : « http://www.daniel-lemire.com/fr/ est une personne<br />
». Le verbe « être », dans cette phrase, associe la classe « personne » (au même<br />
sens que dans la programmation orientée objet) à la ressource « http://www.daniellemire.com/fr/<br />
». Nous pourrions inventer un URI ayant ce sens, mais il en existe déjà<br />
un : « http://www.w3.org/1999/02/22-rdf-syntax-ns#type ». Chaque fois que nous rencontrons<br />
cet URI, cela signifie qu’une ressource appartient à une certaine classe. Quant<br />
à l’objet « personne », il existe au moins un URI pour noter la classe « personne »,<br />
soit « http://www.w3.org/2000/10/swap/pim/contact#Person ». Nous verrons que dans<br />
d’autres contextes, d’autres URI peuvent être utilisés avec un sens similaire.<br />
Finalement, l’affirmation « http://www.daniel-lemire.com/fr/ est une personne » peut<br />
s’écrire comme ceci :<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 342<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/<br />
http://www.w3.org/1999/ http://www.w3.org/<br />
en/<br />
02/22-rdf-syntax-ns#type 2000/ 10/swap/pim/<br />
contact#Person<br />
Passons maintenant à la deuxième affirmation : « http://www.daniel-lemire.com/fr/<br />
s’appelle Daniel Lemire ». Le verbe « s’appelle » peut être identifié par l’URI<br />
« http://www.w3.org/2000/10/swap/pim/contact#fullName ». Encore une fois, nous aurions<br />
pu inventer notre propre URI, en autant que nous utilisons toujours le même avec<br />
la même signification. L’objet, « Daniel Lemire », n’a pas de signification particulière<br />
et n’est qu’une chaîne de caractères; nous ne sommes donc pas tenus d’utiliser un URI.<br />
Cela n’est vrai que pour les objets : les sujets et les verbes doivent toujours être représentés<br />
par des URI en RDF. Nous obtenons le tableau suivant :<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/<br />
en/<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#fullName<br />
"Daniel Lemire"<br />
Nous notons les chaînes de caractères avec les guillemets : alors que<br />
« http://www.unuri.org » est un URI, « "http://www.unuri.org" » est une chaîne<br />
de caractères.<br />
Dans l’affirmation « http://www.daniel-lemire.com/fr/ peut être joint par<br />
courriel à dlemire@teluq.uqam.ca », nous pouvons remplacer le verbe par<br />
« http://www.w3.org/2000/10/swap/pim/contact#mailbox ». Quant à l’objet « dlemire@teluq.uqam.ca<br />
», c’est une adresse de courriel; afin qu’un ordinateur puisse<br />
comprendre qu’il s’agit d’une adresse de courriel et non d’une chaîne de caractères,<br />
nous utiliserons l’URL « mailto:dlemire@teluq.uqam.ca » pour le représenter. Nous<br />
avons donc le tableau suivant :<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/<br />
en/<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#mailbox<br />
L’affirmation « http://www.daniel-lemire.com/fr/ a le titre de professeur » se traite de<br />
la même manière, de telle sorte que nous obtenons finalement le tableau suivant :<br />
Sujet Verbe Objet<br />
mailto:dlemire@teluq.uqam.ca<br />
http://www.daniellemire.com/<br />
en/<br />
http://www.daniellemire.com/<br />
en/<br />
http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#fullName<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#Person<br />
"Daniel Lemire"<br />
CC BY-NC-SA
Introduction au RDF 343<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/<br />
http://www.w3.org/ mailto:dlemire@teluq.uqam.ca<br />
en/<br />
2000/ 10/swap/pim/<br />
http://www.daniellemire.com/<br />
en/<br />
contact#mailbox<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#personalTitle<br />
"Professeur"<br />
Précisons qu’en RDF, l’ordre des affirmations est sans importance. Ainsi, l’ordre des<br />
rangées dans le tableau est sans importance.<br />
Ce tableau est une description formelle de notre phrase d’origine « Il y a une personne<br />
appelée Daniel Lemire dont l’adresse de courriel est dlemire@teluq.uqam.ca et qui est<br />
professeur. »; cette description peut être traitée par un ordinateur.<br />
Comme nous le verrons plus loin, ce tableau RDF peut s’écrire en XML de la façon<br />
suivante :<br />
<br />
<br />
<br />
Daniel Lemire<br />
<br />
Professeur<br />
<br />
<br />
On peut aussi représenter graphiquement le tableau RDF :<br />
http://www.daniel-lemire.com/fr/<br />
Type<br />
fullName<br />
mailbox<br />
personalTitle<br />
Person<br />
Daniel Lemire<br />
dlemire@teluq.uqam.ca<br />
Professeur<br />
Nous pouvons également spécifier dans quelle langue une chaîne de caractères est<br />
écrite; par exemple, le mot « professeur » n’a de sens qu’en français. Pour ce faire,<br />
nous utiliserons un attribut « xml:lang » ayant pour valeur un code ISO à deux caractères<br />
pour représenter la langue : « fr » pour français, « en » pour anglais, et ainsi de<br />
suite. Notre exemple modifié se lit comme suit :<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 344<br />
Daniel Lemire<br />
<br />
Professeur<br />
<br />
<br />
Le choix de la langue ne constitue pas une nouvelle relation RDF, mais vient simplement<br />
annoter l’objet : dans un tableau sujet/verbe/objet, nous nous contenterons, par<br />
exemple, de remplacer « "Professeur" » par « "Professeur" (français) ».<br />
Nous pouvons résumer le RDF comme ceci :<br />
– Le RDF peut être utilisé pour représenter tout objet, tant un site web qu’un individu.<br />
– Le RDF peut être traité par une machine.<br />
– Le RDF est composé de triplets : sujet/verbe/objet.<br />
– Le sujet est toujours identifié par un URI; mais dans certains cas, on peut omettre<br />
l’URI et alors, un URI factice sera généré dynamiquement.<br />
– Le verbe est toujours identifié par un URI, sans aucune exception.<br />
– L’objet est soit un URI, soit une valeur explicite (une chaîne de caractères, par<br />
exemple).<br />
– Le RDF peut être représenté en XML.<br />
5.2.4 Le RDF en XML<br />
Avertissement.- Tous les contenus RDF ne peuvent être représentés en XML selon la<br />
méthode que nous venons de présenter. La grande majorité du contenu RDF peut l’être,<br />
mais il y a des exceptions. Pour éviter les problèmes, nous supposerons ici que l’URI du<br />
verbe prend la forme « http://www.domaine.com/blabla/bla#vvv ». En d’autres termes,<br />
l’URI du verbe contient le symbole du dièse ( # ) et le texte après ce symbole est un<br />
nom XML valable (pouvant être utilisé comme balise).<br />
Il existe plusieurs façons de représenter le RDF en XML, mais nous n’étudierons que<br />
l’approche préconisée par le W3C, qui est l’approche la plus courante. Par ailleurs,<br />
nous n’étudierons pas toute la syntaxe RDF/XML, mais seulement ce qui est nécessaire<br />
pour comprendre la majorité du RDF qui se trouve actuellement sur le web.<br />
En règle générale, les documents XML représentant du contenu RDF n’ont pas de<br />
DTD, mais utilisent les espaces de noms. Nous commençons habituellement un document<br />
par une déclaration XML qui sera soit « », soit « » pour permettre l’utilisation des accents<br />
français. Ensuite, viendra toujours l’élément RDF comme élément-racine. Ainsi, un<br />
des documents XML les plus simples possibles représentant du contenu RDF est :<br />
<br />
<br />
<br />
CC BY-NC-SA
Introduction au RDF 345<br />
Observez l’utilisation de l’espace de noms identifié par l’URI<br />
« http://www.w3.org/1999/02/22-rdf-syntax-ns# ». Le fait de noter l’espace de<br />
noms par les trois lettres « rdf » est sans conséquence et nous pourrions aussi écrire :<br />
<br />
<br />
<br />
L’important, c’est que l’élément-racine RDF soit dans l’espace de nom<br />
« http://www.w3.org/1999/02/22-rdf-syntax-ns# ». Supposons maintenant que<br />
nous voulions décrire l’affirmation RDF suivante :<br />
Sujet Verbe Objet<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#mailbox<br />
http://www.daniellemire.com/fr/<br />
mailto:dlemire@teluq.uqam.ca<br />
La première étape consiste à décomposer l’URI du verbe en<br />
deux parties : l’URI jusqu’au symbole « # » inclusivement, soit<br />
« http://www.w3.org/2000/10/swap/pim/contact# », et le reste du texte, soit « mailbox<br />
». La première partie devient un espace de noms, et la deuxième, appelée fragment,<br />
deviendra un nom d’élément. On utilise ensuite habituellement une balise « Description<br />
» dans l’espace de noms « http://www.w3.org/1999/02/22-rdf-syntax-ns# » avec<br />
le nom d’attribut « about » comme ceci :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Dans cet exemple, le sujet est la valeur d’attribut de « about », soit « http://www.daniellemire.com/fr/<br />
», le verbe est le nom de l’élément contenu dans l’élément<br />
« rdf:Description », ici « mailbox », auquel on ajoute en préfixe l’espace de<br />
noms auquel il appartient, soit « http://www.w3.org/2000/10/swap/pim/contact# ».<br />
L’URI de l’objet est la valeur de l’attribut « rdf:resource », soit<br />
« mailto:dlemire@teluq.uqam.ca ».<br />
Pour nous assurer de bien comprendre, voyons un autre exemple, quoique plus abstrait.<br />
Supposons que nous ayons le contenu RDF suivant :<br />
Sujet Verbe Objet<br />
http://domaine.com/<br />
page/<br />
http://domaine.com#unverbe<br />
http://www.objet.com/<br />
Nous pourrions utiliser la représentation XML suivante :<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 346<br />
<br />
<br />
<br />
<br />
<br />
<br />
Que devons-nous faire si l’objet n’est pas un URI, mais une chaîne de caractères Dans<br />
ce cas, nous omettrons l’attribut « rdf:resource » et nous placerons notre valeur dans<br />
l’élément. Ainsi, pour représenter le contenu RDF suivant :<br />
Sujet Verbe Objet<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#personalTitle<br />
"Professeur"<br />
nous pourrons utiliser le code XML qui suit :<br />
<br />
<br />
<br />
Professeur<br />
<br />
<br />
Encore une fois, les conventions relatives aux espaces de noms s’appliquent et nous<br />
pourrions remplacer le XML de l’exemple précédent par celui-ci :<br />
<br />
<br />
<br />
Professeur<br />
<br />
<br />
contact#fullName<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#mailbox<br />
http://www.daniellemire.com/fr/<br />
Donc, pour représenter l’ensemble des données RDF suivantes :<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/fr/<br />
http://www.w3.org/ "Daniel Lemire"<br />
2000/<br />
10/swap/pim/<br />
http://www.daniellemire.com/fr/<br />
mailto:dlemire@teluq.uqam.ca<br />
CC BY-NC-SA
Introduction au RDF 347<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/fr/<br />
http://www.w3.org/ "Professeur"<br />
2000/ 10/swap/pim/<br />
contact#personalTitle<br />
nous utiliserons plusieurs éléments, les uns à la suite des autres, comme ceci :<br />
<br />
<br />
<br />
Daniel Lemire<br />
<br />
<br />
<br />
<br />
<br />
Professeur<br />
<br />
<br />
En pratique toutefois, nous ne répétons pas l’élément « Description » avec la même<br />
valeur d’attribut « about »; nous préférons la syntaxe qui suit :<br />
<br />
<br />
<br />
Daniel Lemire<br />
<br />
Professeur<br />
<br />
<br />
Et comme l’ordre est sans importance en RDF, nous pourrions aussi avoir le XML<br />
suivant :<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 348<br />
Professeur<br />
Daniel Lemire<br />
<br />
<br />
<br />
5.2.5 Les classes en RDF<br />
Jusqu’à présent, nous n’avons pas représenté en XML l’affirmation suivante :<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/fr/<br />
http://www.w3.org/1999/ http://www.w3.org/<br />
02/22-rdf-syntax-ns#type 2000/ 10/swap/pim/<br />
contact#Person<br />
Évidemment, nous pouvons tout simplement écrire ceci :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Mais, avouons-le, c’est assez peu lisible. Dans<br />
« http://www.w3.org/2000/10/swap/pim/contact#Person », « Person » est un fragment.<br />
Dans les cas où l’URI contient un fragment, nous représentons l’affirmation de la<br />
façon suivante :<br />
<br />
<br />
<br />
<br />
<br />
Nous remplaçons « rdf:Description » par le nom de la classe, soit « Person », avec<br />
le préfixe « http://www.w3.org/2000/10/swap/pim/contact# ». En pratique, cette dernière<br />
approche est presque toujours utilisée et son avantage devient évident quand on<br />
combine toutes les affirmations RDF de la première section :<br />
CC BY-NC-SA
Introduction au RDF 349<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/<br />
http://www.w3.org/1999/ http://www.w3.org/<br />
en/<br />
02/22-rdf-syntax-ns#type 2000/<br />
10/swap/pim/<br />
http://www.daniellemire.com/<br />
en/<br />
http://www.daniellemire.com/<br />
en/<br />
mailto:dlemire@teluq.uqam.ca<br />
http://www.daniellemire.com/<br />
en/<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#fullName<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#mailbox<br />
http://www.w3.org/<br />
2000/ 10/swap/pim/<br />
contact#personalTitle<br />
contact#Person<br />
"Daniel Lemire"<br />
"Professeur"<br />
Nous savons maintenant que nous pouvons représenter toutes ses informations par le<br />
XML suivant :<br />
<br />
<br />
<br />
Daniel Lemire<br />
<br />
Professeur<br />
<br />
<br />
C’est comme ça que nous pouvons écrire « Il y a une personne appelée Daniel Lemire<br />
dont l’adresse de courriel est dlemire@teluq.uqam.ca et qui est professeur. » en<br />
RDF/XML.<br />
5.2.6 Et s’il n’y a pas de symbole « # » dans l’URI<br />
Dans les exemples précédents, nous supposions que l’URI (du verbe) contenait<br />
un symbole « # », ce qui nous permettait de la décomposer en deux<br />
parties (nom et préfixe). Mais quoi faire si l’URI prend plutôt la forme<br />
« http://www.ondelette.com/employeur » Dans un tel cas, nous pouvons choisir de<br />
retenir « http://www.ondelette.com/ » comme préfixe et « employeur » comme nom.<br />
Nous pourrons donc représenter les données RDF suivantes :<br />
Sujet Verbe Objet<br />
http://www.daniellemire.com/fr/<br />
par le XML suivant :<br />
http://<br />
www.ondelette.com/<br />
employeur<br />
http://www.uquebec.ca/<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 350<br />
<br />
<br />
<br />
<br />
<br />
<br />
5.2.7 Des objets qui sont eux-mêmes des sujets<br />
Supposons que nous voulons dire que la pièce de théatre Othello a comme auteur<br />
William Shakespeare. En fait, nous voulons faire quatre affirmations : « Othello est<br />
une pièce de théatre », « Shakespeare est une personne », « Shakespeare est l’auteur<br />
d’Othello » et « Shakespeare a pour nom "William Shakespeare" ». Nous pourrions<br />
choisir de représenter en RDF ces quatre affirmations selon le tableau qui suit :<br />
Sujet Verbe Objet<br />
http://www.othello.org/ http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
http://unuri.org/PieceDe-<br />
Theatre<br />
http://www.othello.org/ http://unuri.org/auteur http://<br />
www.shakespeare.org<br />
http://<br />
http://www.w3.org/1999/ http://unuri.org/Personne<br />
www.shakespeare.org<br />
http://<br />
www.shakespeare.org<br />
02/22-rdf-syntax-ns#type<br />
http://unuri.org/nom<br />
"William Shakespeare"<br />
Nous pouvons utiliser la représentation XML suivante :<br />
<br />
<br />
<br />
<br />
<br />
<br />
William Shakespeare<br />
<br />
<br />
La représentation graphique du tableau RDF est :<br />
CC BY-NC-SA
Introduction au RDF 351<br />
http://www.othello.org/<br />
type<br />
auteur<br />
PieceDeTheatre<br />
http://www.shakespeare.org<br />
type<br />
nom<br />
Personne<br />
William Shakespeare<br />
Nous pouvons cependant le faire plus brièvement. Considérons d’abord le modèle suivant<br />
:<br />
<br />
<br />
<br />
<br />
(...)<br />
<br />
<br />
<br />
Nous avons vu que si nous mettons un nœud de texte là où les points « (...) » apparaissent,<br />
nous associerons « http://www.othello.org/ » avec un objet texte par le verbe<br />
« http://unuri.org/auteur ». Cependant, si nous mettons plutôt un élément muni d’un<br />
attribut « rdf:about », ce sera l’URI contenu dans l’attribut qui deviendra l’objet; nous<br />
gagnons alors la possibilité d’utiliser ce même objet comme sujet à son tour, comme<br />
dans cet exemple :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
William Shakespeare<br />
<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 352<br />
<br />
<br />
<br />
Ce nouveau document RDF est équivalent aux trois affirmations RDF du début, mais il<br />
est un peu plus court.<br />
Nous pourrions pousser l’expérience plus loin - ce qui peut devenir absurde - comme<br />
dans l’exemple qui suit :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
William Shakespeare<br />
<br />
<br />
<br />
<br />
<br />
Ce document est maintenant équivalent au tableau suivant :<br />
Sujet Verbe Objet<br />
http://www.othello.org/ http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
http://unuri.org/PieceDe-<br />
Theatre<br />
http://www.othello.org/ http://unuri.org/auteur http://<br />
www.shakespeare.org<br />
http://<br />
http://www.w3.org/1999/ http://unuri.org/Personne<br />
www.shakespeare.org 02/22-rdf-syntax-ns#type<br />
http://www.texte.org/ http://www.w3.org/1999/ http://unuri.org/Texte<br />
william<br />
02/22-rdf-syntax-ns#type<br />
http://www.texte.org/ http://unuri.org/contenu "William Shakespeare"<br />
william<br />
http://<br />
www.shakespeare.org<br />
http://unuri.org/nom http://www.texte.org/<br />
william<br />
CC BY-NC-SA
Introduction au RDF 353<br />
5.2.8 Les contenants en RDF<br />
Il arrive fréquemment, en pratique, que l’on doive donner comme valeur à un objet,<br />
non pas une chaîne de caractères, mais plutôt un ensemble de chaînes de caractères.<br />
Par exemple, nous pouvons vouloir affirmer que « les étudiants du cours 101 sont Jean<br />
Roberge, Alexandre Coma et Julie LeChat ». Comment le faire Supposons que l’URI<br />
du cours est « http://www.teluq.uqam.ca/101 » et que le verbe correspondant à « être<br />
inscrit à un cours » est identifié par l’URI « http://www.education.com#inscription ».<br />
Nous pouvons alors essayer ceci :<br />
<br />
<br />
<br />
Jean Roberge<br />
Alexandre Coma<br />
Julie LeChat<br />
<br />
<br />
Cela équivaut à remplacer l’affirmation « les étudiants du cours 101 sont Jean Roberge,<br />
Alexandre Coma et Julie LeChat » par les trois affirmations « le cours 101 a comme<br />
étudiant Jean Roberge », « le cours 101 a comme étudiant Alexandre Coma », « le<br />
cours 101 a comme étudiant Julie LeChat ». Il n’est pas certain qu’une telle décomposition<br />
de l’affirmation préserve toujours le sens original. Par exemple, nous pourrions<br />
vouloir donner la liste complète de tous les étudiants dans le cours. RDF nous permet<br />
de regrouper tous les étudiants dans un seul élément « Bag » (sac, en anglais) comme<br />
ceci :<br />
<br />
<br />
<br />
<br />
<br />
Jean Roberge<br />
Alexandre Coma<br />
Julie LeChat<br />
<br />
<br />
<br />
<br />
Les éléments dans un « Bag » ne sont pas ordonnés. Nous pourrons remplacer le XML<br />
précédent par celui-ci, sans problème :<br />
<br />
Module 5 : Resource Description Framework (RDF) 354<br />
xmlns="http://www.education.com#"><br />
<br />
<br />
<br />
Julie LeChat<br />
Jean Roberge<br />
Alexandre Coma<br />
<br />
<br />
<br />
<br />
Si l’ordre importe, alors nous utiliserons un élément « Seq » (pour séquence), comme<br />
dans l’exemple suivant qui énonce les jours de la semaine, dans l’ordre :<br />
<br />
<br />
<br />
<br />
<br />
dimanche<br />
lundi<br />
mardi<br />
mercredi<br />
jeudi<br />
vendredi<br />
samedi<br />
<br />
<br />
<br />
<br />
Finalement, nous pourrions ne pas connaître exactement la valeur de l’objet, mais savoir<br />
que la valeur appartient à un ensemble fini de possibilités. Par exemple, si nous<br />
jouons à un jeu de détective et qu’il n’y a que trois coupables possibles (le majordome,<br />
la princesse et le seigneur), nous écrirons :<br />
<br />
<br />
<br />
<br />
<br />
majordome<br />
princesse<br />
seigneur<br />
CC BY-NC-SA
Questionnaire d’autoévaluation : Introduction au RDF 355<br />
<br />
<br />
<br />
<br />
5.2.9 RDFa<br />
Il peut sembler un peut lourd de créer des fichiers XML distincts pour stocker le RDF.<br />
Heureusement, il existe donc plusieurs approches pour inscrire le RDF à même des<br />
fichiers XHTML. La spécification RDFa permet d’inscrire du RDF directement au sein<br />
d’un document XHTML avec les attributs about et property. Voici un exemple d’annotation<br />
RDFa ajoutée à un élément XHTML :<br />
<br />
Wikinomics<br />
Don Tapscott<br />
2006-10-01<br />
<br />
5.2.10 Conclusion<br />
Nous avons vu que le modèle RDF sert à décrire pratiquement n’importe quoi en associant<br />
des URI à tous les objets et relations. Les données RDF peuvent généralement<br />
être représentées en XML selon l’approche que nous avons décrite, ce qui permet de<br />
combiner les avantages du XML (format entièrement normalisé et non propriétaire, outils<br />
très disponibles, etc.), tout en gardant les avantages du RDF (contenu pouvant être<br />
traité par des machines, relative simplicité). Pour plus de détails, on peut consulter les<br />
articles du site mozilla.org sur le sujet (http://developer.mozilla.org/en/docs/RDF).<br />
Certains logiciels gratuits comme 4Suite (http://4suite.org/) peuvent traiter le contenu<br />
RDF/XML, mais ce n’est pas le cas des navigateurs web ou de la majorité des logiciels.<br />
Les graphiques de cette leçon furent générés avec 4Suite et inclus au texte en tant que<br />
SVG.<br />
5.3 Questionnaire d’autoévaluation : Introduction au<br />
RDF<br />
Avant de répondre à ce questionnaire, vous devez avoir lu le texte « Introduction au<br />
RDF ».<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 356<br />
5.3.1 Questions d’auto-évaluation<br />
1. Parmi les affirmations qui suivent, lesquelles s’appliquent aux URI<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) On définit les URI en utilisant le RDF.<br />
(b) « teluq@teluq.ca » est un URI.<br />
(c) « teluq.ca » est un URI.<br />
(d) « http://www.ledevoir.com#directrice » est un URI.<br />
(e) Toute URL peut être utilisée comme URI.<br />
(f) « http://www.ledevoir.com/éditorial.html » est un URI.<br />
2. Parmi les affirmations qui suivent, lesquelles s’appliquent au RDF<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) Il s’agit d’une forme de XML.<br />
(b) Il s’agit d’un outil pour décrire des « documents » ou d’autres ressources<br />
au sein d’une organisation.<br />
(c) Le RDF peut servir pour représenter la connaissance de façon formelle.<br />
(d) Le RDF a été normalisé en 2001.<br />
(e) On définit le RDF en utilisant des URI.<br />
(f) Pour l’essentiel, le modèle RDF n’est constitué que de triplets : sujet, verbe,<br />
objet.<br />
(g) RDF est une norme ISO.<br />
3. Parmi les triplets qui suivent, lesquels peuvent former du RDF valable Choisissez<br />
toutes les réponses qui s’appliquent.<br />
Sujet Verbe Objet<br />
http://www.teluq.ca/ http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
http://<br />
www.institutions.org/<br />
universite<br />
(a)<br />
Sujet Verbe Objet<br />
"<strong>Téluq</strong>"<br />
http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
http://<br />
www.institutions.org/<br />
universite<br />
(b)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca/ http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
"Université"<br />
CC BY-NC-SA
Questionnaire d’autoévaluation : Introduction au RDF 357<br />
(c)<br />
4. Choisissez le tableau de triplets RDF qui correspond au document XML suivant :<br />
<br />
<br />
<br />
http://www.kapouta.org<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
Sujet Verbe Objet<br />
http://www.teluq.ca joe http://www.kapouta.org<br />
(a)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe http://www.kapouta.org<br />
(b)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe "http://www.kapouta.org"<br />
(c)<br />
5. Choisissez le tableau de triplets RDF qui correspond au document XML suivant :<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
Sujet Verbe Objet<br />
http://www.teluq.ca joe http://www.kapouta.org<br />
(a)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe http://www.kapouta.org<br />
(b)<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 358<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe "http://www.kapouta.org"<br />
(c)<br />
6. Choisissez le tableau de triplets RDF qui correspond au document XML suivant :<br />
<br />
<br />
<br />
<br />
La vie est belle<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe http://www.teluq.ca/jill<br />
http://www.teluq.ca http://www.teluq.ca/joe http://www.kapouta.org<br />
http://www.teluq.ca http://www.teluq.ca/jill "La vie est belle"<br />
(a)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca joe http://www.kapouta.org<br />
http://www.teluq.ca jill "La vie est belle"<br />
(b)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe http://www.kapouta.org<br />
http://www.teluq.ca http://www.teluq.ca/jill "La vie est belle"<br />
(c)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe "http://www.kapouta.org"<br />
http://www.teluq.ca http://www.teluq.ca/jill "La vie est belle"<br />
(d)<br />
7. Choisissez le tableau de triplets RDF qui correspond au document XML suivant :<br />
<br />
<br />
CC BY-NC-SA
Questionnaire d’autoévaluation : Introduction au RDF 359<br />
<br />
<br />
La vie est belle<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe http://www.teluq.ca/jill<br />
http://www.teluq.ca http://www.teluq.ca/joe http://www.kapouta.org<br />
http://www.teluq.ca http://www.teluq.ca/jill "La vie est belle"<br />
(a)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca joe http://www.kapouta.org<br />
http://www.teluq.ca jill "La vie est belle"<br />
(b)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe http://www.kapouta.org<br />
http://www.teluq.ca http://www.teluq.ca/jill "La vie est belle"<br />
(c)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.teluq.ca/joe "http://www.kapouta.org"<br />
http://www.teluq.ca http://www.teluq.ca/jill "La vie est belle"<br />
(d)<br />
Sujet Verbe Objet<br />
http://www.teluq.ca http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
http://www.teluq.ca/<br />
Description<br />
http://www.teluq.ca http://www.teluq.ca/joe http://www.kapouta.org<br />
http://www.teluq.ca http://www.teluq.ca/jill "La vie est belle"<br />
(e)<br />
5.3.2 Solutions<br />
1. (a) Non. On peut utiliser le concept d’URI sans connaître le RDF.<br />
(b) Non. Un URI doit spécifier le protocole comme dans les URL; il faut donc<br />
écrire « mailto:teluq@teluq.ca ».<br />
(c) Non. Il faut spécifier le protocole et utiliser plutôt « http://www.teluq.ca ».<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 360<br />
(d) (Bonne réponse) Oui. Le symbole « # » peut être utilisé dans un URI (et<br />
dans une URL). Dans le cas des pages web, le symbole « # » est utilisé pour<br />
pointer vers un endroit spécifique dans la page web. Ce qui suit le « # » se<br />
nomme un « fragment ». (On utilise la norme RFC 1630.)<br />
(e) (Bonne réponse) Oui. Une URL est automatiquement un URI.<br />
(f) Non. On ne peut pas utiliser les accents dans un URI.<br />
2. (a) Non. Il est vrai qu’on peut représenter le RDF en XML, mais le RDF luimême<br />
n’est pas une forme de XML.<br />
(b) (Bonne réponse) Oui. C’est là la fonction essentielle du RDF.<br />
(c) (Bonne réponse) Oui.<br />
(d) Non. C’est en 1999.<br />
(e) (Bonne réponse) Vrai.<br />
(f) (Bonne réponse) Vrai. Tout se ramène à ce modèle simple.<br />
(g) Faux. Il s’agit d’une recommandation W3C.<br />
3. (a) (Bonne réponse) Oui. Il s’agit de trois URI, donc d’un triplet valable.<br />
(b) Non. Le sujet doit être un URI.<br />
(c) (Bonne réponse) Oui. L’objet peut être une chaîne de caractères, ou une<br />
autre valeur.<br />
4. (a) Non. L’objet n’est pas un URI et le verbe n’est pas « joe »; il faut porter<br />
attention à l’espace de noms.<br />
(b) Non. L’objet n’est pas un URI; dans ce cas, on doit utiliser l’attribut<br />
« rdf:resource ».<br />
(c) (Bonne réponse) Oui. L’objet n’est pas un URI.<br />
5. (a) Non. Le verbe n’est pas « joe »; il faut porter attention à l’espace de noms.<br />
(b) (Bonne réponse) Oui. L’objet est un URI.<br />
(c) Non. L’objet est un URI.<br />
6. (a) Non. Le premier des triplets n’apparaît pas dans le XML.<br />
(b) Non. Les verbes ne sont pas corrects; il faut porter attention à l’espace de<br />
noms.<br />
(c) (Bonne réponse) Oui. C’est correct.<br />
(d) Non. L’objet « http://www.kapouta.org » est un URI.<br />
7. (a) Non. Le premier des triplets n’apparaît pas dans le XML et « Description »<br />
est ici le type associé à l’URI « http://www.teluq.ca ».<br />
(b) Non. Les verbes ne sont pas corrects; il faut porter attention à l’espace<br />
de noms et « Description » est ici le type associé à l’URI<br />
« http://www.teluq.ca ».<br />
(c) Non. « Description » est ici le type associé à l’URI « http://www.teluq.ca ».<br />
(d) Non. L’objet « http://www.kapouta.org » est un URI et « Description » est<br />
ici le type associé à l’URI « http://www.teluq.ca ».<br />
(e) (Bonne réponse) Oui. C’est correct.<br />
CC BY-NC-SA
Le RDF par l’exemple 361<br />
5.4 Le RDF par l’exemple<br />
5.4.1 Introduction<br />
Avant de lire ce texte, vous devez avoir lu « Introduction au RDF », car nous supposons<br />
que vous comprenez la syntaxe RDF de base.<br />
Le RDF se retrouve un peu partout sur le web, parfois de façon « invisible », c’est-à-dire<br />
qu’il est souvent utilisé dans les échanges automatiques entre les logiciels. En outre,<br />
il est utilisé au sein des portails, par exemple. Voyons maintenant quatre applications<br />
RDF bien établies :<br />
Dublin Core Il s’agit sans doute de l’utilisation la plus connue et la plus répandue<br />
du RDF. La norme Dublin Core est assez simple et vise à décrire les travaux<br />
rendus disponibles sur le web (auteur, titre, date, etc.). Cette norme s’inspire de<br />
la bibliothéconomie.<br />
Creative Commons Il s’agit d’une façon de décrire les droits accordés sur le contenu<br />
placé sur le web. Par exemple, vous voulez savoir si vous pouvez recopier telle<br />
ou telle page web; si l’auteur a utilisé la norme Creative Commons, alors vous<br />
devriez pouvoir savoir ce qui est permis par l’auteur.<br />
FOAF La norme FOAF (« Friend Of A Friend » - « ami d’un ami ») permet de décrire<br />
un individu et les gens qu’il connaît. Cette norme sert à traiter les réseaux<br />
sociaux.<br />
RSS/RDF La norme RSS est utilisée par les blogues et sites de nouvelles. Le site<br />
mozilla.org a plusieurs articles sur le sujet (http://developer.mozilla.org/en/docs/<br />
RSS). En gros, un document RSS/RDF contient une version XML des dernières<br />
nouvelles. Par la suite, plusieurs de ces fichiers XML peuvent être combinés pour<br />
créer un portail de nouvelles ou utilisés avec un outil-client de type « RSS aggregator<br />
» pour obtenir automatiquement les dernières nouvelles (voir, par exemple,<br />
blogbridge).<br />
5.4.2 Un exemple : Dublin Core<br />
La norme Dublin Core définit plusieurs « verbes » (au sein du RDF); on peut en consulter<br />
la liste à l’adresse http://dublincore.org/documents/dcmi-terms/ (en anglais). Cette<br />
norme a été publiée pour la première fois en juillet 1999.<br />
Le préfixe de la norme Dublin Core est « http://purl.org/dc/elements/1.1/ », du moins<br />
pour les éléments de base présentés ici. Voici les URI <strong>complet</strong>s et leur signification :<br />
http://purl.org/dc/elements/1.1/creator Personne ou organisme qui est l’auteur du<br />
travail.<br />
http://purl.org/dc/elements/1.1/contributor Personne ou organisme qui a contribué<br />
à un travail, mais sans en être l’auteur.<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 362<br />
http://purl.org/dc/elements/1.1/coverage Lieu et période correspondant au travail.<br />
http://purl.org/dc/elements/1.1/date Date associée au travail, généralement sous la<br />
forme AAAA-MM-JJ. Il peut s’agir de la date de publication, de création ou de<br />
la dernière révision.<br />
http://purl.org/dc/elements/1.1/description Brève description du travail.<br />
http://purl.org/dc/elements/1.1/format Format sous lequel est publié le travail. Si le<br />
travail est publié en HTML, alors on utilisera souvent « text/html » pour décrire<br />
le format.<br />
http://purl.org/dc/elements/1.1/identifier Code ou URI qui correspond de façon<br />
unique au travail. Si un travail est publié à une adresse web, on peut utiliser<br />
cette adresse comme URI; si c’est un livre avec un ISBN, on peut utiliser un URI<br />
de la forme « urn:ISBN:0-123-12345-1 ».<br />
http://purl.org/dc/elements/1.1/language Code ISO-639/ISO-3166 décrivant le travail.<br />
Si le travail est publié en français, on peut utiliser « fr-CA »; sinon, en<br />
anglais, ce serait « en-CA » (CA signifie Canada).<br />
http://purl.org/dc/elements/1.1/publisher Organisme responsable de la publication<br />
du travail.<br />
http://purl.org/dc/elements/1.1/relation Ressource liée au travail. Par exemple,<br />
pour un travail fait en classe, on peut établir un lien avec l’exposé du travail.<br />
http://purl.org/dc/elements/1.1/rights Contient souvent une affirmation permettant<br />
de savoir qui est propriétaire du travail (détenteur du droit d’auteur).<br />
http://purl.org/dc/elements/1.1/source Résumé du travail de quelqu’un d’autre. Cet<br />
URI permet de pointer vers la source originale.<br />
http://purl.org/dc/elements/1.1/subject Généralement, une liste de mots clés.<br />
http://purl.org/dc/elements/1.1/title Titre du travail.<br />
http://purl.org/dc/elements/1.1/type Type de la ressource (texte, image, etc.). Notons<br />
que le « type » est différent du « format ». Par exemple, une image peut être<br />
en format Jpeg ou Gif, un texte peut être en format Word ou ASCII.<br />
Voyons comment nous pouvons décrire ce texte que vous êtes en<br />
train de lire, en utilisant la norme Dublin Core. Attribuons-lui l’URI<br />
« http://www.uqam.ca/rdfexemples.html ».<br />
Sujet Verbe Objet<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://purl.org/ dc/ http://www.daniel-<br />
elements/1.1/creator lemire.com/fr/<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://purl.org/ dc/ "2004-07-27"<br />
elements/1.1/date<br />
http://www.uqam.ca/ rd-<br />
http://purl.org/ dc/ "Introduction au RDF"<br />
fexemples.html<br />
http://www.uqam.ca/ rdfexemples.html<br />
elements/1.1/title<br />
http://purl.org/<br />
elements/1.1/type<br />
dc/<br />
"text"<br />
CC BY-NC-SA
Le RDF par l’exemple 363<br />
Sujet Verbe Objet<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://purl.org/ dc/ "fr-CA"<br />
elements/1.1/Language<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://purl.org/ dc/ "RDF, Dublin Core,<br />
elements/1.1/subject Creative Commons,<br />
FOAF, RSS/RDF"<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://purl.org/ dc/ "Copyright 2005 Daniel<br />
elements/1.1/rights Lemire"<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://purl.org/ dc/ "Un document compresation<br />
elements/1.1/description nant des exemples d’utili-<br />
du RDF en gestion<br />
des connaissances."<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://purl.org/ dc/ "text/html"<br />
elements/1.1/format<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://purl.org/ dc/ http://www.uqam.ca/ rdfexemples.html<br />
elements/1.1/identifier<br />
Nous pouvons aussi représenter ce tableau en XML comme ceci :<br />
<br />
<br />
<br />
<br />
2004-07-27<br />
Introduction au RDF<br />
text<br />
fr-CA<br />
RDF, Dublin Core, Creative Commons,<br />
FOAF, RSS/RDF<br />
Copyright 2005 Daniel Lemire<br />
Un document comprenant des exemples<br />
d’utilisation du RDF en gestion des connaissances.<br />
text/html<br />
<br />
<br />
<br />
Nous pouvons aussi représenter ce tableau sous la forme d’un graphe :<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 364<br />
http://www.daniel−lemire.com/fr/<br />
creator<br />
2004−07−27<br />
date<br />
Introduction au RDF<br />
title<br />
identifier<br />
rdfexemples.html<br />
type<br />
Language<br />
subject<br />
rights<br />
text<br />
fr−CA<br />
RDF<br />
description<br />
Copyright 2005 Daniel Lemire<br />
format<br />
Un document comprenant des exemples<br />
d’utilisation du RDF en gestion des connaissances.<br />
html<br />
Évidemment, Dublin Core est une norme RDF et non pas une norme XML. Il est donc<br />
possible d’exprimer du contenu Dublin Core sans passer par le XML. Nous pourrions<br />
très bien nous en tenir au tableau sujet/verbe/complément ou utiliser une autre syntaxe.<br />
Notons aussi que les conventions d’espace de noms s’appliquent et que l’ordre n’est<br />
pas important. Nous pouvons donc remplacer le XML précédent par celui-ci :<br />
<br />
<br />
<br />
<br />
Introduction au RDF<br />
2004-07-27<br />
text<br />
RDF, Dublin Core, Creative Commons,<br />
FOAF, RSS/RDF<br />
Copyright 2005 Daniel Lemire<br />
Un document comprenant des exemples<br />
d’utilisation du RDF en gestion des connaissances.<br />
text/html<br />
<br />
fr-CA<br />
<br />
CC BY-NC-SA
Le RDF par l’exemple 365<br />
<br />
Il existe des applications plus sophistiquées de la norme Dublin Core, mais nous avons<br />
ici l’essentiel. Vous pouvez dès maintenant cataloguer les ressources d’une entreprise<br />
en utilisant simplement ce que nous venons de présenter. Comme la norme est utilisée<br />
partout dans le monde, il sera possible d’échanger ces descriptions ou d’utiliser des<br />
logiciels communs pour le traitement ou l’affichage des informations.<br />
5.4.3 Un exemple : Creative Commons<br />
Une des limites apparentes de la norme Dublin Core est son incapacité à spécifier<br />
de façon précise les droits accordés sur un travail. Le problème est particulièrement<br />
fréquent sur le web : a-t-on le droit d’utiliser telle ou telle image gratuitement, de la<br />
reproduire, de la modifier, et ainsi de suite.<br />
Pour résoudre cette difficulté, les gens font appel à la norme Creative Commons, qui utilise<br />
le préfixe « http://web.resource.org/cc/ ». Cette norme définit une classe « Work »<br />
(travail, en anglais, ici au sens d’oœuvre), mais emprunte pratiquement tout le reste<br />
à Dublin Core qu’elle vient compléter. La norme Creative Commons a été proposée<br />
en 2001 par James Boyle, Michael Carroll, Lawrence Lessig, Hal Abelson, Eric Saltzman<br />
et Eric Eldred.<br />
Voici un exemple très simple d’une description utilisant la norme Creative Commons :<br />
Sujet Verbe Objet<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
http://web.resource.org/<br />
cc/Work<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://purl.org/ dc/ "Le RDF par l’exemple"<br />
elements/1.1/title<br />
Et voici la version XML correspondante :<br />
<br />
<br />
<br />
Le RDF par l’exemple<br />
<br />
<br />
Tout ce que nous avons affirmé dans ce dernier document, c’est que la page actuelle<br />
appartient à la classe « Work ». Dans l’état actuel des choses, nous affirmons par défaut<br />
qu’il n’est pas permis d’utiliser cette page, car nous n’avons attribué aucune permission.<br />
Supposons que l’auteur désire accorder le droit au lecteur de redistribuer, de modifier<br />
et de partager cette page, pour autant qu’il utilise la même licence. Nous<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 366<br />
pourrions alors utiliser la licence « Attribution-ShareAlike 2.0 » dont l’URI est<br />
« http://creativecommons.org/licenses/by-sa/2.0/ ». Évidemment, nous pouvons aussi<br />
créer notre licence de toute pièce, mais dans l’exemple, nous utiliserons la licence<br />
« Attribution-ShareAlike 2.0 ». Pour faire un lien entre notre travail et une licence,<br />
nous utilisons le verbe dont l’URI est « http://web.resource.org/cc/license », comme ce<br />
qui suit; observez bien la dernière ligne du tableau.<br />
Sujet Verbe Objet<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
http://web.resource.org/<br />
cc/Work<br />
http://www.uqam.ca/ rd-<br />
http://purl.org/ dc/ "Le RDF par l’exemple"<br />
elements/1.1/title<br />
http://web.resource.org/<br />
cc/license<br />
fexemples.html<br />
http://www.uqam.ca/ rdfexemples.html<br />
http://creativecommons.org/licenses/by-sa/<br />
2.0/<br />
Nous pouvons aussi utiliser le XML correspondant :<br />
<br />
<br />
<br />
Le RDF par l’exemple<br />
<br />
<br />
<br />
Voici la représentation sous la forme d’un graphe :<br />
rdfexemples.html<br />
{Work}<br />
title<br />
license<br />
Le RDF par l’exemple<br />
http://creativecommons.org/licenses/by−sa/2.0/<br />
Nous avons alors un document Creative Commons <strong>complet</strong>. Cependant, un problème<br />
demeure. Supposons qu’un logiciel fasse automatiquement une recherche<br />
pour vous et que vous ne désiriez obtenir que les textes que vous pouvez modifier<br />
librement. Il n’est pas évident pour une machine de comprendre que l’URI<br />
« http://creativecommons.org/licenses/by-sa/2.0/ » vous donne ce droit; d’ailleurs, une<br />
telle recherche n’est peut-être pas très simple pour un humain...<br />
Creative Commons définit trois verbes et des objets permettant de décrire une licence<br />
et une classe. Toutes les licences appartiennent à la classe ayant pour URI<br />
« http://web.resource.org/cc/License ». Les URI des trois verbes sont :<br />
CC BY-NC-SA
Le RDF par l’exemple 367<br />
http://web.resource.org/cc/permits La licence le permet. Creative Commons<br />
définit trois URI pouvant être utilisés comme objet de ce<br />
verbe. Il y a d’abord « http://web.resource.org/cc/Reproduction », le<br />
droit de reproduire en tout ou en partie le travail. Il y a ensuite<br />
« http://web.resource.org/cc/Distribution », le droit de redistribuer le travail.<br />
Finalement, il y a « http://web.resource.org/cc/DerivativeWorks », le droit<br />
de modifier le travail. Évidemment, il est possible de définir ses propres objets.<br />
http://web.resource.org/cc/requires La licence pose comme condition. Creatives<br />
Commons définit quatre URI pouvant être utilisés comme objet de<br />
ce verbe : « http://web.resource.org/cc/Notice » pour spécifier qu’il faut<br />
reproduire intégralement les notes légales (licence et droits d’auteurs);<br />
« http://web.resource.org/cc/Attribution » pour spécifier qu’il faut attribuer à<br />
l’auteur le crédit du travail; « http://web.resource.org/cc/ShareAlike » pour spécifier<br />
que si l’on redistribue le travail, il faut le faire en gardant la même licence;<br />
« http://web.resource.org/cc/SourceCode » pour spécifier que le code source doit<br />
être redistribué.<br />
http://web.resource.org/cc/prohibits La licence interdit. Il n’y a qu’un seul<br />
URI défini par Creative Commons qui peut être utilisé avec ce verbe :<br />
« http://web.resource.org/cc/CommercialUse »; cela permet d’interdire l’utilisation<br />
à des fins commerciales. Encore une fois, il est possible de définir ses<br />
propres objets.<br />
Dans le cas de la licence « Attribution-ShareAlike 2.0 », nous pouvons la décrire<br />
comme suit :<br />
Sujet Verbe Objet<br />
http://creativecommons.org/<br />
licenses/by-sa/<br />
2.0/<br />
http://creativecommons.org/<br />
licenses/by-sa/<br />
2.0/<br />
http://creativecommons.org/<br />
licenses/by-sa/<br />
2.0/<br />
http://creativecommons.org/<br />
licenses/by-sa/<br />
2.0/<br />
http://creativecommons.org/<br />
licenses/by-sa/<br />
2.0/<br />
http://creativecommons.org/<br />
licenses/by-sa/<br />
2.0/<br />
http://www.w3.org/1999/<br />
02/22-rdf-syntax-ns#type<br />
http://web.resource.org/<br />
cc/permits<br />
http://web.resource.org/<br />
cc/permits<br />
http://web.resource.org/<br />
cc/requires<br />
http://web.resource.org/<br />
cc/requires<br />
http://web.resource.org/<br />
cc/permits<br />
http://web.resource.org/<br />
cc/License<br />
http://web.resource.org/<br />
cc/Reproduction<br />
http://web.resource.org/<br />
cc/Distribution<br />
http://web.resource.org/<br />
cc/Notice<br />
http://web.resource.org/<br />
cc/Attribution<br />
http://web.resource.org/<br />
cc/DerivativeWorks<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 368<br />
Sujet Verbe Objet<br />
http://creativecommons.org/<br />
licenses/by-sa/<br />
2.0/<br />
http://web.resource.org/<br />
cc/requires<br />
http://web.resource.org/<br />
cc/ShareAlike<br />
Nous pouvons aussi utiliser le XML suivant :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
En pratique, nous combinons souvent le tout (description du travail et description de la<br />
licence) pour obtenir le XML suivant :<br />
<br />
<br />
Le RDF par l’exemple<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Voilà! De cette manière, une machine pourra automatiquement déterminer quels droits<br />
l’utilisateur a sur une œuvre. Un logiciel pourrait automatiquement avertir l’utilisateur<br />
de ses obligations si jamais il tentait d’enregistrer sur son disque une copie de l’œuvre.<br />
Dans le cas d’une entreprise qui utilise beaucoup de contenu multimédia, l’utilisation<br />
de cette norme pourrait être très utile pour détecter automatiquement les violations des<br />
droits d’auteur.<br />
CC BY-NC-SA
Le RDF par l’exemple 369<br />
5.4.4 Un exemple : FOAF<br />
Les personnes sont souvent ce qu’il y a de plus important dans une organisation; il<br />
n’est donc pas étonnant qu’on veuille utiliser le RDF pour les décrire. Pour ce faire, on<br />
utilise souvent la norme FOAF pour « Friend-Of-A-Friend », ou un ami d’un ami, en<br />
français, (préfixe http://xmlns.com/foaf/0.1/) qui définit la classe « Person » (personne,<br />
en anglais).<br />
Le projet FOAF a été lancé de façon informelle par Daniel Brickley en 1998. À<br />
l’époque, il avait mis un texte RDF ressemblant à ceci sur sa page personnelle :<br />
(Attention.- Il ne s’agit pas de RDF/XML valable.)<br />
<br />
xmlns:rdf="http://www.w3.org/TR/WD-rdf-syntax#"><br />
<br />
Dan Brickley <br />
daniel.brickley@bristol.ac.uk <br />
<br />
<br />
<br />
<br />
<br />
<br />
La norme FOAF est très riche; mais à la base, on trouve les verbes suivants :<br />
http://xmlns.com/foaf/0.1/name Verbe pointant vers le nom de la personne (John<br />
Smith)<br />
http://xmlns.com/foaf/0.1/nick Verbe pointant vers le surnom informel de la personne<br />
(joblo).<br />
http://xmlns.com/foaf/0.1/title Verbe pointant vers le titre de la personne (docteur,<br />
monsieur, madame).<br />
http://xmlns.com/foaf/0.1/homepage Verbe pointant vers la page personnelle de la<br />
personne.<br />
http://xmlns.com/foaf/0.1/mbox Verbe pointant vers l’adresse électronique de la personne.<br />
http://xmlns.com/foaf/0.1/img Verbe pointant vers une image de la personne, la représentant<br />
spécifiquement.<br />
http://xmlns.com/foaf/0.1/depiction Verbe pointant vers une image représentant la<br />
personne. Contrairement à « img », l’image peut être une photo de groupe.<br />
http://xmlns.com/foaf/0.1/family_name Verbe pointant vers le nom de famille de la<br />
personne (Smith).<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 370<br />
http://xmlns.com/foaf/0.1/givenname Verbe pointant vers le prénom de la personne<br />
(John).<br />
En XML, une description de l’auteur de ce document pourrait se présenter comme suit :<br />
<br />
<br />
<br />
Daniel<br />
Lemire<br />
<br />
lemire@uqam.ca<br />
<br />
<br />
<br />
Voici le graphe équivalent :<br />
Anonymous<br />
Person<br />
givenname<br />
family_name<br />
homepage<br />
mbox<br />
Daniel<br />
Lemire<br />
http://www.daniel−lemire.com/fr/<br />
img<br />
lemire@uqam.ca<br />
zel2p.gif<br />
Notez que la balise « Person » n’a pas d’attribut « rdf:about ». Actuellement, il existe<br />
un débat sur cette question : Peut-on attribuer un URI unique à chaque individu et si<br />
oui, comment le choisir C’est un cas où l’URI du sujet est « implicite » : cela signifie<br />
que dans les triplets sujet/verbe/objet, le sujet a un URI « fictif », qui n’est valable que<br />
dans le cadre du document que l’on traite. Autrement dit, le programme qui traite le<br />
document doit allouer dynamiquement un URI au sujet pour la durée du traitement.<br />
Rappelons-nous, en effet, que la norme RDF permet d’omettre le sujet, mais que si le<br />
sujet est spécifié, il doit être un URI.<br />
Nous pouvons imaginer que la norme FOAF sera éventuellement utilisée pour représenter<br />
les réseaux sociaux, les organisations, et ainsi de suite. Une fois l’information<br />
CC BY-NC-SA
Le RDF par l’exemple 371<br />
sociale représentée de façon formelle, nous pouvons croire qu’il sera possible de poser<br />
des questions à un ordinateur de l’ordre suivant : Est-ce que je connais quelqu’un qui<br />
connaît quelqu’un travaillant chez IBM<br />
5.4.5 Un exemple : RSS/RDF<br />
La version 1.0 de la norme RSS est un exemple de RDF. Cette norme dont l’acronyme<br />
n’a pas de définition établie, sert à représenter des fils de nouvelles. Elle a été imaginée<br />
par la compagnie Netscape et servait alors à la production du portail Netscape (1999).<br />
Elle est devenue très populaire et on trouve maintenant des milliers de fils de nouvelles<br />
en format RSS dans le monde. Par exemple, sur http://www.yulblog.org/, il y a des<br />
centaines de blogues écrits par des Montréalais et la plupart ont un fil de nouvelles en<br />
format RSS.<br />
Une nouvelle, appelée « item » en RSS, prend la forme suivante :<br />
<br />
<br />
<br />
La bourse fait faillite<br />
http://www.nouvelles.com/nouvelles1.html<br />
<br />
Aujourd’hui, on a appris que la bourse a fait faillite.<br />
<br />
<br />
<br />
Nous constatons qu’il y a une classe (item) et trois verbes (title, link, description) qui<br />
représentent respectivement le titre, l’URL et le contenu de la nouvelle.<br />
Un document RSS est une liste d’items. Voici un document RSS :<br />
<br />
<br />
<br />
Un site de nouvelles<br />
http://www.nouvelles.com/<br />
<br />
Nouvelles.com est un superbe site de nouvelles<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 372<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Nous constatons une classe « channel » (canal, en anglais) qui contient un titre, un<br />
URL (link) et une description. Il y a aussi une liste de nouvelles (item). Généralement,<br />
nous combinons le tout dans un seul fichier, comme ceci :<br />
<br />
<br />
<br />
Un site de nouvelles<br />
http://www.nouvelles.com/<br />
<br />
Nouvelles.com est un superbe site de nouvelles<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
La bourse fait faillite<br />
http://www.nouvelles.com/nouvelles1.html<br />
<br />
Aujourd’hui, on a appris que la bourse a fait faillite.<br />
<br />
<br />
<br />
Rien ne va plus à l’école<br />
http://www.nouvelles.com/nouvelles2.html<br />
<br />
Un étudiant se serait rendu coupable d’apprentissage.<br />
<br />
CC BY-NC-SA
Le RDF par l’exemple 373<br />
<br />
<br />
Les applications du RSS sont multiples. Supposons que votre organisation collabore<br />
avec plusieurs autres organisations et que vous vouliez rendre disponibles, sur une seule<br />
page web, toutes les nouvelles de toutes les organisations dont vous faites partie. Si<br />
chaque organisation rend disponible sur le web un document RSS toujours mis à jour,<br />
vous pouvez facilement récupérer les nouvelles de chacun et les afficher à un seul<br />
endroit. Au lieu de solliciter tous les membres par courriel, les fils de nouvelles RSS<br />
permettent à une machine de faire un tri et de personnaliser le contenu.<br />
La norme RSS est en voie d’être remplacée par la norme Atom. Un des avantages du<br />
nouveau format Atom est que chaque nouvelle doit avoir un identifiant unique ce qui<br />
permet d’éviter les doublons. Cependant, la norme RSS risque d’être toujours utile<br />
pendant bien des années. Atom n’est pas en RDF/XML. En voici un exemple :<br />
<br />
<br />
Un site de nouvelles<br />
Nouvelles.com est un superbe site de nouvelles<br />
<br />
2003-12-13T18:30:02Z<br />
<br />
John Doe<br />
johndoe@example.com<br />
<br />
urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6<br />
<br />
La bourse fait faillite<br />
<br />
urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a<br />
2003-12-13T18:30:02Z<br />
Aujourd’hui, on a appris que la bourse a fait faillite.<br />
<br />
<br />
<br />
5.4.6 Conclusion<br />
Nous avons étudié quatre applications importantes du RDF sur le web. Le nombre<br />
d’applications est toutefois beaucoup plus important.<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 374<br />
Il faut garder à l’esprit que le RDF n’est pas le XML et que le XML ne sert qu’à<br />
représenter le RDF (et encore, ce n’est pas toujours possible). Il est probable que la<br />
syntaxe utilisée pour représenter le RDF en XML va encore évoluer.<br />
Pour en apprendre davantage sur le RDF, nous vous suggérons le livre de Shelley Powers,<br />
Practical RDF, publié chez O’Reilly en juillet 2003 (350 pages), en anglais seulement<br />
et coûtant environ 60 $.<br />
5.5 Questionnaire d’autoévaluation : Le RDF par<br />
l’exemple<br />
Avant de répondre à ce questionnaire, vous devez avoir lu le texte « Le RDF par<br />
l’exemple », qui est la suite du texte « Introduction au RDF ».<br />
5.5.1 Questions d’auto-évaluation<br />
1. Parmi les affirmations suivantes, lesquelles s’appliquent à la norme Dublin Core<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) La première version de Dublin Core a été publiée en 2001.<br />
(b) Dublin Core est une forme de RDF.<br />
(c) Dublin Core est une forme de XML.<br />
(d) La norme Dublin Core peut être utilisée pour décrire des photographies ou<br />
objets multimédias.<br />
2. Choisissez l’affirmation qui décrit le mieux l’information contenue dans ce document<br />
Dublin Core :<br />
<br />
<br />
<br />
Alec Castonguay<br />
Harper est prêt pour de nouvelles élections<br />
2004-09-30<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Il y a un article à l’URL « http://www.ledevoir.com/2004/09/30/65081.html »<br />
écrit par quelqu’un nommé Alec Castonguay; l’article a été écrit le 30<br />
septembre 2004 et porte le titre « Harper est prêt pour de nouvelles<br />
élections ».<br />
CC BY-NC-SA
Questionnaire d’autoévaluation : Le RDF par l’exemple 375<br />
(b) Le document ayant l’URI « http://www.ledevoir.com/2004/09/30/65081.html »,<br />
portant le titre « Harper est prêt pour de nouvelles élections » et daté du 30<br />
septembre 2004, a été écrit par quelqu’un nommé Alec Castonguay.<br />
(c) Alec Castonguay a écrit l’article ayant l’URI<br />
« http://www.ledevoir.com/2004/09/30/65081.html » et le titre « Harper<br />
est prêt pour de nouvelles élections », le 30 septembre 2004.<br />
3. Parmi les affirmations suivantes, lesquelles s’appliquent à la norme Creative<br />
Commons<br />
Choisissez toutes les réponses qui s’appliquent.<br />
(a) La première version de Creative Commons a été publiée en 2001.<br />
(b) Creative Commons est une forme de RDF.<br />
(c) Creative Commons sert surtout à décrire le contenu des documents.<br />
4. Choisissez l’affirmation qui décrit le mieux l’information contenue dans ce document<br />
Creative Commons :<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Choisissez la bonne réponse parmi les choix suivants.<br />
(a) Ce document n’est pas valable.<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 376<br />
(b) Le document à l’URL « http://www.mavieestbelle.com/index.html » peut<br />
être modifié et reproduit dans un contexte non commercial ou reproduit<br />
sans modification dans un contexte commercial.<br />
(c) Le document représenté par l’URI « http://www.mavieestbelle.com/index.html »<br />
peut être modifié et reproduit dans un contexte non commercial ou reproduit<br />
sans modification dans un contexte commercial.<br />
5. Comment peut-on expliquer que le premier document FOAF en XML n’était pas<br />
du RDF valable Choisissez toutes les réponses qui s’appliquent.<br />
(a) Au départ, FOAF ne devait pas être du RDF.<br />
(b) FOAF est un projet informel qui ne respecte pas toujours les normes.<br />
(c) La première spécification du RDF date de 1999.<br />
6. Lesquelles de ces affirmations sont vraies Choisissez toutes les réponses qui<br />
s’appliquent.<br />
(a) Pour l’essentiel, les applications RDF présentées dans ce cours, telles que<br />
Dublin Core, datent de 1999.<br />
(b) Un document FOAF doit être du RDF valable.<br />
(c) RSS est une technologie émergente peu utilisée.<br />
5.5.2 Solutions<br />
1. (a) Non. C’est en juillet 1999.<br />
(b) (Bonne réponse) Effectivement.<br />
(c) Non. L’information Dublin Core est souvent écrite en XML, mais n’a pas<br />
à l’être.<br />
(d) (Bonne réponse) Oui. En fait, la norme Dublin Core s’applique à toute<br />
création humaine (livres, films, etc.).<br />
2. (a) Non. Le lien « http://www.ledevoir.com/2004/09/30/65081.html » est un<br />
URI, pas nécessairement un URL.<br />
(b) (Bonne réponse) Effectivement.<br />
(c) Non. On ne sait pas quand l’article a été écrit : la date dans Dublin Core<br />
n’a pas une signification établie. La date pourrait plutôt être la date de publication.<br />
3. (a) (Bonne réponse) Correct.<br />
(b) (Bonne réponse) Effectivement.<br />
(c) Non. Creative Commons sert surtout à décrire les droits associés à des documents.<br />
4. (a) Non. Il s’agit un document valable.<br />
CC BY-NC-SA
Travail noté 6 377<br />
(b) L’adresse « http://www.mavieestbelle.com/index.html » doit être traitée<br />
comme un URI et non comme une URL; il pourrait ne pas y avoir de document<br />
à cette adresse.<br />
(c) (Bonne réponse) Effectivement.<br />
5. (a) Non. Tout document FOAF doit être du RDF valable.<br />
(b) Non. Le premier document FOAF était une forme de RDF, mais on n’écrit<br />
plus le RDF de cette façon.<br />
(c) (Bonne réponse) Effectivement. En 1998, Daniel Brickley était un précurseur<br />
du RDF.<br />
6. (a) (Bonne réponse) C’est vrai. Seul Creative Commons est plus récent.<br />
(b) (Bonne réponse) C’est vrai, même si l’exemple original de Dan Brickley<br />
n’est pas du RDF/XML valable.<br />
(c) Au contraire, des milliers de portails et des millions de sites web utilisent<br />
maintenant RSS.<br />
5.6 Travail noté 6<br />
5.6.1 Objectifs et pondération<br />
Ce travail porte principalement sur le RDF et compte pour 10 % de la note globale du<br />
cours. Il contribue à l’atteinte de l’objectif suivant :<br />
– Interpréter un fichier RDF comme un tableau sujet/verbe/objet.<br />
Le travail comporte sept exercices : les cinq premiers valent un point chacun et le<br />
sixième, qui porte sur le XSLT et contribue ainsi à renforcer les apprentissages du<br />
module 3, vaut 4 points, alors que le dernier compte pour un point, pour un total de<br />
10 points.<br />
5.6.2 Consignes<br />
Nous vous recommandons d’avoir terminé les activités d’autoévaluation du module 5<br />
avant de faire ce travail noté. De plus, comme le sixième exercice exige une bonne compréhension<br />
du XSLT, vous devriez avoir terminé le module 3 avant de l’entreprendre.<br />
Lorsque vous aurez terminé le travail, transmettez à votre personne tutrice, par courriel,<br />
un seul document (Word 97/2000/XP, ODF, PDF, RTF ou en format texte) comprenant,<br />
pour chaque exercice, le tableau, le code XML ou le contenu de votre document XSLT.<br />
Ne transmettez pas vos solutions en plusieurs fichiers. Ne transmettez pas une<br />
archive compressée (zip ou autre). L’objet de votre courriel doit commencer par<br />
« [<strong>INF</strong><strong>6450</strong>][TRAVAIL6] »; dans le message, indiquez votre nom, votre numéro<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 378<br />
d’étudiant (8 chiffres), la date de remise de votre travail et le nom de votre personne<br />
tutrice, ainsi que les mentions « Travail noté 6 » et « <strong>INF</strong> <strong>6450</strong> ». Il s’agit<br />
d’un travail personnel et vous ne devez pas partager vos solutions.<br />
Dans un tableau de triplets, les objets qui ne sont pas des URI, doivent être placés entre<br />
guillements (" ").<br />
5.6.3 Exercice 1<br />
Représentez, dans un tableau de triplets (sujet, verbe, objet), le document RDF/XML<br />
suivant :<br />
<br />
<br />
<br />
Site de l’UQÀM<br />
<br />
<br />
<br />
5.6.4 Exercice 2<br />
Écrivez un programme Java qui utilise l’API DOM pour extraire tous les titres des<br />
items d’un document RSS 1.0. Vous pouvez supposer que le fichier réside sur votre<br />
disque. Ne joignez pas un fichier à l’extension java.<br />
5.6.5 Exercice 3<br />
Représentez, dans un tableau de triplets (sujet, verbe, objet), l’exemple en RDF qui suit<br />
et qui provient de la norme PRISM.<br />
<br />
<br />
<br />
<br />
<br />
<br />
John Peterson <br />
<br />
<br />
CC BY-NC-SA
Travail noté 6 379<br />
<br />
<br />
Greece<br />
Grece<br />
<br />
<br />
<br />
<br />
5.6.6 Exercice 4<br />
Ecrivez un document XML/RDF correspondant au tableau suivant :<br />
Sujet Verbe Objet<br />
http://www.uqam.ca http://www.uquebec.ca/<br />
nom<br />
"UQÀM"<br />
5.6.7 Exercice 5<br />
La licence identifié par l’URI « http://www.mondomaine.ca/licence » permet la reproduction,<br />
la distribution et la modification des œuvres. Décrivez cette licence en utilisant<br />
Creative Commons et le format RDF/XML.<br />
5.6.8 Exercice 6<br />
Note.- Cet exercice vaut 4 points et est substantiellement plus difficile que les exercices<br />
précédents.<br />
Avant de réaliser l’exercice...<br />
Il peut arriver qu’on veuille annoter un document XHTML avec Dublin Core ou avec<br />
un autre vocabulaire RDF, mais sans vouloir utiliser la notation RDF/XML. L’annotation<br />
est particulièrement facile si aucun des objets n’est un URI. Pour y arriver, nous<br />
utiliserons des éléments « meta » et « link » placés dans l’élément « head » du document.<br />
Considérons l’exemple qui suit :<br />
<br />
<br />
<br />
<br />
<br />
CC BY-NC-SA
Module 5 : Resource Description Framework (RDF) 380<br />
<br />
<br />
<br />
<br />
<br />
<br />
un petit document<br />
<br />
<br />
Ceci est un document XHTML annoté avec Dublin Core.<br />
<br />
<br />
Cette façon de faire est documentée par le mémo disponible à l’adresse http://<br />
www.ietf.org/rfc/rfc2731.txt. Il n’est toutefois pas nécessaire de consulter ce mémo.<br />
Aux fins de cet exercice, nous allons supposer que seuls deux types de structures sont<br />
utilisés. D’abord, l’élément « link » peut être utilisé pour définir un préfixe, comme<br />
ceci :<br />
<br />
D’autre part, le préfixe peut être utilisé pour faire un lien entre le document courant et<br />
un sujet :<br />
<br />
Prenons comme exemple les quatres éléments suivants placés dans un document<br />
XHTML à l’adresse « http://www.uqam.ca/index.html » :<br />
<br />
<br />
<br />
<br />
Cette notation aura alors la signification suivante en RDF :<br />
Sujet Verbe Objet<br />
http://www.uqam.ca http://<br />
"c"<br />
www.mondomaine.com/<br />
a<br />
http://www.uqam.ca http://<br />
www.mondomaine.com/<br />
2/g<br />
"f"<br />
En notation RDF/XML, nous avons :<br />
<br />
Travail noté 6 381<br />
><br />
<br />
c<br />
f<br />
<br />
<br />
Notez qu’aucun des objets n’est un URI.<br />
Exercice à réaliser...<br />
Écrivez un document XSLT qui, étant donné un document XHTML annoté selon cette<br />
méthode, donne le document RDF/XML correspondant, en supposant que le document<br />
courant possède l’URI « http://mondocument.org ». Pour que l’on puisse voir la solution<br />
dans Firefox, produisez un document HTML qui contient le code du document<br />
RDF/XML comme dans l’exemple qui suit :<br />
<br />
<br />
<xml version="1.0" encoding="ISO-8859-1" ><br />
<rdf:RDF<br />
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" ><br />
<rdf:Description rdf:about="http://mondocument.org"><br />
<title<br />
xmlns="http://purl.org/dc/elements/1.1/"><br />
le titre de mon document<br />
</title ><br />
</rdf:Description><br />
</rdf:RDF><br />
<br />
En somme, votre document XSLT doit produire un document débutant par la balise<br />
html et contenant le document RDF/XML écrit avec des appels d’entités (<,>).<br />
Toute solution qui utilisera les éléments XSLT « xsl:key », « xsl:param » et<br />
« xsl:variable » sera refusée; une note de zéro sera accordée.<br />
Voici quelques indices...<br />
– Les documents XHTML utilisent l’espace de noms<br />
« http://www.w3.org/1999/xhtml ». Pour pouvoir les traiter en XSLT, il vous<br />
faut définir cet espace de noms comme dans cet exemple :<br />
<br />
Module 5 : Resource Description Framework (RDF) 382<br />
xmlns:xhtml="http://www.w3.org/1999/xhtml"<br />
><br />
<br />
<rdf:RDF></rdf:RDF><br />
<br />
– Les fonctions XPath « substring-before » et « substring-after » peuvent vous<br />
être utiles. La valeur de l’expression XPath « substring-before(’meta.dc’,’.’) » est<br />
« meta », alors que la valeur de l’expression « substring-after(’meta.dc’,’.’) » est<br />
« dc ».<br />
5.6.9 Exercice 7<br />
Le site flickr permet de chercher des photographies publiées avec une licence Creative<br />
Commons. Visitez la page http://www.flickr.com/photos/guppiecat/1351724368/<br />
in/set-72157601927001088/ et trouvez la licence Creative Commons. Écrivez-la en<br />
XML.<br />
CC BY-NC-SA
Annexe A : Glossaire<br />
Appel d’entité : Un appel d’entité est une suite de caractères (bout de texte) qui commence<br />
par une esperluette ( & ) et se termine par un point-virgule ( ; ). Les appels<br />
d’entité suivants font partie de la définition du XML :<br />
appel d’entité<br />
résultat<br />
< <<br />
&<br />
&<br />
> ><br />
" "<br />
' ’<br />
Attribut : Un attribut est un nom XML qui doit respecter les mêmes règles que les<br />
noms XML des balises; il est immédiatement suivi d’un signe d’égalité ( = ) et d’une<br />
valeur placée entre guillemets. Par exemple, la balise a un attribut<br />
(age="5") dont le nom XML est "age". Une balise peut avoir plusieurs attributs, comme<br />
, mais chacun doit avoir un nom XML différent; la balise<br />
n’est pas autorisée.<br />
Balise : Une balise est un texte commençant par le signe < et se terminant par le signe<br />
>, délimitant un élément. Il existe trois types de balises en XML : les balises qui commencent<br />
un élément, les balises qui terminent un élément et les balises d’élément vide.<br />
Par exemple, est une balise qui ouvre un élément. Une balise qui commence<br />
par marque que l’élément est vide, comme . Une déclaration<br />
de type de document (), une déclaration XML (), un<br />
commentaire () ou une région CDATA () ne sont pas des balises.<br />
383
Glossaire 384<br />
Bien formé : Un document XML bien formé respecte la grammaire XML et il peut<br />
être lu par n’importe quel parseur XML générique.<br />
Commentaire : Un commentaire commence par ; entre ces<br />
deux bornes, il ne peut y avoir deux tirets successifs (--), mais n’importe quoi d’autre<br />
peut s’y retrouver.<br />
CSS : Cascading StyleSheet.<br />
Déclaration de type de document : Une déclaration de type de document prend la<br />
forme , où l’on met à la place des premiers trois<br />
points le nom XML de l’élément-racine que le document doit avoir, et à la place des<br />
deuxièmes trois points, une URL vers le document DTD.<br />
Déclaration XML : La déclaration XML ressemble à s’y méprendre à une instruction<br />
de traitement et prend la forme . Le contenu d’une déclaration XML<br />
comporte généralement au maximum trois attributs : version="...", encoding="..." et<br />
standalone="...". La version du XML la plus utilisée est la 1.0; bien que la version<br />
1.1 existe, elle est fort peu utilisée. On utilisera souvent une déclaration XML<br />
avec « encoding="ISO-8859-1" » pour pouvoir utiliser les accents dans le document;<br />
par défaut, on ne peut pas utiliser les accents dans un document XML, sans des outils<br />
supportant les normes UTF-8/UTF-16. L’attribut « standalone » prend les valeurs yes<br />
ou no, selon que l’on veut que la DTD externe soit lue ou pas. La déclaration XML<br />
doit obligatoirement être au tout début du document ou être carrément absente : même<br />
un espace avant n’est pas permis.<br />
DocBook : C’est un format de document souvent utilisé pour la documentation technique.<br />
DOM (Document Object Model) : Le terme « DOM » a deux significations : un ensemble<br />
d’API utilisant un modèle en arbre ou un certain modèle en arbre.<br />
DTD (Définition de Type Document) : Une DTD permet de définir un type de document<br />
XML en spécifiant des contraintes sur les éléments, les attributs et leur contenu.<br />
Un document XML qui satisfait ces contraintes et qui est bien formé est dit valable.<br />
Élément : Un élément est l’ensemble du texte borné par deux balises ayant le même<br />
nom XML, comme et . On dit que l’élément a le nom<br />
XML « lavie ». L’élément hérite des attributs de sa balise de départ : l’élément possède l’attribut « age="5" ». Il est à noter que la casse est significative<br />
en XML : les balises < A > et < a > n’ont pas le même nom XML. Lorsque l’élément<br />
est vide, c’est-à-dire sans contenu, on peut remplacer par , pour être plus bref. Par ailleurs, un élément peut contenir d’autres éléments, comme<br />
dans , ou du texte ou du texte et des éléments, comme fdfsdfd.<br />
Si un élément contient l’élément de début ou de fin d’un<br />
élément, alors il doit aussi contenir l’autre. Ainsi, un élément peut être contenu par un<br />
autre ou non, mais deux éléments ne peuvent se chevaucher, comme ,<br />
qui est du XML mal formé.<br />
CC BY-NC-SA
Glossaire 385<br />
Élément-racine : Tout document XML bien formé doit avoir un élément-racine, et un<br />
seul. Tous les autres éléments doivent être contenus dans cet élément-racine.<br />
Espace de noms : Les espaces de noms permettent d’utiliser plusieurs vocabulaires<br />
XML en même temps.<br />
Extensible : Voir Métalangage.<br />
Graphe : Un graphe est un ensemble de nœuds liés par des relations d’un nœud à un<br />
autre.<br />
Graphe dirigé : Un graphe est dirigé si les relations sont à sens unique.<br />
Graphe annoté : Un graphe est annoté si les relations entre deux nœuds peuvent être<br />
de différentes natures.<br />
HTML (HyperText Markup Language) : Le HTML est un langage à base de balises.<br />
La majorité des documents sur le web sont écrits en HTML.<br />
Instruction de traitement : L’instruction de traitement ne fait rien en soit, mais peut<br />
indiquer aux programmes comment obtenir un certain résultat. Une instruction de traitement<br />
débute par « < » et se termine par « > »; immédiatement après le « < », un<br />
nom XML valable doit apparaître et tous les noms XML valables sont autorisés à l’exception<br />
de xml, Xml, XMl, XML, XmL, xMl, xML et xmL. Ainsi n’importe quel autre<br />
texte peut être utilisé, mais il faut faire des appels d’entités pour « < » et « & », comme<br />
pour n’importe quel contenu textuel XML.<br />
Métalangage : Le XML est un « métalangage » permettant d’échanger de l’information,<br />
principalement sur le web. On dit que c’est un « métalangage » parce qu’il permet<br />
de créer de nouveaux langages pour l’échange d’informations, mais qu’il ne constitue<br />
pas un langage en soi. On dit donc que le XML est « extensible » (peut être étendu) et<br />
que c’est un métalangage : les deux affirmations ont le même sens et notent la capacité<br />
du XML à s’adapter à des besoins différents.<br />
Nom XML : Le nom XML d’une balise est le texte suivant le symbole « < » ou<br />
«
Glossaire 386<br />
URI : C’est une adresse Internet fictive. L’URI agit un peu comme le numéro d’assurance<br />
sociale des vocabulaires XML.<br />
Valable :: Un document est valable s’il répond à certains critères de base de l’application<br />
XML. Un document XML qui est bien formé, qui en plus satisfait aux contraintes<br />
dictant quels éléments et attributs peuvent être utilisés, et dans quel ordre et avec quel<br />
contenu, est dit valable.<br />
Vocabulaire XML : Un « vocabulaire XML » est un ensemble de noms de balises et<br />
d’attributs ayant une signification donnée. Un vocabulaire XML peut être associé à un<br />
document DTD.<br />
XHTML : Le XHTML est un format hybride : il tient à la fois du HTML et du XML.<br />
XML : eXtensible MarkupLanguage.<br />
XSL : eXtensible Stylesheet Language.<br />
XSLT : XSL Transformations.<br />
XSL-FO : eXtensible Stylesheet Language Formatting Objects.<br />
CC BY-NC-SA
Annexe B : Webographie XML<br />
Tous les liens ont été vérifiés en février 2007.<br />
1 Blogues<br />
– http://www.daniel-lemire.com/blogue/category/xml/ (blogue du cours)<br />
– http://www.tbray.org/ongoing/<br />
– http://formats-ouverts.org/blog/<br />
2 Cours en ligne, en français<br />
– http://www.commentcamarche.net/xml/xmlintro.php3<br />
– http://www.laltruiste.com/coursxml/sommaire.html<br />
3 Cours en ligne, en anglais<br />
– http://www.w3schools.com/<br />
– http://www.w3schools.com/xml/default.asp<br />
– http://www.w3schools.com/xml/xml_examples.asp<br />
4 Liens généraux, en français<br />
– L’espace XML francophone : www.xmlfr.org<br />
– Rubrique XML chez Wikipedia<br />
387
Webographie XML 388<br />
5 Articles, en français<br />
– A. Crochet-Damais, Microsoft Office 2003 : le format XML pointé du doigt<br />
6 Articles, en anglais<br />
– J. Hunt, et al. Why use DITA to produce HTML deliverables<br />
– D. Terdiman, Weather Data for the Masses<br />
7 Références tirées du site Wikipedia (anglais)<br />
7.1 Spécification XML<br />
– Spécification XML annotée : http://www.xml.com/axml/testaxml.htm<br />
– Site du World Wide Web Consortium : http://www.w3.org/<br />
– Page d’accueil XML du World Wide Web Consortium : http://www.w3.org/XML/<br />
– Spécification XML 1.1 : http://www.w3.org/TR/xml11<br />
– Spécification XML 1.0 : http://www.w3.org/TR/REC-xml<br />
7.2 Software<br />
– Éditeur XML open : http://www.philo.de/xmledit/<br />
– Librairie XML open pour Delphi/Kylix : http://www.philo.de/xml/<br />
– Éditeur jEdit : http://jedit.org<br />
7.3 Ressources pour les développeurs<br />
– FAQ XML : http://www.ucc.ie/xml/<br />
– xml.com, développement et ressources : http://www.xml.com/<br />
– Cafe con Leche, nouvelles et ressources XML : http://www.cafeconleche.org/<br />
– XML Cover Pages : http://xml.coverpages.org/<br />
– Page web des développeurs IBM : http://www-106.ibm.com/developerworks/xml/<br />
– Site de nouvelles pour les développeurs XML : http://www.xmlhack.com/<br />
– Mailing liste XML-L : http://listserv.heanet.ie/xml-l.html<br />
– DTD et schemas XML : http://www.XMLPatterns.com/<br />
– Tutoriel sur Relax NG : http://www.oasis-open.org/committees/relax-ng/tutorial-<br />
20010810.html (traduit en français : http://xmlfr.org/oasis/committees/relax-ng/<br />
tutorial-20011203-fr.html)<br />
– Les problèmes du XML : http://c2.com/cgi/wikiXmlSucks<br />
– XML : http://www.ericdigests.org/2000-4/xml.htm<br />
CC BY-NC-SA
Liens vers des livres portant sur le XML, en anglais 389<br />
– XML Linking : état de l’art : http://chinese-school.netfirms.com/xlink.html<br />
– Un outil XSLT (Markup of XML contents) : http://www.ultra-fluide.com/ressources/<br />
en/semark/presentation.htm<br />
8 Liens vers des livres portant sur le XML, en anglais<br />
– XML: Managing Data Exchange (wikibook)<br />
– XML in a Nutshell, by Harold and Means<br />
– Beginning XML, 3rd Edition, by David Hunter, Andrew Watt, Jeff Rafter.<br />
– Learning XML, by Erik T. Ray.<br />
– XML Schema, by Eric Van Der Vlist.<br />
– Processing XML with Java(TM): A Guide to SAX, DOM, JDOM, JAXP, and TrAX,<br />
by Elliotte Rusty Harold.<br />
CC BY-NC-SA
Annexe C : Pense-bête DTD<br />
: Déclaration de type<br />
de document<br />
: Instruction<br />
: Élément optionnel<br />
* : Élément pouvant être présent plus d’une fois (de 0 à l’infini)<br />
+ : Élément présent au moins une fois et qui peut être présent plusieurs fois<br />
| : Ou<br />
#PCDATA : Que du texte<br />
: Spécifie que l’élément « X » a l’attribut<br />
« Y »<br />
CDATA : Attribut contient du texte<br />
#REQUIRED : Attribut obligatoire<br />
#IMPLIED : Attribut optionnel<br />
#FIXED : Attribut fixé avec une valeur<br />
: L’entité « nomEntiteX » prend la valeur<br />
« Yvaleur »<br />
: Localement, l’entité « nomEntiteX » prend<br />
la valeur « Yvaleur » dans la DTD<br />
391
Annexe D : Pense-bête HTML<br />
Balise<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Signification<br />
paragraphe<br />
liste non ordonnée<br />
élément de la liste<br />
liste ordonnée<br />
élément de la liste<br />
tableau<br />
ligne<br />
cellule<br />
italique<br />
italique (généralement)<br />
gras<br />
gras (généralement)<br />
souligné<br />
393
Pense-bête HTML 394<br />
Balise<br />
<br />
<br />
<br />
<br />
<br />
<br />
Signification<br />
liste de définitions<br />
terme à définir<br />
définition du terme<br />
ligne horizontale<br />
affiche une image<br />
texte hyperlien<br />
texte marqueur<br />
CC BY-NC-SA
Annexe E : Pense-bête XSLT<br />
Document XSLT de base<br />
<br />
<br />
<br />
« xsl:template » : Permet de définir un modèle avec un élément comme ; à chaque élément facture trouvé, le processeur XSLT applique le<br />
modèle correspondant.<br />
« xsl:apply-templates » : Cet élément donne le résultat obtenu par l’application de<br />
modèles (éléments « xsl:template »).<br />
« xsl:value-of » : Donne la valeur textuelle d’une expression XPath. Par exemple,<br />
l’instruction où « ... » est le nom de l’élément donne le<br />
texte contenu dans l’élément, les balises en moins.<br />
« » : Pour effectuer la sélection des attributs. Ici,<br />
l’attribut « nas » de l’élément « personne » ().<br />
Expression XPath avec « . » (un point) : Indique le nœud courant. Par exemple,<br />
l’instruction donne le contenu textuel de l’élément courant.<br />
Expression XPath avec « / » (barre oblique) : Permet d’effectuer la sélection<br />
de nœuds contenus dans des éléments. L’instruction « » donne le contenu textuel des éléments « prenom » contenus<br />
dans les éléments « nom » de l’élément courant. La barre oblique ( / ) peut aussi représenter<br />
le nœud-racine; ainsi, l’expression « /maison » sélectionne l’élément-racine, si<br />
et seulement s’il se nomme « maison ».<br />
Expression XPath avec « @ » : Permet d’effectuer la sélection des attributs. L’instruction<br />
« » donne le contenu textuel de l’attribut<br />
« nas » de l’élément courant.<br />
395
Pense-bête XSLT 396<br />
(accolades) : Pour spécifier la valeur d’un attribut; par exemple, avec l’expression<br />
, le processeur XSLT va remplacer ... par la valeur de l’expression<br />
XPath « ... » et s’il s’agit du nom d’un élément, le contenu textuel de l’élément<br />
y sera inséré.<br />
Expression XPath avec « .. » (deux points successifs) : Permet d’obtenir la valeur<br />
de l’élément dans lequel le nœud courant est situé. On peut aller chercher le parent du<br />
parent avec l’instruction .<br />
Expression XPath avec « // » (deux barres obliques) : Permet de sélectionner tous les<br />
éléments et sous-éléments qui sont dans l’élément ou nœud courant. Par exemple, l’instruction<br />
donne le nombre total d’éléments<br />
« cours » contenus dans l’élément ou nœud courant, incluant les éléments « cours »<br />
contenus dans les sous-éléments.<br />
Expression XPath avec « * » (astérisque) : Permet de sélectionner tous les éléments<br />
(mais pas les attributs ou les nœuds de texte) qui sont dans l’élément courant. Une<br />
expression avec « @* » sélectionne tous les attributs d’un élément.<br />
Expression XPath avec « | » (barre verticale) : Permet de sélectionner en utilisant<br />
plusieurs expressions à la fois; cette expression signifie « ou ». L’expression<br />
« nom|prenom » sélectionnera tous les éléments « nom » et « prenom » dans l’élément<br />
courant.<br />
« » : Permet de sélectionner le nom d’un élément<br />
(et pas son contenu). Pour sélectionner le nom du parent, il faut utiliser « .. » au lieu de<br />
« . ».<br />
Fonction XPath « count » : Permet de compter le nombre de nœuds (éléments) sélectionnés;<br />
par exemple « count(montant) » compte le nombre d’éléments « montant ».<br />
Fonction XPath « sum » : Permet de faire la somme des valeurs numériques dans<br />
les nœuds (éléments) sélectionnés; par exemple « sum(montant) » fait la somme des<br />
valeurs numériques dans les éléments « montant ».<br />
« xsl:number » : Permet de numéroter des éléments correspondant à une expression<br />
avec l’attribut « count »; un exemple d’utilisation : donnera le chiffre 3 pour le troisième élément « montant » contenu dans un même<br />
élément.<br />
Attribut « mode » : Permet d’avoir plusieurs modèles pour une même expression;<br />
s’applique aux éléments « xsl:apply-templates » et « xsl:template »; par exemple,<br />
ou .<br />
Fonction XPath « generate-id » : Permet de générer un identifiant unique pour chaque<br />
nœud d’un document XML comme dans l’expression « generate-id(.) ».<br />
« xsl:choose » et « xsl:if » : permet de tester des conditions avec les symboles « < »,<br />
« = », « != », « or », « and », « > », « >= », «
Pense-bête XSLT 397<br />
montant<br />
<br />
<br />
donne le nom de l’élément si l’élément courant est un élément « montant » ou alors, le<br />
symbole « ». L’instruction XSLT<br />
2 maisons<br />
donne le chiffre 2, s’il y a deux éléments « maison » dans l’élément courant.<br />
Notion de liste d’éléments en XPath : Équivalent des tableaux en Java ou C/C++,<br />
mais la numérotation des éléments débute à 1; on utilise les crochets pour accéder aux<br />
éléments de la liste. L’expression XPath « para[1] » sélectionne le premier élément<br />
nommé « para ». L’expression « para[1]/em[2] » sélectionne le second élément « em »<br />
contenu dans le premier élément nommé « para ».<br />
Utilisation de XSLT comme base de données : Par exemple, l’expression XPath<br />
client[nom=’Sylvain’] nous donne les éléments « client » pour lesquels le contenu<br />
du sous-élément « nom » est « Sylvain ».<br />
« xsl:for-each » : Lorsqu’il y a un ensemble de résultats, on itère sur la séquence de<br />
tous les éléments « client » ayant comme nom « Sylvain » avec l’expression XPath<br />
//client[nom=’Sylvain’]. Par exemple, l’instruction « , » donnera une liste, séparée par des virgules,<br />
du contenu textuel de tous les éléments « client » contenus dans l’élément courant.<br />
Fonction XPath current() : Représente toujours l’élément XSLT courant. L’expression<br />
« //client[nom=current()/nom] » donne tous les éléments « client » qui ont un<br />
attribut « nom » dont la valeur est la même que l’élément courant. Par contre, l’expression<br />
« //client[nom=./nom] » a la même signification que « //client[nom] », c’est-àdire<br />
qu’on sélectionne tous les éléments « client » contenus dans l’élément courant ou<br />
ses sous-éléments qui ont un attribut « nom ».<br />
Fonctions arithmétiques XPath : On peut faire des calculs simples en XPath comme<br />
dans les expressions « 1+1 », « 2*1 » et « 5 div 2 ». On aussi les fonctions « floor »,<br />
« ceiling » et « round ».<br />
CC BY-NC-SA
Bibliographie<br />
[1] « IT 4247 XML fundamentals (course outline) ».<br />
[2] « Xml, xsl and web applications » – http://www.infosys.tuwien.ac.at/teaching/<br />
courses/XML/.<br />
[3] « Draft standard for learning object metadata » – Tech. Report 1484.12.1-2002,<br />
IEEE, July 2002.<br />
[4] « Dublin core metadata element set, version 1.1: Reference description » – Tech.<br />
report, DCMI, 2003.<br />
[5] « W3 schools » – http://www.w3schools.com/, 2004.<br />
[6] A. B. ET AL. – XML: la synthèse, Dunod, 2003.<br />
[7] H. A. ET AL. – Building corporate portals using XML, McGraw Hill, 1999.<br />
[8] J. P. ET AL. – Professional XML, Wrox, 2001.<br />
[9] L. BIRKEDAL – « Advanced XML / data on the web (course outline) », http:<br />
//www.itu.dk/~birkedal/teaching/data-on-the-web-Fall-2002/.<br />
[10] H. BOLEY – « Auszug vorlesungsverzeichnis informatik », http://www.dfki.<br />
uni-kl.de/~boley/lexml/.<br />
[11] H. BOLEY et B. SPENCER – « CS 6905 semantic web techniques (course outline)<br />
», http://www.cs.unb.ca/~bspencer/cs6905swt/syllabus.html.<br />
[12] H. BOLEY, S. TABET et G. WAGNER – « Design Rationale of RuleML: A Markup<br />
Language for Semantic Web Rules », Proc. Semantic Web Working Symposium<br />
(SWWS’01), Stanford University, July/August 2001, p. 381–401.<br />
[13] M. DEAN et G. SCHREIBER – « OWL Web Ontology Language – Reference »,<br />
W3C Candidate Recommendation, W3C, August 2003.<br />
[14] S. DOWNES – « Topic representation and learning object metadata », http://www.<br />
downes.ca/post/99, 2002.<br />
[15] E. R. HAROLD – XML bible, John Wiley & Sons, 2001.<br />
[16] E. R. HAROLD et W. SCOTT – XML in a nutshell, O’Reilly, 2003.<br />
[17] J. HJELM – Creating the semantic web with RDF: Professional developer’s guide,<br />
John Wiley & Sons, 2001.<br />
399
Bibliographie 400<br />
[18] J. HUNT, D. DAY, E. HENNUM, M. PRIESTLEY et D. A. SCHELL – « Why use<br />
DITA to produce HTML deliverables », http://www-106.ibm.com/developerworks/<br />
xml/library/x-dita6/index.html.<br />
[19] S. LUCAS – « CC432-G-SP: XML and related technologies (course outline) »,<br />
http://www2.essex.ac.uk/courses/result.aspcoursecode=CC432&level=G&period=<br />
SP&yearofcourse=03.<br />
[20] B. MCLAUGHLIN – Java & XML, O’Reilly, 2001.<br />
[21] E. T. RAY – Learning XML, O’Reilly, 2001.<br />
[22] K. M. TADIOU – « IFT-62399 web sémantique ».<br />
[23] E. TITTEL – XML, Schaum’s, Dunod, 2003.<br />
CC BY-NC-SA