Introduction aux bases du langage XSL et XML
XML
Les bases en pratique
Support de cours réalisé par Joêl FARVAULT (CNRS/DSI) et David ROUSSE (CNRS/DSI), relu par René PELFRESNE (CNRS/DSI)
Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité Pas d’Utilisation Commerciale - Pas de Modification 2.0 France.
Avril 2003 Direction des systèmes d'information
Sommaire
1. Historique
2. Structure et organisation du langage
3. DTD et schémas XML
4. Transformations de documents XML
5. Liaisons de documents en XML
6. Manipulations de documents XML
7. Références
Historique
¾ La croissance d’Internet ces dernières années est à associer à la naissance de standards tels que :
• HTML (HyperText Marking up Language)
• HTTP (HyperText Transfer Protocol)
¾ A l’origine, un document HTML était constitué à part égale entre les données et la présentation. Mais les évolutions successives de HTML ont laissé la présentation prendre plus en plus de place dans un document HTML
¾ Il était nécessaire de définir un langage centré sur la description des données
¾ Il est apparu aussi que l’échange d’information entre entreprises nécessite une définition et une description des données échangées
¾ Une première réponse à ces besoins a été l’élaboration de normes telles
EDIFACTsous l’égide de l’ONU et le SGML (Standardized Generalized Markup Language – norme ISO 8879)
? EDIFACT a été utilisé dans le domaine des Echange de Données Informatisées (EDI)
? SGML a été particulièrement utilisé dans la gestion documentaire
¾ Le point commun entre ces deux normes est leur complexité
¾ En 1996 le W3C (World Wide Web Consortium) ainsi que plusieurs industriels ont travaillé sur la simplification de la norme SGML
¾ On retrouve dans la forme simplifiée du SGML les principes fondamentaux de ce langage :
? Séparation de la présentation et des données
? Structuration des données manipulées
? Capacité de décrire les structures d’information à partir de schéma (DTD)
¾ Cette forme simplifiée du SGML a pris le nom de XML (eXtensible
Marking up Language) en 1998
¾ Le XML (eXtensible Marking up Language) est un langage à balise définissant un format universel de représentation des données. Un document XML contient à la fois les données et des indications sur la structure du document
<Personne Prenom="Richard" Nom="Durand">
<Adresse>
<Rue>12 rue Dupont</Rue>
<CodePostal>75013</CodePostal> Structure du document <Pays>France</Pays>
</Adresse>
<Téléphone>0142754077</Téléphone> </Personne>
¾ XML est un format public, multi-plateforme, accessible à tous et supporté par des nombreux éditeurs de logiciels : IBM, Microsoft, Netscape, Oracle,
Sun Microsystems…
¾ XML n’est pas HTML… Pourquoi ?
¾ HTML présente plusieurs limitations :
? HTML est orienté présentation et ne décrit pas la structure logique du document
? Il est difficile d’associer des représentations physiques à un même document HTML (par exemple papier et écran)
? Il n’est pas possible avec HTML, d’échanger des documents ou des données entre applications
? Le langage HTML est construit sur des balises (mots placés entre < et >) prédéfinies dont très peu se rapportent à la structure du document
¾ En revanche XML…
? XML se présente sous forme d’arbre hiérarchique donc il décrit la structure logique du document
? XML n’utilise pas de balises prédéfinies, mais il propose des règles de construction. On peut inventer toutes les balises que l’on veut. C’est pour cette raison que le langage est dit extensible
? Pour être indépendant des évolutions technologiques, XML différencie : la structure, le contenu et la présentation
¾ XML promet de standardiser la manière dont l’information est :
? Échangée
? Adaptée
? Présentée
? Personnalisée
¾ C’est pourquoi les applications de XML se situent principalement sur :
? La présentation des données
? La portabilité des informations
¾ La présentation des données :
? XML permet de présenter les données en offrant une structuration adaptée à l’usage voulu. Dans le cas des sites Web, XML permet d’adapter les informations présentées à la personnalisation des interfaces des sites
? On peut saisir (ou mettre à jour) des informations à la manière dont on alimenterait une base de données, sans se soucier de la présentation ou même générer automatiquement la présentation
(tableau, texte suivi…) sur de multiples médias
¾ La portabilité des informations :
? XML favorise les échanges informatisés ainsi que l’interopérabilité des applications. La seule contrainte étant de définir un vocabulaire commun (cf. référentiel partagé) détaillé dans des schémas (DTD et XSD). Par exemple le secteur de la chimie a défini un vocabulaire spécifique (CML) pour décrire les données du secteur chimique
¾ Les technologies et les domaines d’application utilisant XML sont :
? Développement des systèmes d’information
? Administration et gestion de contenu
? Multimédia (MPEG 7 est basée sur XML)
? Gestion électronique de documents (GED) et portail d’informations d’entreprise
? Intégration d’applications d’entreprise (EAI) avec la transformation des données vers XML (adaptateurs XML)
? Commerce électronique et EDI
¾ Les raisons pour lesquelles XML est utilisé de manière croissante :
? Le XML remplace ASCII CSV pour l’échange de données
? XML est indépendant du système cible ou d’un éditeur
? XML devient le langage d’échange de données (utilisé par les EAI et les ERP)
? Grâce à ses mécanismes de validation (DTD ou XSD) le XML favorise les échanges inter-applicatifs
? XML supporte le dialogue client/serveur sur http et il devient le protocole unifié des architectures Web
? XML est supporté par les SGBD majeurs et il est utilisé par
Oracle pour décrire les méta-données
¾ Les outils liés à XML :
? Parseur XML (Apache Xerces, Microsoft MSXML)
? Processeur XSLT (Apache Xalan, Microsoft MSXML)
? Processeur XSL-FO (Apache FOP par exemple)
? Logiciel qui lit/écrit du XML (Microsoft Office 11, Open Office)
? Editeur XML (XML Spy, Cooktop ou XMLEdit)
Structure et organisation du langage
Structure et organisation du langage
¾ Tout document présente une structure logique. Prenons le cas d’une lettre :
En-tête
Monsieur Dupont
L’en-tête est
Compagnie des Bouts suivie de
à l’attention de M. DURAND
l’apostrophe
(Madame,
Apostrophe Monsieur,Monsieur..) puis
d’un corps et enfin une
Corpssignature. C’est
Suite à votre courrier du 30 Mars, nous accusons réception de votre courrier…la structure
Nous vous prions d’agréer, Monsieur, l’expression de nos salutations distinguéeslogique de la lettre
Signature Monsieur Dupont
Structure et organisation du langage
¾ En revanche la structure physique du document est relative à sa présentation sur un support :
? Pour une présentation sur papier : la structure physique de la lettre précédente décrit que l'en-tête est placé en haut à gauche, que l'apostrophe est placée à trois centimètres audessous de l'adresse, que la première ligne des paragraphes est décalée de 1 cm à gauche…
? Pour une présentation sur écran : la structure physique du document pourra décrire que l'en-tête est en rouge et que le nom du destinataire clignote
Structure et organisation du langage
¾ XML décrit la structure logique des informations, mais sous forme d’arbre. Pour une lettre, la structure logique décrite par XML sera :
Lettre
à l’attention de M.
Monsieur DUPONT
Compagnie des Bouts DURAND
¾ On note la présence d’un élément racine « Lettre » auquel sont rattachés : « Corps », « Signature »…
¾ Un document XML commence toujours par un élément « racine » ou élément document qui se compose d’un nombre quelconque de souséléments imbriqués. Il contient toutes les données du document XML
L’élément racine est <contact>
<nom>Dupont</nom>
<adresse>134, rue Lambertin</adresse>
<ville>Paris</ville>
<codepostal>75014</codepostal>
</contact>
Structure et organisation du langage
¾ Le document XML se compose d’éléments ce sont des balises qui contiennent des données analysables. Les éléments doivent s’imbriquer les uns dans les autres, aucun chevauchement n’est autorisé. La donnée d’un élément ne peut contenir les caractères « & » ou « > »
<adresse>134, rue Lambertin</adresse>
<adresse>
<numéro>134 </numéro>
Donnée de type <rue> rue Lambertin</rue>
L’élément « adresse » représenté caractère contenue par <ville>Paris</ville>
<codepostal>75014</codepostal>
par la balise <adresse> l’élément « adresse » </adresse>
<adresse><personne> Dupont </adresse></personne> L’élément « adresse » est composé
Exemple de chevauchement qui de plusieurs balises : numéro, rue, engendre une erreur de syntaxe ville et code postal
¾ Tout élément (y compris racine) d’un document XML est caractérisé par des balises d’ouverture et de fermeture
<contact>
<nom> Dupont </nom>
<adresse>134, rue Lambertin</adresse>
<ville>Paris</ville>
<codepostal>75014</codepostal>
</contact>
Balise d’ouverture Balise de fermeture
Il est à noter que XML est sensible à la casse, donc le nom de l’élément dans la balise ouvrante doit être écrit de la même façon dans la balise fermante
¾ Un élément vide combine en une seule écriture une balise d’ouverture et de fermeture, car il ne contient pas de donnée
Cet élément ne contient aucune donnée mais dans sa notation il combine <adresse> et </adresse>
¾ Un élément peut posséder un (ou des) attribut(s) qui est un couple nom-valeur inclus à l’intérieur de la balise et délimité par des doubles (ou simples) quottes. La donnée d’un attribut ne doit pas contenir les
caractères « ^ », « % » ou « & »
<Personne INSEE="172109254304523">
<Nom> DUPONT </Nom>
<Prenom> Jean </Prenom>
</Personne>
L’attribut INSEE est une caractéristique (numéro unique) de l’élément « Personne ». Un espace doit séparer le nom de l’élément et celui de l’attribut
¾ Il est important de veiller à la présence des doubles ou simples quottes
<Personne INSEE=172109254304523> Cette notation est incorrecte
<Nom> DUPONT </Nom>
<Prenom> Jean </Prenom>
</Personne>
¾ Un élément peut posséder plusieurs attributs qui doivent être séparés par des espaces
<Personne INSEE="172109254304523" SEXE="Masculin" >
<Nom> DUPONT </Nom>
<Prenom> Jean </Prenom>
</Personne>
¾ Ces deux notations sont identiques :
<Personne INSEE="172109254304523" > <Personne>
<Nom> DUPONT </Nom> = <INSEE> 172109254304523 </INSEE>
<Prenom> Jean </Prenom> </Personne> | <Nom> DUPONT </Nom> <Prenom> Jean </Prenom> |
</Personne>
¾ Mais il est préférable de limiter les attributs dans un document XML car ils :
? Ne décrivent pas une structure donc ils réduisent la clarté et la lisibilité du document XML
? Sont plus difficilement manipulables avec XSL ou XSLT
? Doivent être utilisés en tant que paramètres pour des éléments
¾ Les données portées par les éléments ou les attributs ne doivent pas contenir les caractères « ^ », « % » , « & » ou « > »
¾ Le nom des éléments et des attributs doit aussi respecter des contraintes :
? Il doit commencer par une lettre ou les caractères « _ » ou « - »
? Il ne doit pas contenir d’« espace »
? Il ne doit pas commencer par le nom « xml »
Atelier
Création d’un document XML (1)
Structure et organisation du langage
¾ Le document XML peut contenir un prologue qui se compose de deux éléments :
? La déclaration XML
? La déclaration du type de document
¾ Le prologue ou l’en-tête du document XML n’est pas obligatoire, mais il contient des informations sur la version de XML, le jeu de caractère utilisé ainsi que les références du document
¾ La déclaration XML apparaît au début du document et précise les paramètres auxquels se conforment le document. On définit en premier la version de XML (par défaut « 1.0 »)
On note la présence de délimiteurs spécifiques <? Et ?> qui sont à différencier de ceux habituels <…>
¾ Ensuite on précise l’encodage des caractères, c’est à dire la table de caractères utilisée par le document. « ISO-8859-1 » est couramment employée car les caractères accentués (« é » ou « è »…) seront acceptés dans le document XML
Utilisation de l’attribut encoding
<?xml version ="1.0" encoding ="ISO-8859-1" ?> dans le prologue
¾ La déclaration XML permet aussi de définir le document comme autonome c’est à dire qu’il est complet, aucun fichier externe (DTD) n’est référencé
Pour être autonome le paramètre
standalone doit avoir la valeur « yes » <?xml version ="1.0" encoding ="ISO-5589-1" standalone ="yes" ?>
¾ En revanche s’il n’est pas autonome, il fait référence à une DTD externe contenant les « règles de grammaire » et les déclarations des balises utilisées dans le document XML. La DTD est renseignée par la déclaration du type de document (balise DOCTYPE)
Le mot-clé SYSTEM est un pointeur qui définit l’emplacement de la DTD
¾ Un document XML contenant un prologue se présente selon cet exemple :
Structure et organisation du langage – CDATA
¾ Pour remplacer certains caractères interdits (« & », « < » ..) on utilise les entités prédéfinies
¾ Mais si l’on souhaite insérer des données contenant des caractères interdits et pour lesquels il n’y aura pas d’analyse syntaxique, il faut utiliser la balise CDATA (Characters DATA). Tout le contenu compris dans la section <![CDATA[ et ]]> sera ignoré lors de l’analyse syntaxique du document XML
<script> <![CDATA[ function swap(a,b) {
decl c;Le contenu de CDATA ne sera pas pris en c := a; compte lors de l’analyse syntaxique b := a; b := c; }
]]>
</script>
Structure et organisation du langage – Les commentaires
¾ On peut insérer des commentaires dans le document XML par les balises <!-- et -->
<!-- ceci est un commentaire -->
¾ Il est à noter que :
? Un commentaire ne doit pas précéder le prologue
<!-- ceci est un commentaire -->
<?xml version ="1.0" ?>
? Un commentaire ne peut être placé à l’intérieur d’une balise
<VIDEO <!-- ceci est un commentaire --> >
? Il ne doit pas avoir de « -- » dans le texte du commentaire
? Un commentaire ne doit pas apparaître dans une balise CDATA
¾ Nous avons examiné ce qui constitue dans ses grandes lignes l’ensemble des règles de construction d’un document XML
¾ Le respect de ces règles de construction donnera lieu à un document XML bien formé qui ne peut être composé que de 6 types de balisages :
? Les balises (ouvrantes, fermantes ou balises d’éléments vides)
? Les références d’entités
? Les commentaires
? Les sections CDATA
? Le prologue et les déclarations de type de document
? Les instructions de traitement
¾ Un document bien formé doit aussi respecter ces critères de présentation :
? Un document XML ne peut être vide, il doit au moins contenir 1 élément
? Il doit posséder un seul point de départ d’analyse, c’est-à-dire 1 seul élément racine
? Il doit y avoir une imbrication correcte de ses éléments, c’est-àdire un élément ne peut être fermé si tous les sous éléments qui le composent ne sont pas eux-mêmes fermés
? Il doit contenir des références à des entités qui sont ellesmêmes bien formés
¾ Un document XML est créé à partir d’un éditeur XML qui peut être un simple éditeur de texte (Notepad ou vi) ou un éditeur spécifique (XML Spy,
XML Notepad..)
¾ La vérification des règles de construction et l’interprétation du document est effectuée par un analyseur XML (appelé aussi parser, parseur ou processeur XML). Il va lire le document, vérifier qu’il est bien formé et le convertir en une structure d’éléments arborescents. Lors de cette phase d’analyse les entités seront remplacées par leur contenu
Processeur XML Structure arborescente
¾ A la suite de ces tests de conformité, la structure arborescente ou certains nœuds (entités binaires) seront transmis à des applications cibles. Il peut s’agir d’un navigateur Web ou de tout autre programme capable de comprendre les données
Atelier
Création d’un document XML
(2)
Structure et organisation du langage Le document valide
¾ La notion de document bien formé est à distinguer de celle de document valide
¾ Un document est bien formé s’il est correct syntaxiquement et s’il répond aux exigences de construction d’un document XML
¾ Un document valide est un document bien formé dont les données et la structure sont conformes aux spécifications du document type (DTD)
¾ Qu’est-ce qu’une DTD ?
Les DTD et schémas XML
¾ Une DTD (Document Type Definition) est un modèle permettant de décrire la grammaire d’un document XML
¾ Une grammaire définie la syntaxe d’un langage, c’est-à-dire l’organisation de ces balises. Un document XML sera donc compréhensible si sa grammaire est définie
¾ La DTD définira aussi des contraintes portant sur la sémantique, la structure et les valeurs applicables pour un élément du document
¾ L’opération de vérification de conformité entre le document XML et la DTD est effectuée par le processeur (ou parseur) XML
¾ Pourquoi utiliser une DTD :
? C’est le moyen de déclarer de nouvelles balises et spécifier des contraintes sur ces balises
? C’est la possibilité pour une application de savoir quel document XML produire et quoi lire
? C’est la possibilité d’assurer l’interopérabilité entre applications en définissant des règles d’échanges communes
? C’est la possibilité de valider les flux XML entrants d’un programme
¾ Une DTD peut se présenter sous deux formes : interne ou externe
¾ DTD interne : la DTD est définie dans le document XML
¾ DTD externe : la DTD est référencée (Nom et URL) dans le prologue du document XML via la balise DOCTYPE
¾ Des références internes ou externes à des DTD peuvent figurer au sein d’un même document XML
¾ Les définitions des éléments et des attributs figurant dans les DTD internes et externes se complètent tant qu’il n’y a pas de doublons
¾ Toutefois, s’il y a des doublons dans plusieurs DTD, c’est la DTD interne qui sera traitée prioritairement
¾ La DTD contient la description des éléments et des attributs qui seront acceptés dans le document XML
¾ Une déclaration d’élément prend la forme :
<!ELEMENT [nom de l’élément] ([contenu de l’élément ou type])>
Exemple <!ELEMENT personne (nom, email)>
<personne>
<nom> … </nom>
<email> … </email>
</personne>
Rappel : Le nom de l’élément ne doit pas contenir de caractère « espace », on peut utiliser les caractères « - » ou « _ »
¾ La déclaration de l’élément implique de définir le type de données qu’il contient, à choisir parmi 5 types :
? Liste de sous éléments appelée « modèle de contenu »
(cf exemple précédent)
? Type « EMPTY »
? Type « ANY »
? #PCDATA
? Contenu mixte
¾ Le type modèle de contenu indique les sous éléments composants l’élément déclaré
¾ Pour chacun de ces sous éléments, une déclaration d’élément distincte doit apparaître à la suite de la DTD
<!ELEMENT MESSAGE (DESTINATAIRE, EXPEDITEUR, OBJET, CORPS)>
<!ELEMENT DESTINATAIRE (#PCDATA)> Élément racine composé de
DESTINATAIRE,
<!ELEMENT EXPEDITEUR (#PCDATA)> EXPEDITEUR, OBJET et
CORPS
…
Déclaration distincte de l’élément
¾ Des symboles permettent de spécifier des contraintes (ordre d’apparition, nombre d’occurrences…) sur les sous éléments :
Symbole | Utilisation | Exemple | Signification |
? | Indique qu’un élément peut apparaître 0 ou 1 fois | <!ELEMENT PERSONNE (NOM, PRENOM, VILLE?)> Ou <!ELEMENT PERSONNE (PRENOM, VILLE)?> | - L’élément Personne peut contenir VILLE et si c’est le cas VILLE ne peut qu’apparaître qu’une fois - Même signification pour PRENOM et VILLE |
* | Indique qu’un élément peut apparaître 0 ou plusieurs fois | <!ELEMENT PERSONNE (NOM, PRENOM, VILLE*)> Ou <!ELEMENT PERSONNE (PRENOM, VILLE)*> | - L’élément Personne peut contenir VILLE et si c’est la cas VILLE peut apparaître plusieurs fois - Même signification pour PRENOM et VILLE |
+ | Indique qu’un élément peut apparaître une ou plusieurs fois | <!ELEMENT PERSONNE (NOM, PRENOM, VILLE+)> Ou <!ELEMENT PERSONNE (PRENOM, VILLE)+> | - L’élément Personne doit contenir au moins 1 fois VILLE - Même signification pour PRENOM et VILLE |
Symbole | Utilisation | Exemple | Signification |
[Aucun symbole] | Indique qu’un élément doit apparaître une seule fois | <!ELEMENT PERSONNE (NOM, PRENOM, VILLE)> | - L’élément Personne doit contenir NOM, PRENOM et VILLE une seule fois |
¾ Dans la déclaration du modèle de contenu on peut utiliser plusieurs types de contraintes :
¾ Le type « EMPTY » permet de définir un élément vide (ne contenant pas de donnée mais il peut porter des attributs)
<!ELEMENT adresse EMPTY>
<adresse/>
¾ Le type « ANY » indique que l’élément peut contenir n’importe quel contenu autorisé par la DTD et dans n’importe quel ordre
¾ Le type « #PCDATA » (Parsed Characters Data) indique que les caractères contenus dans l’élément seront analysés par le processeur XML. A différencier de #CDATA (Characters Data) qui permet d’ignorer le contenu de l’élément
<!ELEMENT MESSAGE (DESTINATAIRE, EXPEDITEUR, OBJET, CORPS)>
<!ELEMENT DESTINATAIRE (#PCDATA)>
…
<DESTINATAIRE>Dupont Jean</DESTINATAIRE> l’élément DESTINATAIRE sera
analysé par le processeur XML. Donc il ne peut contenir des caractères spéciaux tels que
« & » ou « > »
¾ Le type contenu mixte « | » permet de choisir un type de contenu parmi une
liste prédéfinie
<!ELEMENT personne (#PCDATA | NOM )>
<personne>dupont</personne>
<personne>
<NOM>Dupont</NOM>
</personne>
Il est à noter que dans un contenu mixte #PCDATA doit toujours être déclaré en premier
¾ Le document XML peut être composée d’entités qui correspondent à des « unités de stockage ». Chaque entité est identifiée par un nom et son contenu peut représenter un caractère aussi bien qu’un fichier externe
¾ La balise entité peut être utilisée pour des abréviations ou pour stocker des données autres que textuelles (images, vidéo…)
¾ L’utilisation de cette balise s’effectue en 2 étapes :
? Déclaration d’entités dans la DTD : indique avec quoi il faut remplir l’entité
? Référence d’entités dans le document XML : permet de retrouver le contenu de l’entité et l’utiliser à l’endroit souhaité
¾ Pour définir une abréviation par exemple « XML», on déclare une entité (balise ENTITY) dans la DTD nommée XML auquel on associe la chaîne de caractère « eXtensible Marking up Language »
L’entité se nomme XML et contient la chaîne « eXtentsible Marking up
Language »
Attention : ce délimiteur commence par <! Mais se termine par >
¾ Pour faire référence à l’entité XML dans le document XML, on utilise son nom précédé du symbole « & » et terminé par le point-virgule « ; »
¾ La référence à l’entité sera ensuite interprétée et remplacée par son contenu
¾ Il n’y a pas de limitation sur le nombre d’entités que l’on peut créer, toutefois il existe 5 entités prédéfinies :
Entités | Caractères remplacés |
< | < |
> | > |
& | & |
' | ‘ |
" | « |
¾ On peut utiliser ces entités prédéfinies pour représenter des caractères interdits dans les données tels que « & », « > » ou « < »
<instruction> if note < 10 </instruction>
La notation est incorrecte car le caractère « < » n’est pas admis dans les données d’un élément
<instruction> if note < 10 </instruction>
En utilisant l’entité prédéfinie remplaçant le caractère « < » la notation est correcte
¾ Les entités ne concernent pas seulement des abréviations mais aussi des déclarations de DTD. On parle d’entités paramètres ou d’entités DTD
¾ Les entités paramètres permettent de réutiliser des DTD existantes pour les enrichir ou ajouter de nouvelles spécifications
¾ Une entité paramètre se déclare dans la DTD :
Utilisation du caractère
« % » et non « & »
¾ La balise entité utilisée pour les abréviations ou les DTD est appelée entité analysée
¾ Mais il y a aussi l’entité non analysée souvent appelée entité binaire car elle contient des données binaires comme des images, des vidéos…
¾ Par exemple pour référencer un fichier image, on déclare une entité binaire à laquelle on associe l’emplacement du fichier et un format
<!ENTITY monimage SYSTEM “" NDATA GIF >
Le mot-clé SYSTEM est un pointeur
Le mot-clé NDATA signale que les données externes ne sont pas des
qui définit l’emplacement du données XML. En l’occurrence dans l’exemple, les données sont du type GIF
contenu de l’entité
¾ Pour faire référence à l’entité binaire (exemple : monimage) il faut la déclarer en tant que valeur d’attribut au sein d’un élément. Il faut indiquer
le nom de l’entité (sans le « & » et « ; »)
<!NOTATION GIF SYSTEM “" >
<!ENTITY monimage SYSTEM “" NDATA GIF >
<collection><collection>
<album photo= “monimage“/> <album photo= “&monimage;“/>
</collection></collection>
Cette notation est incorrecte La valeur de l’attribut photo fait appel à l’entité binaire « monimage ». Noter que pour l’entité binaire, on utilise simplement le nom de l’entité et non la notation « &[nom entité];
Déclaration de l’entité binaire
« monimage » ainsi que du format GIF
¾ La référence à l’entité binaire sera ensuite remplacée par son contenu et traitée par la commande de la balise NOTATION
¾ L’entité binaire peut être applicable sur tout type de fichier y compris des animations flash ou des vidéos
<!NOTATION flash SYSTEM “" >
<!ENTITY animation SYSTEM “…" NDATA flash >
L’entité binaire « animation » provoquera la lecture de l’animation flash « »
Il est à noter que le document XML ne doit contenir que l’appel ou le référencement de l’entité
¾ Une déclaration d’attributs prend la forme :
<!ATTLIST personne prenom CDATA/> | Tout comme l’élément, le nom de l’attribut ne doit pas contenir de caractère « espace », on peut |
<!ATTLIST [nom de l’élément] [nom de l’attribut] [type] [options] [défaut]> Exemple <!ELEMENT personne EMPTY>
utiliser les caractères « - » ou « _ »
<personne prenom = “jean“/>
¾ Le nom de l’élément est l’élément auquel s’applique la définition de l’attribut
¾ Les options permettent de définir si l’attribut est obligatoire ou explicite
¾ Défaut correspond à la valeur par défaut attribuée à l’attribut
¾ Le type permet de définir des critères sur la valeur de l’attribut ou le type de données requis (caractères ou autres). Le type de l’attribut est à choisir parmi une liste prédéfinie :
? CDATA
? ENTITY ou ENTITIES
? NMTOKEN ou NMTOKENS
? NOTATION
? Énumération
? ID, IDREF ou IDREFS
Type | Utilisation | Exemple (DTD) | Exemple (XML) |
NMTOKEN | La valeur de l'attribut est une combinaison quelconque de caractères qui peuvent être des lettres, des chiffres, des points, des barres obliques, des soulignés ou des deux-points. Il permet aussi d'affecter un nom symbolique à l'attribut tel qu'un format de date, un format de fichier ou encore une abréviation. | <!ELEMENT gestionnaire (répertoire)> <!ELEMENT répertoire (#PCDATA)> <!ATTLIST répertoire fichier NMTOKEN #REQUIRED> | <gestionnaire> <répertoire fichier= "" > Ce fichier représente la page d'accueil de ce répertoire </répertoire> </gestionnaire> |
NMTOKENS | Identique à NMTOKEN mais autorise plusieurs valeurs séparées par des espaces | <!ELEMENT France (région)> <!ELEMENT région (#PCDATA)> <!ATTLIST région département NMTOKENS #REQUIRED> | <France> <région département= "14 50 61" > Basse-Normandie </région> </France> |
¾ Un attribut de type ID permet d’attribuer un identifiant à un élément. Cet élément peut être ensuite référencé dans une autre partie du même document en utilisant un attribut de type IDREF. Les identifiants permettent de lier différentes parties d’un document XML et réduire la saisie de données dans un document
¾ L’exemple ci-dessous permet de définir des personnes et leur lien de parenté en utilisant les types ID et IDREF
¾ Le document XML respectant la DTD, contient la définition de deux personnes (Adam et Caïn) à qui on attribue un identifiant (respectivement « A » et « B »), puis on précise que A est parent de B
l’identifiant :
ID « A » => « Adam »
ID « B » => « Caïn »
¾ Il est à noter des contraintes sur l’utilisation des identifiants (ID et IDREF)
Contrainte | Exemple (DTD) | Exemple (XML) |
Les ID sont uniques pour l’ensemble du document XML | <!ELEMENT personne (fils*)> <!ELEMENT fils EMPTY> <!ATTLIST personne identifiant ID #REQUIRED> <!ATTLIST fils identifiant2 ID #REQUIRED> | Cette notation n’est pas valide : <personne identifiant= "n01"> <fils identifiant2= "n01"/> <fils identifiant2="n02"/> </personne> Cette notation est valide : <personne identifiant= "n01"> <fils identifiant2= "n02"/> <fils identifiant2= "n03"/> </personne> |
La valeur de l’ID doit toujours commencer par une lettre | <!ELEMENT fils EMPTY> <!ATTLIST fils identifiant2 ID #REQUIRED> | <fils identifiant2= "01"/> invalide <fils identifiant2= "n01"/> est valide |
Contrainte | Exemple (DTD) | Exemple (XML) |
On ne peut utiliser l’option #FIXED avec un attribut ID | <!ELEMENT personne (fils*)> <!ELEMENT fils EMPTY> <!ATTLIST personne identifiant ID #REQUIRED> <!ATTLIST fils identifiant2 ID #FIXED "n01"> | <fils identifiant2= "n02"/> invalide Cette notation est invalide : <personne identifiant= "n01"> <fils identifiant2= "n01"/> </personne> On comprend par ces exemples qu’on ne peut utiliser l’option #FIXED avec un attribut ID |
Un élément ne peut avoir plus d’un ID | <!ELEMENT fils EMPTY> <!ATTLIST fils identifiant2 ID #REQUIRED> | <fils identifiant2="n01" "n02"/> invalide <fils identifiant2="n01"/> est valide |
¾ A la déclaration de l’attribut on peut ajouter des « options » pour indiquer le caractère obligatoire ou optionnel de l’attribut. On peut choisir parmi une liste d’options :
? #REQUIRED
? #IMPLIED
? #FIXED valeur
Les DTD et schémas XML – Les DTD
Type | Utilisation | Exemple (DTD) | Exemple (XML) |
#REQUIRED | L'attribut doit obligatoirement avoir une valeur explicite | <!ELEMENT auteur EMPTY> <!ATTLIST auteur Nom CDATA #REQUIRED> | <auteur/> invalide <auteur Nom= “Dupont“/> est valide |
#IMPLIED | L'attribut est optionnel | <!ELEMENT auteur EMPTY> <!ATTLIST auteur Nom CDATA #IMPLIED> | <auteur/> est valide <auteur Nom= “Dupont“/> est valide |
#FIXED valeur | L'attribut doit avoir la valeur indiquée | <!ELEMENT auteur EMPTY> <!ATTLIST auteur Editeur CDATA #FIXED “Eyrolles“> | <auteur Editeur= “MicroApp“/> invalide <auteur Editeur= “Eyrolles“/> est valide |
Les DTD et schémas XML – Les DTD
¾ Plusieurs attributs concernant un élément peuvent être déclarés au sein de la même balise ATTLIST :
<!ATTLIST
[nom de l’élément] [nom de l’attribut1] [type] [options] [défaut] [nom de l’élément] [nom de l’attribut2] [type] [options] [défaut]
…> Le rappel du nom de l’élément n’est pas obligatoire
¾ Par exemple :
¾ Les « espaces de nommage » (ou namespaces) est une recommandation du
W3C dont l’objectif est :
? distinguer les éléments et les attributs provenant de différents vocabulaires (exemple jaguar : faune ou automobile) et lever les ambiguïtés éventuelles sur l’intitulé de la balise
? Regrouper les éléments et les attributs corrélés de manière à ce
que la réutilisation soit plus facile
¾ Un document contient les informations générales concernant l’entreprise (nom, adresse, raison sociale…) :
¾ A l’aide des espaces de nommage on va pouvoir différencier les balises <nom> en utilisant la notation <entreprise:nom> et <personne:nom>
¾ L’espace de nommage « personne » pourra être déclaré de la façon suivante :
L’URI de l’espace de nommage peut être fictive car elle n’est pas vérifiée, toutefois elle pointe généralement sur la grammaire de l’espace de nommage (DTD ou schéma XML)
¾ Ensuite on pourra préfixer l’élément « nom » soit par « personne » ou « entreprise », ce qui signifie la balise « nom » appartient à l’espace de nommage
¾ Les espaces de nommage peuvent être déclarés dans le document XML à l’aide de l’attribut xmlns
<Espace_de_nom:Élément xmlns:Espace_de_nom = “[URI]“>
Universal Resource Identifier : correspond à l’emplacement de l’espace de noms, généralement un fichier DTD ou schéma XML. Toutefois, l’emplacement de l’espace de nom peut être fictif car il n’est pas vérifié
Cette notation dans la balise de déclaration est optionnelle, on aurait pu aussi indiquer :
<Élément xmlns:espace_de_nom=“[URI]“/>
¾ La déclaration de l’espace de nom peut figurer dans tout élément du document
XML, ou pour plus de clarté et de commodité dans l’élément racine
¾ Les éléments appartenant à un espace de nom se distinguent des autres éléments par l’ajout d’un préfixe symbolisant cette singularité. Les préfixes se placent au sein de la balise XML avant le nom de l’élément et séparés par un
« : »
<Espace_de_nom:Élément > [donnée] </Espace_de_nom:Élément>
¾ Le nom du préfixe peut être constitué de lettres, caractères accentués, tirets
(« _ ») ou de chiffres
¾ Un espace de nommage peut aussi figurer dans la DTD et en particulier dans la définition de l’attribut :
<!ELEMENT Espace_de_nom:[nom de l’élément] ([contenu de l’élément ou type])>
<!ATTLIST Espace_de_nom:[nom de l’élément] xmlns:Espace_de_nom CDATA [options] “[URI]“>
Emplacement de l’espace de
¾ Soit par exemple : nommage doit apparaître en valeur
par défaut
<!ELEMENT entreprise:nom #PCDATA>
<!ATTLIST entreprise:nom xmlns:entreprise CDATA #IMPLIED ““>
<entreprise:nom xmlns:entreprise= ““> ….
</entreprise:nom>
<entreprise:nom> Dupont et Cie </entreprise:nom>
Atelier Création d’une DTD
¾ Les DTD répondent en grande partie au besoin de définir des contraintes et des règles de validation sur les documents XML. Toutefois, ils présentent des limitations qui les rendent obsolètes quand il s’agit de détailler plus finement les règles de validation :
? La syntaxe des DTD n’est pas en XML : Le fait d’écrire un document XML en utilisant une syntaxe différente est quelque peu contradictoire
? Le typage de données pauvre : la DTD présente peu de possibilité de typer des données (CDATA, NMTOKEN et #PCDATA)
? La gestion des espaces de nom est limitée
? On ne peut définir précisément le nombre de sous éléments (0-5 ou 1-15)
¾ A partir de février 2000 le W3C a proposé une nouvelle norme, le schéma XML ou XSD (eXtensible Schema Definition) dont l’objectif est de remplacer à terme la DTD. Les points forts des schémas XML sont :
? Extensibles : on peut créer de nouveaux types de données ou enrichir les types existants
? Écrits en XML
? Capables de définir des éléments de même nom mais de contenu différent
? Plus riches : on peut détailler de manière précise le nombre d’occurrence de sous éléments (1-5 ou 0-21)
? Capables de gérer de nouvelles notions telles que l’héritage des éléments ou des attributs
¾ Prenons le document XML ci-dessous :
¾
précis
¾ Pour se référer à un schéma XML, il faut le préciser dans l’entête du document
dans le document
¾ : indique que le document est une instance d’un schéma XML (notation obligatoire)
¾ : indique le nom du schéma XML (.xsd) qui valide le document (schemaLocation contient la paire de valeurs : espace de noms et fichier de définitions du document)
¾ Pour déclarer un schéma XML on utilise l’élément <xsd:schema> associé à des paramètres :
¾ : les types utilisés pour construire le schéma XML viennent de cet espace de nom (notation obligatoire)
¾ : les éléments définis dans le schéma XML sont contenus dans cet espace de nom cible
¾ : correspond à l’espace de nom par défaut
¾ : tous les documents qui se réfèrent à ce schéma XML doivent répondre à l’espace de nom défini
¾ Pour définir un élément on utilise la balise <xsd:element> :
<xsd:element name= “[nom élément]“ type= “[xsd:type]“ minoccurs= “[0 à n]“ maxoccurs= “[0 à n]“>
…
</xsd:element>
¾ Les attributs optionnels minoccurs et maxoccurs permettent de préciser le nombre d’occurrences min et max de sous éléments. Pour définir un nombre indéterminé d’occurrences il faut utiliser le mot clé « unbounded »
¾ On peut établir une correspondance entre les notations DTD et XSD :
Notation XSD | Notation DTD |
<xsd:element name="élément"> <xsd:complexType> <xsd:sequence> <xsd:element name="s1"> minoccurs ="0" maxoccurs ="unbounded" /> </xsd:sequence> </xsd:complexType> </ xsd:element> | <!ELEMENT élément (s1*)> |
… <xsd:element name="s1"> minoccurs ="0" maxoccurs ="1" /> … | <!ELEMENT élément (s1?)> |
¾ On peut établir une correspondance entre les notations DTD et XSD :
Notation XSD | Notation DTD |
… <xsd:sequence> <xsd:any/> </xsd:sequence> … | <!ELEMENT élément ANY> |
… <xsd:choice> <xsd:element name="s1" /> <xsd:element name="s2" /> </xsd:choice> … | <!ELEMENT élément (s1|s2)> |
¾ Pour définir un attribut on utilise la balise <xsd:attribute> :
<xsd:attribute name= “[nom attribut]“ type= “[xsd:type]“ use= “[options]“ value= “[valeur par défaut]“>
…
</xsd:attribute>
¾ L’attribut use permet de définir des contraintes sur la valeur de l’attribut, identiques à la DTD soit : required (obligatoire), implied (optionnel) ou fixed (valeur fixe)
¾ Et tout comme la DTD il est possible d’indiquer une valeur par défaut (value)
¾ Ci-dessous un exemple de déclaration d’un attribut :
¾ La norme XSD définit près de 40 types de données : string, integer, decimal, float, date, year, boolean, CDATA…
¾ Toutefois, il est possible de créer un nouveau type de données en utilisant la balise <xsd:complexType>. Il est à noter que la définition d’élément et de sous éléments implique la création d’un nouveau type de données
¾ Par exemple pour créer un type « typeEntrée » d’annuaire :
¾ Puis on associe le nouveau type de données à l’élément entrée d’annuaire
¾ On peut aussi étendre un type de donnée existant en ajoutant un élément, c’est un type dérivé. Par exemple, on va étendre le type « typeEntrée » et créer le nouveau type « entréeAvecadresse ». On utilise les balises <xsd:extension> et <xsd:complexContent>
¾ Le tableau ci-dessous présente l’ensemble des types de données définis par XSD :
Atelier
Transformation d’une DTD en schéma XML
Questions ?
3 | |
Introduction Avril 2003 Direction des systèmes d'information |
5 Introduction (2/2) | |
? Le document XML contient les données (notion de document bien formé) ? Les DTD ou les schémas XML permettent de décrire des contraintes sur ce que peut contenir un document XML (notion de document valide) ? Les langages de transformations ont pour objet de tr |