30.01.2015 Views

Manuel INF 6450 (complet) - Téluq

Manuel INF 6450 (complet) - Téluq

Manuel INF 6450 (complet) - Téluq

SHOW MORE
SHOW LESS

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 />

&quot; "<br />

&apos; ’<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&amp;Smith.<br />

Le texte « ]]> » s’écrit « ]]&gt; ».<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) &lt;<br />

(b) &amp;<br />

(c) &pluspetit;<br />

(d) &gt;<br />

(e) &quot;<br />

(f) &guillemet;<br />

(g) &apos;<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 &quot; .<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 &lt.<br />

(d) Non. Il faut remplacer & par &amp;.<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, « &lt; »,<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 />

&#169; <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 />

&#169; <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, &amp;<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 &lt; 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 &lta href="..."&gt;, 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 />

&lt;xml version="1.0" encoding="ISO-8859-1" &gt;<br />

&lt;rdf:RDF<br />

xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" &gt;<br />

&lt;rdf:Description rdf:about="http://mondocument.org"&gt;<br />

&lt;title<br />

xmlns="http://purl.org/dc/elements/1.1/"&gt;<br />

le titre de mon document<br />

&lt;/title &gt;<br />

&lt;/rdf:Description&gt;<br />

&lt;/rdf:RDF&gt;<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 (&lt;,&gt;).<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 />

&lt;rdf:RDF>&lt;/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 />

&lt; <<br />

&amp;<br />

&<br />

&gt; ><br />

&quot; "<br />

&apos; ’<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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!