Avant-proposLa première version de ce document a été écrite en 2001. A cette époque, seul IE implémentait partiellement le support du XML et encore, comme la norme n'était pas encore fixée, de nombreuses manipulations "propriétaires". Avec Mozilla 1.2 et IE 6.0, la norme est maintenant parfaitement implémentée et l'interopérabilité quasi parfaite. On peut donc vraiment faire du XML pour la publication de pages Ouaib sans utiliser de serveurs particuliers ou de parseurs supplémentaires. Fort de cette constatation, en ce début du mois d'avril 2003, j'ai refait du XML et je vais essayer de refaire petit à petit ce document avec des exemples et les nouveautés. XML en brefXML est l'acronyme de eXtensible Makup Language. On peut voir XML comme une généralisation de HTML ou bien comme une restriction de SGML (Standard Generalized Markup Language). Le but d'XML est de faciliter la création, la distribution des documents SGML sur le Web et d'augmenter l'interopérabilité entre l'HTML et le SGML. Par construction, un document XML est aussi un document SGML et peut donc être utilisé par un moteur SGML. En HTML, l'ensemble des balises est fixé ainsi que leurs attributs et les règles d'utilisation. L'XML abolit ces contraintes et est en ce sens un véritable méta-langage (pour décrire des langages à balises). XML a été développé par le XML Working Group sous l'égide du World Wide Web Consortium (W3C) en 1996. Les buts (tels que décrits dans la spécification (cf [XML1] ) sont :
La spécification d'XML est associée à divers standards :
Le document XMLUn document XML a une structure physique et une structure logique. Physiquement, un document XML est constitué d'une ou plusieurs unités de stockage appelées entités. Elles ont toutes un contenu et sont identifiées par leur nom (exception faite de l'entité document et du sous-ensemble externe de la DTD). Chaque document XML possède exactement une entité appelée entité document ou encore racine qui est le point de départ du processeur XML et qui contient le document entier (si celui-ci a un contenu). Ces entités peuvent contenir des données analysables (parsed) ou pas. Le contenu de l'entité analysable est vu comme un texte de remplacement (voir la notion de texte) et ce texte fait partie intégrale du document. Les données analysables sont soit des chaînes de caractères soit des balises. Les balises décrivent la structure logique du document et le contenu (storage layout) sur lesquels on peut imposer des contraintes. Une entité non analysable peut contenir du texte ou non. S'il s'agit de texte, celui-ci peut ne pas être du XML. A chaque entité non analysable est associée une notation identifiée par un nom. XML n'impose aucune contrainte sur le contenu d'une entité non analysable si ce n'est que le nom de l'entité ou de la notation doit être accessible à l'application. Les entité analysables sont appelées par leur nom par un appel d'entité. Les entité non analysables sont appelées par leur nom défini par un attribut ENTITY ou ENTITIES. Une entité est dite générale quand elle est utilisée dans le document. Une entité est dite paramètre quand elle est utilisée pour la définition de type (dans la DTD). Ces entités utilisent des formes d'appel différentes et sont utilisées dans des contextes différents. Elles occupent aussi des espaces de nommage différents. Ainsi une entité générale et une entité paramètre portant le même nom sont des entités différentes. Logiquement, le document XML est composé de déclarations, d'éléments, de commentaires, d'appels de caractères, d'instructions de traitement qui sont indiquées par un balisage explicite. La structure physique et la structure logique doivent s'emboîter proprement (on dit alors que les entités analysables doivent être bien formées). Document XML bien forméUn document XML est dit bien formé (well formed) s'il respecte les conditions suivantes :
Un document bien formé peut aussi être valide (valid) si celui-ci possède une DTD. Par la notion de texte, on entend un ensemble constitué de données textuelles(character data) et de balisage. Le balisage peut prendre la forme de balise ouvrante, fermante ou vide, l'appel d'entités ou de caractères, les commentaires, les délimiteurs de section CDATA, les déclarations de type de document, les instructions de traitement, les déclarations XML, les déclarations de texte Tout ce qui n'est pas balisage est dit données textuelles. On ne peut utiliser les caractères & et < que lorsqu'ils servent de délimiteurs pour le balisage. Sinon, il faut faire un appel de caractère ou un appel d'entité.
Tous les appels de caractères peuvent ête précédé par un caractère d'échappement : ainsi & devient &#38; Les commentaires peuvent apparaître partout en dehors de tout balisage.
Ils ne font pas partie des données textuelles. L'appel d'entités
paramètre n'est pas autorisé dans les commentaires. La syntaxe
est la suivante : Pour des raisons de compatibilité, on ne peut pas utiliser le double tiret - dans le commentaire lui-même. Les sections CDATA peuvent apparaître partout ou des données textuelles peuvent apparaître. Elles distinguent des chaînes de caractères qui autrement pourraient être considérées comme du balisage. Elles commencent par <![CDATA[ et se terminent par ]]>. Exemple : Entête d'un documentUn document XML doit commencer par un entête qui spécifie
la version utilisée. Dans cet entête, on peut trouver des informations sur le codage de caractères, sur la présence d'une DTD. Déclaration de type de document et DTDLa déclaration de type de document (document type declaration) permet de contrôler la structure logique du document XML et de réutiliser des entités déjà définies. Un document XML est dit valide s'il possède une déclaration de type de document et s'il la respecte. La déclaration de type de document doit apparaître avant le tout premier élément du document. La déclaration de type de document contient ou désigne des déclarations de balisage, ce qui offre une grammaire pour la classe de documents. Cette grammaire est plus connue sous le nom de définition de type de document (document type definition) ou DTD. La déclaration du type de document peut pointer sur un sous-ensemble externe, un type spécial d'entité externe, contenant les déclarations de balisage, ou bien pointer directement sur un sous-ensemble interne, ou bien encore les deux à la fois. La DTD d'un document correspond à la prise en compte des deux sous-ensembles (le sous-ensemble interne a priorité sur le sous-ensemble externe). Une déclaration de balisage peut être une déclaration de type d'élément, une déclaration d'une liste d'attributs, une déclaration d'entité ou une déclaration de notation. Ces déclarations peuvent être contenues entièrement ou en partie dans des entités paramètres. Les déclarations peuvent être constituées de texte de remplacement ou d'entités paramètre. L'appel d'entités paramètre est reconnu partout dans toute la DTD sauf dans les littéraux, les commentaires, les instructions de traitement, le contenu des sections conditionnelles ignorées. Il y a cinq grand types de contraintes :
ATTENTION : MS IE 5.0 ne semble pas traiter correctement la DTD : dans mon code, j'ai placé une balise avec un contenu mais déclarée EMPTY dans la DTD et je n'ai pas eu de message d'erreur. Structure logiqueChaque document XML contient un ou plusieurs éléments : les éléments non vides sont délimités par une balise ouvrante et une balise fermante, les éléments vides par un balise d'élément vide. Chaque élément est repéré grâce à son nom, encore appelé identificateur générique (generic identifier), possède un type et une liste d'attributs. Chaque spécification d'attribut a un nom et un type. XML n'impose aucune contrainte sur le nom exception faite qu'un nom ne peut commencer par les lettres x, m et l quelle que soit la casse. Soit l'élément suivant : Contrairement au HTML, toute balise XML doit être obligatoirement
fermée. Cela donne une syntaxe particulière pour les éléments
vide. Comme en HTML, chaque élément peut avoir des attributs.
Ceux-ci se placent uniquement dans les balises ouvrantes ou bien dans
les balises vides. Les noms des attributs sont obligatoirement écrits
en minuscule et leur valeur est encadrée par des guillemets. XML par l'exempleLe document XMLPratiquement, un document XML est constitué de trois fichiers :
Les trois fichiers cités sont tous des documents XML dans la mesure où ils respectent tous les règles de constructions XML (par exemple, ils commencent tous par un entête qui spécifie la version d'XML utilisée). Le fichier contenu porte l'extension ".xml", on l'appelle le fichier XML. Il est organisé hiérarchiquement.
L'entité racine est ici l'élément de balise <FILM>. Pour les règles d'écriture des éléments et leurs attributs, il faut consulter la section "Structure logique". Dans un fichier XML, on ne s'occupe que du contenu et en aucun cas de la mise en forme. Celle-ci est décrite dans des fichiers dédiés appelés feuilles de style d'extension ".css" ou ".xsl". On peut utiliser les feuilles de style CSS définies par HTML ou bien utilisé la nouvelle feuille de style spécifique au XML : XSL ou Extensible StyleSheet Language. Dans la feuille de vérification ou DTD, on peut y trouver la liste de toutes les balises utilisables avec une description de leurs attributs et le type du contenu. Dans l'exemple précédent, on sera averti si l'on utilise la balise <NAME> en lieu et place de <NOM>. De même, on pourra fixer le contenu de la balise <ANNEE> pour être sûr que le contenu est bien un nombre. L'entête d'un fichier XML est de la forme : Les attributs standalone et encoding sont optionnels. Leurs valeurs par défaut sont celles données dans l'exemple. L'attribut standalone a la valeur yes si une DTD n'est pas associée au ficher, no sinon. L'attribut encoding précise le jeu de caractères utilisé (parmi tous ceux que propose la norme unicode). Par exemple :
L'entête L'entête doit aussi préciser où se trouvent la feuille de style et la DTD. Aller plus loin :Si dans un fichier XML, on veut utiliser une entité générale,
on note celle-ci &nom;. DTDLa DTD, si elle existe, doit être placée avant le premier élément du fichier XML. Si celle-ci est externe, ce qui est le cas le plus courant, on se contentera
de donnerle nom du fichier où elle se trouve : Si la DTD est interne (incluse dans le fichier XML), la syntaxe est la
suivante : La DTD peut très vite devenir complexe d'où la nécessité
de la commenter. La syntaxe d'un commentaire est la suivante : Si l'on veut contraindre le contenu d'une balise, il faut faire une définition
d'élément. La syntaxe est la suivante : Un élément peut être défini comme un groupe d'un ou plusieurs sous-éléments/sous-groupes, comme contenant des données textuelles, vide ou quelconque. Avec les déclarations suivantes, on définit différents
types d'éléments. PCDATA signifie Parsed Character DATA ou données textuelles analysables. Cette dénomination est directement issue de SGML. Les éléments définis comme vide, quelconque ou données textuelles sont dit éléments terminaux du langage. Les élément définis comme groupe sont des éléments non terminaux. De nombreuses opérations sont possibles pour les éléments non-terminaux.
Différents opérateurs peuvent être appliqués à des sous-éléments, sous-groupes ou groupes, l'opérateur ? pour un groupe optionnel, l'opérateur + pour dire "le groupe est présent au moins une fois), l'opérateur * pour dire "le groupe peut être présent (éventuellement plusieurs fois) ou pas".
Un élément peut avoir zéro, un ou plusieurs attributs. Pour chaque élément, on peut définir une liste d'attributs (simple ou multiple). Pour chaque attribut de la liste, on peut imposer le nom, le type et l'usage. On va définir deux attributs a et b pour l'élément A. Les deux formulations suivantes sont équivalentes :
Le premier exemple est une liste simple, l'autre est une liste multiple. Dans le cas général, on a : Les attributs peuvent être optionnels, obligatoires ou fixés (Ce que j'ai appelé l'usage). Quand un attribut est optionnel, il peut avoir une valeur par défaut. Quand l'attribut est fixé, il a obligatoirement une valeur par défaut, sa valeur... Par défaut, un attribut est optionnel et avec une valeur par défaut. Si la valeur par défaut n'est pas précisée, il faut spécifier le mot-clé #IMPLIED. Un attribut obligatoire se repère par le mot-clé #REQUIRED et Un attribut fixé par #FIXED.
Chaque attribut est typé. Si l'attribut est une chaîne de caractères, on utilise le
mot-clé CDATA. La valeur de l'attribut peut aussi appartenir
à une simple énumération définie par l'utilisateur. Un attribut peut aussi être bien plus complexe.
Les mots-clé ID et IDREF permettent de manipuler
des éléments par leurs identificateurs ou ID. Les mots-clé ENTITY et ENTITIES signifient que l'attribut
pointe sur des données externes exprimées sous formes d'entités
non analysables. Les attributs qualifiés par NMTOKEN ou NMTOKENS
peuvent avoir pour valeur un ou plusieurs symboles (tokens) . La déclaration d'une entité paramètre est la suivante
: Une notation identifie par un nom le format d'une entité non analysable
(un chemin d'accès ou une URL par exmple).
XSL
Pour afficher une page XML, il est nécessaire de disposer d'un système décrivant comment une telle page peut être affichée. Pour cela, on peut utiliser celui développé pour HTML, le CSS ou Cascade Style Sheets, ou lui préférer un nouveau système développé pour XML, le XSL ou eXtensible StyleSheets Language. XSL est bien plus puissant que CSS : non seulement XSL permet de formater les données XML mais il permet aussi de les filtrer et de les trier. D'un point de vue théorique, XSL permet de passer de l'arbre source à un arbre résultat (processus dit de transformation encore appelé XSLT) et d'afficher cet arbre résultat (processus dit de formatage). Ainsi la séparation des données et de l'affichage cher à XML est bien respecté. Pour utiliser une feuille de style XLS avec le fichier XML, il faut préciser
dans l'entête du fichier XLM où se trouve la feuille de style
: Le fichier XSL est avant tout fichier XML : il a donc un entête qui précise la version d'XML utilisée et le type de fichier.
ATTENTION : le XSL tel
qu'il est traduit par Internet Explorer 5.0 ou 5.5 n'est pas tout à
fait compatible avec la norme du W3C. En effet, à la sortie d'IE
5.0, la norme n'était pas encore complètement définie.
Voici l'entête de fichier qu'il fallait utiliser :
On peut voir le XSL comme un patron (template) HTML pour générer du HTML. Il faut noter que le HTML utilisé dans un fichier XSL n'est pas tout à fait du vrai HTML : le HTML doit être bien formé, c'est-à-dire vérifier les règles de bonne formation du XML : toutes les balises doivent être fermées, les caractères &, < doivent être correctement utilisés (si ces caractères ne sont pas utilisés pour la syntaxe, ils ne peuvent pas se trouver sous cette forme, il faut utiliser des appels d'entités ou des appels de caractères ...) Toutes les directives XSL ont un nom qui commence par xls. La ligne Dans l'exemple, l'élément xsl:for-each repère les éléments dans le fichier XML et répète un patron pour chacun. L'attribut select décrit l'élément dans le fichier source. La syntaxe pour cet attribut est appelée un motif XSL (XSL pattern) et fonctionne comme un système de fichiers où le caractère / sépare les différents répertoires. L'élément xsl:value-of sélectionne un nud fils dans la hiérarchie et insère son contenu dans le patron. XPathOn peut voir le XPath comme le chemin à faire pour trouver un élément. La syntaxe est très proche de celle des systèmes de fichiers UNIX ou MS-DOS. FILM/DISTRIBUTION/PERSONNAGE en est un : on a tout le cheminement pour atteindre l'élément PERSONNAGE (il n'y aura pas confusion avec un autre élément de même nom mais dans une branche différente..) On peut utiliser les caractères jokers (*, ?) et on retrouve le point (.) et et le point-point (..). Il y a de nombreuses autres possibilités. Pour retrouver un attribut, on précédera son nom de l'arobase @. Les crochets permettent de tester les descendants : FILM/DISTRIBUTION/*[NAME] Tous les exemples dans ce document utilisent une forme rapide d'expression des XPath. Il existe une version étendue. TriImaginons maintenant que l'on ait envie d'afficher les personnages dans
l'ordre alphabétique. XSL fournit l'attribut order-by pour
cela. Le motif devient alors : Le symbole + signifie que l'on veut l'ordre croissant. Si on veut l'ordre décroissant, on utilisera le symbole -. REMARQUE : Je n'ai pas tester si le + ou - est toujours valide en 2003, un attribut est présent pour changer l'ordre. Il faut parler de la signification des crochets et de la petite incompatibilité IE/SAXON à ce sujet et comment la contourner. FiltreOn peut aussi filtrer très facilement des données. Imaginons
que l'on ait plusieurs personnages "singe". On peut choisir
de n'afficher que ceux-ci : Les opérateur de filtrage sont au nombre de quatre : l'égalité =, la différence != , l'inférieur <&, le supérieur >&. On peut faire la même chose en n'utilisant plus de filtre mais
le motif si <xsl:if> : On peut faire cette opération avec une structure de choix conditionnel
<xsl:choose> : Remarque : SAXON n'aime pas cette dernière syntaxe (tirée de la MSDN) mais il existe une autre forme correcte elle-aussi et comprise par IE et SAXON. Il existe plusieurs méthodes pour afficher un fichier XML et sa feuille de style XSL :
XML : inconnu au bataillon ?Où et quand utiliser XML ?En ce qui concerne les navigateurs, IE 6.0 et Mozilla 1.2 supportent parfaitement le XML et XSL. Si vous voulez utiliser XML avec un IE de version antérierue, vous aurez des problèmes de compatibilité certains. XML est déjà présent dans des applications comme format de fichier de données : OpenOffice, Office XP ?. Il existe aussi de nombreux parseurs pour XML, je ne citerai que le projet Xercès qui existe pour de nombreux langages. XML et JAVA : SAXUn package JAVA a été dévelopée pour lire du XML : il s'agit de SAX. Celui-ci est intégré au JDK1.4b. Un tutorial est en cours d'écriture sur le site de Sun.SAXONSAXON est une librairie d'outils JAVA (qui s'appuie sur JAXP) pour notamment transformer du XML (et XSLT) en HTML. Bien pratique en attendant une généralisation d'XML dans les browsers. Sur le site de Fabrice (http://lzzb.free.fr), vous pouvez voir des exemples d'utilisation de SAXON (cf [DIV3]). Le XSL de SAXON et de IE ne sont pas tout à fait compatibles mais avec quelques efforts, on peut produire du code compréhensible pour les deux (à cetains entêtes près). Alternatives/DiversIl existe aussi une autre possibilité : faire transformer le XML en HTML par le serveur... Allez voir le projet Apache correspondant. ExemplePour voir ce que donnait le XML en 2003, j'ai tapé un début de bibliographie donc je fournis les fichiers comme exemple. La première bonne surprise est la compatibilité IE 6.0 et Mozilla 1.3. La documentation de référence dont je me suis servi pour mettre mes connaissances à jour est le [XSL4]. Dans la feuille XSL, il y a un peu de javascript. Cela reste limité à la portie congrue car, normalement l'usage du javascript dans la feuille n'est pas préconisé (recharger une page est possible, se déplacer à un endroit avec une balise id ou name, même si elle est désormais dépréciée, aussi mais il faut encorei que je teste le passage de paramètres). J'ai utilisé de manière intensive la balise apply-template. J'ai systématiquement évité les appels récursifs automatiques avec l'attribut select. Cela m'a évité bien des problèmes.
Je n'ai pas encore écrit la DTD correspondante au modèle de données. Dans la page recherche, il y a un autre exemple concernant un lexique. Références bibliographiques[XML1] Spécification d'XML (1.0 2nd édition) : http://www.w3.org/TR/REC-xml[XML2] Une traduction française est disponible à l'adresse : http://babel.alis.com/web_ml/xml/REC-xml.fr.html [XML3] Introduction à la DTD : http://www.rpbourret.com/xml/xmldtd.htm [XML4] FAQ française XML : [broken?] http://www.gutenberg.eu.org/pub/GUTenberg/publications/HTML/FAQXML/faqxml-fr.html [XSL1] Spécification d'XSL : http://www.w3.org/TR/xslt [DIV1] Un site en français sur XML
: http://www.citeweb.net/apetitje/xml/
[broken!] |