W3C

Extensible Markup Language (XML) 1.0 (Fifth Edition)

Traduction française

Publication du 21 avril 2014

Cette version :
http://www.w3.org/TR/2008/REC-xml-20081126/
Dernière version :
http://www.w3.org/TR/xml/
Version précédentes :
http://www.w3.org/TR/2008/PER-xml-20080205/ http://www.w3.org/TR/2006/REC-xml-20060816/
Errata :
http://www.w3.org/XML/xml-V10-5e-errata
Traducteur :
Grégory Roche <gregory@polymorphisme.fr>

La version française peut contenir des erreurs. La version anglaise de ce document est l'unique version normative.

Version originale anglaise : http://www.w3.org/TR/2008/REC-xml-20081126/.

Langage de balisage extensible (XML) 1.0 (Cinquième Édition)

Recommandation du W3C du 26 octobre 2008

Cette version :
http://www.w3.org/TR/2008/REC-xml-20081126/
Dernière version :
http://www.w3.org/TR/xml/
Version précédentes :
http://www.w3.org/TR/2008/PER-xml-20080205/ http://www.w3.org/TR/2006/REC-xml-20060816/
Rédacteurs :
Tim Bray, Textuality and Netscape <tbray@textuality.com>
Jean Paoli, Microsoft <jeanpa@microsoft.com>
C. M. Sperberg-McQueen, W3C <cmsmcq@w3.org>
Eve Maler, Sun Microsystems, Inc. <eve.maler@east.sun.com>
François Yergeau

Veuillez vous référer à l’errata de ce document, qui peut inclure des corrections normatives.

Voir aussi les traductions.

Ce document est également disponible dans ces formats non normatifs : XML.


Résumé

Le langage de balisage extensible (Extensible Markup Language, XML) est un sous-ensemble de SGML qui est complètement décrit dans ce document. Son but est de permettre au SGML générique d’être transmis, reçu et traité sur le Web de la même manière que l’est le HTML aujourd’hui. Le XML a été conçu pour être facile à mettre en œuvre et interopérable avec le SGML et le HTML.

Statut de ce document

Cette section décrit le statut de ce document au moment de sa publication. D’autres documents peuvent remplacer ce document. Une liste des publications actuelles du W3C et la dernière révision de ce rapport technique peuvent être trouvées dans l’index des Rapports techniques du W3C à l’adresse http://www.w3.org/TR/.

Ce document spécifie une syntaxe créée en extrayant un sous-ensemble d’un existant, un standard international de traitement de texte largement utilisé (Standard Generalized Markup Language, ISO 8879:1986(F) tel qu’amendé et corrigé), dans le but de l’utiliser sur le Web. Ce document est une production du Groupe de travail XML Core qui fait partie de l’XML Activity du W3C. La version anglaise de cette spécification est la seule version normative. Toutefois, pour les traductions de ce document, voir à l’adresse http://www.w3.org/2003/03/Translations/byTechnology?technology=xml.

Ce document est une W3C Recommendation. Cette cinquième édition n’est pas une nouvelle version du XML. Par souci de commodité pour les lecteurs, il intègre les changements dictés par les errata accumulés (disponibles à l’URL http://www.w3.org/XML/xml-V10-4e-errata) dans la Fourth Edition of XML 1.0, dated 16 August 2006. En particulier, l’erratum [E09] assouplit les restrictions sur les noms d’élément et d’attribut; fournissant ainsi à l’utilisateur final du XML 1.0 un avantage important, aujourd’hui réalisable avec le XML 1.1 uniquement. Par conséquent, certains documents qui n’étaient pas bien formés d’après les précédentes éditions de cette spécification sont maintenant bien formés, et des documents précédement invalides utilisant des noms de caractères nouvellement permis, par exemple, les attributs ID, sont maintenant valident.

Cette édition remplace la précédente édition W3C Recommendation of 16 August 2006.

Signalez les erreurs rencontrées dans ce document sur la liste de diffusion xml-editor@w3.org; des archives publiques sont disponibles. Par souci de commodité pour les lecteurs, une version XHTML avec des indications de révision colorées est aussi fournie; cette version met en valeur chaque changement relatif à un erratum publié dans la liste des erreurs de la précédente édition, accompagné qu’un lien vers l’erreur particulière de cette liste. La plupart des erreurs de la liste fournissent la justification du changement. La liste des erreurs pour cette cinquième édition est disponible à l’URL http://www.w3.org/XML/xml-V10-5e-errata.

Un rapport de mise en œuvre est disponible à l’URL http://www.w3.org/XML/2008/01/xml10-5e-implementation.html. Une Test Suite est maintenue pour aider à l’évaluation de la conformité à cette spécification.

Ce document a été revu par des membres du W3C, par des développeurs de logiciels, et d’autres groupes du W3C et parties intéressées, et est approuvé par le Directeur en tant que Recommandation W3C. C’est un document stable qui peut être utilisé comme document de référence ou cité par un autre document. Le rôle du W3C en produisant la Recommandation est d’attirer l’attention sur la spécification et de promouvoir son large déploiement. Cela contribue à l’amélioration de la fonctionnalité et de l’interopérabilité du Web.

Le W3C maintient une liste publique de divulgations des brevets faites en relation avec les produits livrables du groupe; cette page comprend également les instructions concernant la divulgation d’un brevet. Toute personne ayant une connaissance réelle d’un brevet dont elle estime qu’il contient des revendications essentielles doit divulguer l’information conformément à la section 6 Divulgation de la Politique des brevets du W3C.

Table des matières

1 Introduction
    1.1 Origine et buts
    1.2 Terminologie
2 Documents
    2.1 Documents XML bien formés
    2.2 Caractères
    2.3 Constructions syntaxiques communes
    2.4 Données textuelles et balisage
    2.5 Commentaires
    2.6 Instructions de traitement
    2.7 Sections CDATA
    2.8 Prologue et Déclaration de Type de Document
    2.9 Déclaration de document autonome
    2.10 Traitement de l'espace blanc
    2.11 Traitement des fins de ligne
    2.12 Identification de langue
3 Structures logiques
    3.1 Balises d'ouverture, balises de fermeture et balises d'élément vide
    3.2 Déclarations de type d'élément
        3.2.1 Contenu d'élément
        3.2.2 Contenu mixte
    3.3 Déclarations de liste d'attributs
        3.3.1 Types d'attribut
        3.3.2 Attribut par défaut
        3.3.3 Normalisation de valeur d'attribut
    3.4 Sections conditionnelles
4 Structures physiques
    4.1 Références de caractère et d'entité
    4.2 Déclarations d'entités
        4.2.1 Entités internes
        4.2.2 Entités externes
    4.3 Entités analysables
        4.3.1 La déclaration de texte
        4.3.2 Entités analysables bien formées
        4.3.3 Codage des caractères dans les entités
    4.4 Traitement des entités et des références par un processeur XML
        4.4.1 Non reconnu
        4.4.2 Inclus
        4.4.3 Inclus si validation
        4.4.4 Interdit
        4.4.5 Inclus dans littéral
        4.4.6 Signalé
        4.4.7 Non interprété
        4.4.8 Inclus comme EP
        4.4.9 Erreur
    4.5 Construction du texte de remplacement d'une entité
    4.6 Entités prédéfinies
    4.7 Déclarations de notation
    4.8 L'entité document
5 Conformité
    5.1 Processeurs validant et non-validant
    5.2 Utilisation des processeurs XML
6 Notation

Annexes

A Références
    A.1 Références normatives
    A.2 Autres références
B Classes de caractères
C XML et SGML (Non normatif)
D Développement des références d'entité et de caractère (Non normatif)
E Modèles de contenu déterministes (Non normatif)
F Auto-détection du codage de caractères (Non normatif)
    F.1 Détection sans Information de Codage Externe
    F.2 Les priorités dans la Présence de l'Information Externe de Codage
G Groupe de Travail W3C XML (Non normatif)
H Groupe de Travail W3C XML Core (Non normatif)
I Notes de production (Non normatif)
J Suggestions pour les noms XML (Non normatif)


1 Introduction

Le langage de balisage extensible, abrégé XML (eXtensible Markup Language), décrit une classe d'objets de données appelés documents XML et décrit partiellement le comportement des programmes qui les traitent. Le XML est un profil d'application ou une forme restreinte de SGML (Standard Generalized Markup Language), le langage de balisage standard généralisé [ISO 8879]. Par construction, les documents XML sont conformes au SGML.

Les documents XML se composent d'unités de stockage appelées entités, qui contiennent des données analysables ou non analysables. Les données analysables se composent de caractères, certains formant les données textuelles, et le reste formant le balisage. Le balisage décrit la mise en forme de stockage du document et la structure logique. Le XML fournit un mécanisme pour imposer des contraintes sur la mise en forme de stockage et sur la structure logique.

[Définition : Un module logiciel appelé processeur XML est utilisé pour lire un document XML et fournir un accès à leur contenu et leur structure.] [Définition : On suppose qu'un processeur XML effectue son travail pour le compte d'un autre module, appelé application.] Cette spécification décrit le comportement attendu d'un processeur XML, en d'autres termes, la manière dont il doit lire des données XML et l'information qu'il doit fournir à l'application.

1.1 Origine et buts

Le XML a été développé par un Groupe de travail XML (initialement connu sous le nom de Comité d'Examen Éditorial SGML) constitué sous les auspices du Consortium World Wide Web (W3C) en 1996. Il était présidé par Jon Bosak de Sun Microsystems avec la participation active d'un Groupe d'Intérêt Spécial XML (auparavant connu comme le Groupe de Travail du SGML), également organisé par le W3C. La composition du Groupe de travail XML est donnée en annexe. Dan Connolly agissait comme contact du Groupe de Travail auprès du W3C.

Les objectifs de conception du XML sont les suivants :

  1. le XML devrait pouvoir être utilisé sans difficulté sur l'Internet;

  2. le XML devrait supporter une large variété d'applications;

  3. le XML devra être compatible avec le SGML;

  4. il devrait être facile d'écrire des programmes traitant les documents XML;

  5. le nombre de caractéristiques optionnelles du XML doit être réduit au minimum, idéalement aucune;

  6. les documents XML devraient être lisibles par l'homme et raisonnablement clairs;

  7. la conception du XML devrait être préparée rapidement;

  8. la conception du XML sera formelle et concise;

  9. les documents XML devraient être facile à créer;

  10. la concision dans le balisage XML a peu d'importance.

Cette spécification, ainsi que certains standards associés (Unicode [Unicode] et l'ISO/CEI 10646 [ISO/IEC 10646] pour les caractères, la BCP 47 [IETF BCP 47] et le Language Subtag Registry [IANA-LANGCODES] pour les balises d'identification de langue), fournissent toute l'information nécessaire pour comprendre la version 1.0 du XML et construire des programmes pour la traiter.

Cette version de la spécification du XML peut être distribuée librement, à condition que tout le texte et les notices légales demeurent intacts.

1.2 Terminologie

La terminologie utilisée pour décrire les documents XML est définie dans le corps dans cette spécification. Les mots-clés DOIT, NE DOIT PAS, REQUIS, DEVRA, NE DEVRA PAS, DEVRAIT, NE DEVRAIT PAS, RECOMMANDÉ, PEUT, et OPTIONNEL, lorsqu'ils sont SOULIGNÉS, doivent être interprétés dans cette spécification comme décrits dans la [IETF RFC 2119]. Enfin, les termes définis dans la liste suivante sont utilisés pour établir ces définitions et pour décrire les actions d'un processeur XML :

erreur

[Définition : une violation des règles de cette spécification; les résultats sont indéterminés. Sauf indication contraire, l'échec d'une prescription de cette spécification est indiquée dans une erreur par l'un des mots-clés DOIT, REQUIS, NE DOIT PAS, DEVRA ou NE DEVRA PAS. Un logiciel conforme PEUT détecter et signaler une erreur et PEUT s'en remettre.]

erreur fatale

[Définition : une erreur qu'un processeur XML conforme DOIT détecter et signaler à l'application. À la suite d'une erreur fatale, le processeur PEUT continuer à traiter les données pour rechercher d'autres erreurs et PEUT signaler de telles erreurs à l'application. Afin d'aider à la correction des erreurs, le processeur PEUT rendre disponibles à l'application des données non traitées (mélange de données textuelles et de balisage). Toutefois, dès qu'une erreur fatale est détectée, le processeur NE DOIT PAS continuer le traitement normal (c.-à-d. qu'il NE DOIT PAS continuer de transmettre à l'application les données textuelles et l'information sur la structure logique du document de manière habituelle).]

au gré de l'utilisateur

[Définition : un logiciel conforme PEUT ou DOIT (selon le verbe dans la phrase) se comporter tel que décrit; si tel est le cas, il DOIT fournir à l'utilisateur un moyen d'activer ou de désactiver le comportement décrit.]

contrainte de validité

[Définition : une règle qui s'applique à tous les documents XML valides. Les violations des contraintes de validité sont des erreurs; elles DOIVENT, au gré de l'utilisateur, être signalées par les processeurs XML validants.]

contrainte de forme

[Définition : une règle qui s'applique à tous les documents XML bien formés. Les violations des contraintes de forme sont des erreurs fatales.]

correspondance

[Définition : (de chaînes de caractères ou de noms :) deux chaînes de caractères ou deux noms correspondent s'ils sont identiques. Les caractères ayant plusieurs représentations dans l'ISO/CEI 10646 (p. ex. les caractères à la fois précomposés et de la forme base + diacritique) correspondent seulement s'ils ont la même représentation dans les deux chaînes de caractères. Aucune transformation de casse n'est effectuée. (De chaînes de caractères et de règles de grammaire :) Une chaîne de caractères correspond à une production grammaticale si elle appartient au langage généré par cette production. (Du contenu et des modèles de contenu :) Un élément correspond à sa déclaration quand il se conforme à la forme décrite par la contrainte [VC: Élément valide].]

à des fins de compatibilité

[Définition : marque une phrase décrivant une caractéristique du XML incluse uniquement afin de s'assurer que le XML demeure compatible avec le SGML.]

à des fins d'interopérabilité

[Définition : marque une phrase décrivant une recommandation incluse pour augmenter les chances que les documents XML puissent être traités par les processeurs SGML de base existant qui sont antérieur au « WebSGML Adaptations » de l'ISO 8879.]

2 Documents

[Définition : Un objet de données est un document XML s'il est bien formé, tel que définit dans cette spécification. De plus, un document XML est valide s'il satisfait certaines autres contraintes.]

Chaque document XML a une structure logique et une structure physique. Physiquement, le document se compose d'unités appelées entités. Une entité peut référé d'autres entités afin qu'elles soient incluses dans le document. Un document commence à la « racine » ou une entité document. Logiquement, le document se compose de déclarations, d'éléments, de commentaires, de références de caractères et d'instructions de traitement, qui sont indiqués dans le document par un balisage explicite. Les structures logique et physique DOIVENT s'imbriquées correctement, tel que décrit dans 4.3.2 Entités analysables bien formées.

2.1 Documents XML bien formés

[Définition : Un objet textuel est un document XML bien formé si :]

  1. pris dans son ensemble, il correspond à la production étiquetée document;

  2. il réponds à toutes les contraintes de forme données par cette spécification;

  3. chacune des entités analysables générales référencées directement ou indirectement dans le document est bien formée.

Document
[1]    document    ::=    prolog element Misc*

La correspondance de la production document implique que :

  1. Le document contient un ou plusieurs éléments.

  2. [Définition : Il existe un unique élément, appelé racine, ou élément document, dont aucune partie n'apparaît dans le contenu d'un autre élément.] Pour tous autres éléments, si la balise d'ouverture est dans le contenu d'un autre élément, la balise de fermeture est dans le contenu du même élément. Autrement dit, les éléments, délimités par des balises d'ouverture et de fermeture, s'imbriquent correctement les uns dans les autres.

[Définition : En conséquence, pour chaque élément non-racine F dans le document, il existe, dans le document, un autre élément P tel que F soit dans le contenu de P, mais qui n'est pas dans le contenu d'un autre élément qui soit dans le contenu de P. P fait référence au parent de F, et F au fils de P.]

2.2 Caractères

[Définition : Une entité analysable contient du texte, une suite de caractères, qui peuvent représenter du balisage ou des données textuelles.] [Définition : Un caractère est une unité atomique de texte définit par l'ISO/CEI 10646:2000 [ISO/IEC 10646]. Les caractères admis sont la tabulation, le retour chariot, le saut de ligne, les caractères Unicode et les caractères ISO/CEI 10646. Les versions de ces standards, cités dans A.1 Références normatives, étaient courantes au moment où ce document a été préparé. De nouveaux caractères peuvent être ajoutés à ces standards par des amendements ou de nouvelles éditions. Par conséquent, les processeurs XML DOIVENT accepter tous les caractères de l'ensemble spécifié pour Char.]

Ensemble de caractères
[2]    Char    ::=    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* tout caractère Unicode, hormis les seizets d'indirection, FFFE et FFFF. */

Le mécanisme de codage des points de code de caractère en motifs binaires peut varier d'une entité à l'autre. Tous les processeurs XML DOIVENT accepter les codages UTF-8 et UTF-16 d'Unicode [Unicode] ; les mécanismes pour signaler lequel des deux est utilisé, ou pour introduire d'autres codages en jeu, sont discutés ci-dessous, dans 4.3.3 Codage des caractères dans les entités.

Note :

Les « caractères de compatibilité » tels que définis dans la section 2.3 de l' [Unicode]. Les caractères définis dans les intervalles suivants sont également déconseillés. Ce sont des caractères de contrôle ou des caractères Unicode indéfinis :

[#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDEF],
[#x1FFFE-#x1FFFF], [#x2FFFE-#x2FFFF], [#x3FFFE-#x3FFFF],
[#x4FFFE-#x4FFFF], [#x5FFFE-#x5FFFF], [#x6FFFE-#x6FFFF],
[#x7FFFE-#x7FFFF], [#x8FFFE-#x8FFFF], [#x9FFFE-#x9FFFF],
[#xAFFFE-#xAFFFF], [#xBFFFE-#xBFFFF], [#xCFFFE-#xCFFFF],
[#xDFFFE-#xDFFFF], [#xEFFFE-#xEFFFF], [#xFFFFE-#xFFFFF],
[#x10FFFE-#x10FFFF].

2.3 Constructions syntaxiques communes

Ce paragraphe définit quelques symboles largement utilisés dans la grammaire.

S (espace blanc) se compose d'un ou plusieurs caractères espace (#x20), retours chariots, sauts de ligne ou tabulations.

Espace blanc
[3]    S    ::=    (#x20 | #x9 | #xD | #xA)+

Note :

Dans la production ci-dessus, le caractère #xD est conservé uniquement pour la rétro-compatibilité avec la Première Édition. Comme expliquer dans 2.11 Traitement des fins de ligne, tous les caractères #xD présents littéralement dans un document XML sont supprimés ou remplacés par des caractères #xA avant que tout autre traitement soit effectué. La seule façon de récupérer un caractère #xD correspondant à cette production est d'utiliser une référence de caractère dans une valeur littérale d'entité.

Un Nmtoken (name token, atome nominal) est un mélange de caractères de nom.

[Définition : Un Name est un Nmtoken avec un ensemble limité de caractères initiaux.] Les caractères initiaux non autorisés pour les Names sont les chiffres, les diacritiques, le point final et la césure.

Dans cette version ou les versions ultérieures de cette spécification, les noms commençant par la chaîne de caractères « xml », ou toute chaîne de caractères correspondant à (('X'|'x') ('M'|'m') ('L'|'l')), sont réservés à des fins de normalisation.

Note :

Les espaces de nom de la Recommandation XML [XML Names] assignent un sens aux noms contenant des caractères deux-points. Toutefois, les auteurs ne devraient pas utiliser le deux-points dans les noms XML, excepter pour les espaces de noms, mais les processeurs XML doivent accepter le deux-points en tant que caractère de nom.

Le premier caractère d'un Name DOIT être un NameStartChar, et tous les autres caractères DOIVENT être des NameChars; ce mécanisme est utilisé afin d'éviter les noms commençant par des chiffres Européens (ASCII) ou par une combinaison de caractères de base. La plupart des caractères sont permit dans les noms, excepter ceux qui sont ou qui pourraient être raisonnablement utilisés comme délimiteurs. L'intention est d'être inclusif plutôt qu'exclusif, de sorte que les systèmes d'écriture pas encore encodés en Unicode puissent être utilisés pour les noms XML. Voir J Suggestions pour les noms XML pour des suggestions sur la création des noms.

Les auteurs de documents sont encouragés à utiliser des noms qui soient des mots ou des combinaisons de mots significatifs dans les langues naturelles, et à éviter la symbolique ou les caractères d'espace blancs. Notez que COLON, HYPHEN-MINUS, FULL STOP (point final), LOW LINE (souligner) et MIDDLE DOT sont explicitement autorisés.

Les symboles ASCII et les marques de ponctuations, ainsi que de nombreux caractères symboliques de l'Unicode, sont exclus des noms parce qu'ils sont plutôt utilisés comme délimiteurs dans des contextes où les noms XML sont utilisés en dehors des documents XML. Le caractère #x037E, POINT D'INTERROGATION GREC, est exclus parce qu'il est normalisé sous la forme d'un point virgule, ce qui pourrait changer la signification des références d'entités.

Noms et atomes nominaux
[4]    NameStartChar    ::=    ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a]    NameChar    ::=    NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[5]    Name    ::=    NameStartChar (NameChar)*
[6]    Names    ::=    Name (#x20 Name)*
[7]    Nmtoken    ::=    (NameChar)+
[8]    Nmtokens    ::=    Nmtoken (#x20 Nmtoken)*

Note :

Les productions Names et Nmtokens sont utilisées pour définir la validité des valeurs décomposées d'attribut après normalisation (voir 3.3.1 Types d'attribut).

Une donnée littérale est une chaîne de caractères entre guillemets ne contenant pas le caractère guillemet utilisé comme délimiteur de cette chaîne. Les littéraux sont utilisés pour spécifier le contenu des entités internes (EntityValue), des valeurs d'attributs (AttValue), et des identificateurs externes (SystemLiteral). Notez qu'un SystemLiteral peut être analysé sans parcourir le balisage.

Littéraux
[9]    EntityValue    ::=    '"' ([^%&"] | PEReference | Reference)* '"'
|  "'" ([^%&'] | PEReference | Reference)* "'"
[10]    AttValue    ::=    '"' ([^<&"] | Reference)* '"'
|  "'" ([^<&'] | Reference)* "'"
[11]    SystemLiteral    ::=    ('"' [^"]* '"') | ("'" [^']* "'")
[12]    PubidLiteral    ::=    '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"
[13]    PubidChar    ::=    #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]

Note :

Bien que la production EntityValue permette la définition d'une entité générale composée explicitement d'un seul caractère < dans le littéral (p. ex., <!ENTITY mylt "<">), il est fortement conseillé d'éviter cette pratique puisque toute référence à cette entité provoquera une erreur de contrainte de forme.

2.4 Données textuelles et balisage

Le texte se compose de données textuelles et de balisage entremêlés. Le [Définition : balisage prend la forme de balises d'ouverture, de balises de fermeture, de balises d'éléments vides, de références d'entité, de références de caractère, de commentaires, de délimiteurs de section CDATA, de déclarations de type de document, d'instructions de traitement, de déclarations XML, de déclarations de texte et de tout espace blanc qui se trouve au niveau de l'entité document (à savoir, en dehors de l'élément document et non pas dans une balise).]

[Définition : Tout le texte qui n'est pas du balisage constitue les données textuelles du document.]

Les caractères esperluète (&) et inférieur à (<) NE DOIVENT PAS apparaître sous leur forme littérale, excepter lorsqu'ils sont utilisés comme délimiteurs de balisage, ou dans un commentaire, une instruction de traitement ou une section CDATA. S'ils sont nécessaires ailleurs, ils DOIVENT être échappés en utilisant des références numériques de caractères ou les chaînes de caractères « &amp; » et « &lt; » respectivement. Le caractère supérieur à (>) peut être représenté en utilisant la chaîne de caractères « &gt; », et pour la compatibilité, il DOIT être échappé en utilisant « &gt; » ou une référence de caractère lorsqu'il apparaît dans la chaîne de caractères « ]]> » d'un contenu, ou lorsque cette chaîne de caractères ne marque pas la fin d'une section CDATA.

Dans le contenu des éléments, une donnée textuelle est une chaîne de caractères ne contenant pas de délimiteur de début de balise et n'incluant pas de délimiteur de fin de section CDATA, « ]]> ». Dans une section CDATA, une donnée textuelle est une chaîne de caractères ne contenant pas le délimiteur de fin de section CDATA, « ]]> ».

Afin de permettre aux valeurs d'attribut de contenir des guillemets droits simples ou doubles, ou le caractère simple quote (') peut être représenté par « &apos; », et le caractère guillemet droit double (") par « &quot; ».

Données textuelles
[14]    CharData    ::=    [^<&]* - ([^<&]* ']]>' [^<&]*)

2.5 Commentaires

[Définition : Les commentaires peuvent apparaître n'importe où dans un document en dehors d'autre balisage; de plus, ils peuvent apparaître dans la déclaration de type de document aux endroits permis par la grammaire. Ils ne font pas partie des données textuelles du document; un processeur XML PEUT, mais pas nécessairement, permettre à une application de récupérer le texte des commentaires. Pour la compatibilité, la chaîne de caractères « -- » (double tiret) NE DOIT PAS apparaître dans les commentaires.] Les références d'entité paramètre (abrégée EP) NE DOIVENT PAS être reconnues dans les commentaires.

Commentaires
[15]    Comment    ::=    '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'

Un exemple de commentaire :

<!-- declarations for <head> & <body> -->

Notez que la grammaire ne permet pas qu'un commentaire se termine par la chaîne de caractère --->. L'exemple suivant n'est pas bien formé.

<!-- B+, B, or B--->

2.6 Instructions de traitement

[Définition : Les instructions de traitement (IT) permettent aux documents de contenir des instructions pour les applications.]

Instructions de traitement
[16]    PI    ::=    '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
[17]    PITarget    ::=    Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

Les instructions de traitement ne font pas partie des données textuelles des documents, mais DOIVENT être transmises à l'application. Une instruction de traitement commence par une cible (PITarget), utilisée pour identifier l'application à laquelle l'instruction est destinée. Dans cette version ou les versions ultérieures de cette spécification, les noms de cible « XML », « xml », etc, sont réservés à des fins de standardisation. Le mécanisme de Notation du XML peut être utilisé pour la déclaration formelle des cibles d'une instruction de traitement. Les références d'entité paramètre NE DOIVENT PAS être reconnues dans les instructions de traitement.

2.7 Sections CDATA

[Définition : Les sections CDATA peuvent se trouver à n'importe quel endroit acceptable pour des données textuelles; elles sont utilisées pour échapper des blocs de texte contenant des caractères qui seraient autrement reconnus comme balisage. Les sections CDATA commencent par la chaîne de caractères « <![CDATA[ » et se terminent par la chaîne de caractères « ]]> » :]

Sections CDATA
[18]    CDSect    ::=    CDStart CData CDEnd
[19]    CDStart    ::=    '<![CDATA['
[20]    CData    ::=    (Char* - (Char* ']]>' Char*))
[21]    CDEnd    ::=    ']]>'

Dans une section CDATA, seule la chaîne de caractères CDEnd est reconnue comme balisage, de sorte que les caractères inférieur à et esperluète peuvent s'y trouver sous leur forme littérale; ils n'ont pas besoin (et ne peuvent pas) être échappés en utilisant « &lt; » et « &amp; ». Les sections CDATA ne peuvent pas s'imbriquer.

Voici un exemple de section CDATA, dans lequel « <greeting> » et « </greeting> » sont reconnus comme données textuelles, et non comme balisage :

<![CDATA[<greeting>Hello, world!</greeting>]]> 

2.8 Prologue et Déclaration de Type de Document

[Définition : Les documents XML DEVRAIENT commencer par une déclaration XML qui définit la version du XML utilisé.] Par exemple, l'extrait suivant est un document XML bien formé complet mais non valide :

<?xml version="1.0"?>
<greeting>Hello, world!</greeting> 

il en est de même de celui-ci :

<greeting>Hello, world!</greeting>

La fonction du balisage dans un document XML consiste à décrire son stockage et sa structure logique et à associer des paires nom-valeur à ses structures logiques. Le XML fournit un mécanisme, la déclaration de type de document, pour définir des contraintes sur la structure logique et pour supporter l'utilisation des unités de stockage prédéfinies. [Définition : Un document XML est valide s'il est associé à une déclaration de type de document et si le document est conforme aux contraintes exprimées.]

La déclaration de type de document DOIT apparaître avant le premier élément du document.

Prologue
[22]    prolog    ::=    XMLDecl? Misc* (doctypedecl Misc*)?
[23]    XMLDecl    ::=    '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
[24]    VersionInfo    ::=    S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"')
[25]    Eq    ::=    S? '=' S?
[26]    VersionNum    ::=    '1.' [0-9]+
[27]    Misc    ::=    Comment | PI | S

Bien que la production VersionNum corresponde à un numéro de version de la forme '1.x', les documents XML 1.0 NE DOIVENT PAS spécifiés un numéro de version différent de '1.0'.

Note :

Lorsqu'un processeur XML 1.0 rencontre un document qui spécifit un numéro de version 1.x, différent de '1.0', il le traitera comme un document 1.0. Ceci signifie qu'un processeur XML 1.0 acceptera les documents 1.x à condition qu'ils n'utilisent pas de caractéristiques non 1.0.

[Définition : La déclaration de type de document XML contient ou pointe des déclarations de balisage qui fournissent une grammaire pour une classe de documents. Cette grammaire est connue comme déclaration de type de document, ou DTD. La déclaration de type de document peut pointer un sous-ensemble externe (une sorte d'entité externe spéciale) contenant des déclarations de balisage, ou peut contenir des déclarations de balisage directement dans un sous-ensemble interne ou peut contenir les deux. La DTD d'un document se compose des deux sous-ensembles regroupés.]

[Définition : Une déclaration de balisage est une déclaration de type d'élément, une déclaration de liste d'attributs, une déclaration d'entité ou une déclaration de notation.] Ces déclarations peuvent être contenues entièrement ou partiellement dans des entités paramètres, tel que décrit ci-dessous dans les contraintes de forme et de validité. Pour plus d'informations, voir 4 Structures physiques.

Déclaration de Type de Document
[28]    doctypedecl    ::=    '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>' [CV : Type de l'élément racine]
[CF : Sous-ensemble externe]
[28a]    DeclSep    ::=    PEReference | S [CF : EP entre les déclarations]
[28b]    intSubset    ::=    (markupdecl | DeclSep)*
[29]    markupdecl    ::=    elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [CV : Imbrication stricte des déclarations et des EP]
[CF : EP dans le sous-ensemble interne]

Notez qu'il est possible de construire un document bien formé contenant une doctypedecl qui ne pointe pas un sous-ensemble externe et ne contient pas de sous-ensemble interne.

Les déclarations de balisage peuvent se composer entièrement ou partiellement du texte de remplacement d'entités paramètres. Dans cette spécification, les productions suivantes pour les différents non-terminaux (elementdecl, AttlistDecl, et ainsi de suite) décrivent les déclarations après que toutes les entités paramètres aient été incluses.

Les références d'entité paramètre sont reconnues partout dans la DTD (les sous-ensembles interne et externe, et les entités paramètres externes), excepter dans les littéraux, les instructions de traitement, les commentaires, et les contenus de sections conditionnelles ignorées (voir 3.4 Sections conditionnelles). Elles sont également reconnues dans une valeur littérale d'entité. L'utilisation d'entités paramètres dans le sous-ensemble interne est limitée comme décrit ci-dessous.

Contrainte de validité : Type de l'élément racine

Le Name dans la déclaration de type de document DOIT correspondre au type d'élément de l'élément racine.

Contrainte de validité : Imbrication stricte des déclarations et des EP

Le texte de remplacement des entités paramètres DOIT être correctement imbriqué dans les déclarations de balisage. C'est-à-dire, si le premier ou le dernier caractère d'une déclaration de balisage (markupdecl ci-dessus) est contenu dans le texte de remplacement d'une référence d'entité paramètre, tous les deux DOIVENT être contenus dans le même texte de remplacement.

Contrainte de mise en forme : EP dans le sous-ensemble interne

Dans le sous-ensemble interne de la DTD, les références d'entité paramètre NE DOIVENT PAS se trouver dans les déclarations de balisage; elles ne peuvent se trouver que là où des déclarations de balisage peuvent se trouver. (Ceci ne s'applique pas aux références qui se trouvent dans les entités paramètres externes ou le sous-ensemble externe.)

Contrainte de mise en forme : Sous-ensemble externe

S'il existe, le sous-ensemble externe DOIT correspondre à la production extSubset.

Contrainte de mise en forme : EP entre les déclarations

Le texte de remplacement d'une référence d'entité paramètre dans une DeclSep DOIT correspondre à la production extSubsetDecl.

Tout comme le sous-ensemble interne, le sous-ensemble externe et les entités paramètres externes référencées dans un DeclSep DOIVENT être composer d'une suite de déclarations de balisage complète des types permis par le symbole non-terminal markupdecl, parsemées d'espaces blancs ou de références d'entité paramètre. Cependant, des parties du contenu du sous-ensemble externe ou des entités paramètres externes peuvent conditionnellement être ignorées en utilisant le mécanisme de section conditionnelle; ceci n'est pas permis dans le sous-ensemble interne mais l'est dans les entités paramètres externes référencées dans le sous-ensemble interne.

Sous-ensemble externe
[30]    extSubset    ::=    TextDecl? extSubsetDecl
[31]    extSubsetDecl    ::=    ( markupdecl | conditionalSect | DeclSep)*

Le sous-ensemble externe et les entités paramètres externes diffèrent également du sous-ensemble interne, les références d'entité paramètre sont permises à l'intérieur des déclarations de balisage, pas seulement entre les déclarations de balisage.

Exemple d'un document XML avec une déclaration de type de document :

<?xml version="1.0"?>
<!DOCTYPE greeting SYSTEM "hello.dtd">
<greeting>Hello, world!</greeting> 

L'identificateur de système « hello.dtd » donne l'adresse (une référence d'URI) d'une DTD du document.

Les déclarations peuvent également être données localement, comme dans cet exemple :

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE greeting [
  <!ELEMENT greeting (#PCDATA)>
]>
<greeting>Hello, world!</greeting>

Si les sous-ensembles externe et interne sont utilisés, le sous-ensemble interne DOIT être considéré comme se produisant avant le sous-ensemble externe. Ceci a pour effet que les déclarations d'entités et de liste d'attributs du sous-ensemble interne ont priorité sur celles du sous-ensemble externe.

2.9 Déclaration de document autonome

Les déclarations de balisage peuvent affecter le contenu du document, tel qu'il est transmis d'un processeur XML à une application; les attributs par défaut et des déclarations d'entité en sont des exemples. La déclaration de document autonome, qui peut apparaître comme un composant de la déclaration XML, précise s'il existe ou non de telles déclarations, lesquelles apparaissent comme externes à l'entité document ou dans les entités paramètres. [Définition : Une déclaration de balisage externe est définie comme une déclaration de balisage se trouvant dans le sous-ensemble externe ou dans une entité paramètre (externe ou interne, cette dernière étant incluse car les processeurs non-validant ne sont pas tenus de les lire).]

Déclaration de document autonome
[32]    SDDecl    ::=    S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) [CV : Déclaration de document autonome]

Dans une déclaration de document autonome, la valeur "yes" indique qu'il n'y a pas de déclarations de balisage externes qui affecterait l'information transmise du processeur XML à l'application. La valeur "no" indique qu'il y a ou peut y avoir de telles déclarations de balisage externes. Notez que la déclaration de document autonome précise uniquement la présence de déclarations externes; dans un document, la présence de références à des entités externes ne change pas son status d'autonomie, lorsque ces entités sont déclarées dans le sous-ensemble interne.

S'il n'existe aucune déclaration de balisage externe, la déclaration de document autonome n'a aucune signification. S'il existe des déclarations de balisage externes mais pas de déclaration de document autonome, la valeur "no" est présumée.

Tout document XML pour lequel standalone="no" peut être converti algorithmiquement en un document autonome, ce qui peut être souhaitable pour des applications d'administration réseau.

Contrainte de validité : Déclaration de document autonome

La déclaration de document autonome DOIT avoir la valeur "no" si des déclarations de balisage externes contiennent les déclarations suivantes :

  • d'attributs avec des valeurs par défaut, si les éléments auxquels s'appliquent ces attributs apparaissent dans le document sans spécification de valeur pour ces attributs, ou

  • des entités (autre que amp, lt, gt, apos, quot), si les références à ces entités apparaissent dans le document, ou

  • des attributs avec des types tokenized, où l'attribut apparaît dans le document avec une valeur telle que la normalisation produira une valeur différente de celle qui pourrait être produite en l'absence de déclaration, ou

  • des types d'élément avec un contenu élémentaire pur, si de l'espace blanc apparaît directement dans toute instance de ce type.

Exemple de déclaration XML avec une déclaration de document autonome :

<?xml version="1.0" standalone='yes'?>

2.10 Traitement de l'espace blanc

Lors de l'édition de documents XML, il est souvent commode d'utiliser de l'« espace blanc » (espaces, tabulations et interlignes) afin de distinguer le balisage et d'améliorer la lisibilité. Un tel espace blanc n'est pas typiquement destiné à être inclus dans la version livrée du document. En revanche, l'espace blanc « significatif » qui devrait être préservé dans la version livrée est courant, par exemple dans un poème ou un code source.

Un processeur XML DOIT toujours transmettre à l'application tous les caractères d'un document qui ne sont pas du balisage. Un processeur XML validant DOIT également informer l'application desquels de ces caractères constituent l'espace blanc apparaissant dans du contenu élémentaire pur.

Un attribut spécial nommé xml:space peut être attaché à un élément pour signaler l'intention de préserver l'espace blanc dans cet élément par les applications. Dans les documents valides, cet attribut, comme tout autre, DOIT être déclaré s'il est utilisé. S'il est déclaré, il DOIT être définit de type énuméré, dont les seules valeurs admises sont "default" et "preserve". Par exemple :

<!ATTLIST poem  xml:space (default|preserve) 'preserve'>

<!ATTLIST pre xml:space (preserve) #FIXED 'preserve'>

La valeur "default" indique que les modes implicites de traitement d'espaces blancs sont acceptables pour cet élément; la valeur "preserve" indique que les applications préservent tous espaces blancs. Cette intention déclarée s'applique à tous les éléments dans le contenu de l'élément porteur de la déclaration, à moins qu'elle ne soit annulée par une autre instance de l'attribut xml:space. Cette spécification ne donne de sens à xml:space que pour les valeurs "default" et "preserve". C'est une erreur de spécifier d'autres valeurs; le processeur XML PEUT signaler l'erreur ou PEUT récupérer en ignorant la spécification d'attribut ou en signalant la valeur (erronée) à l'application. Les applications peuvent ignorer ou rejeter les valeurs erronées.

L'élément racine d'un document est considéré comme ayant signalé aucune intention concernant le traitement du blanc par l'application, sauf s'il fournit une valeur pour cet attribut, ou si l'attribut est déclaré avec une valeur par défaut.

2.11 Traitement des fins de ligne

Les entités analysables XML sont souvent enregistrées dans des fichiers, organisés en lignes afin d'en facilité la rédaction. Typiquement, ces lignes sont séparées par une combinaison de caractères CARRIAGE RETURN (#xD) et LINE FEED (#xA).

Pour simplifier les tâches des applications, le processeur XML DOIT se comporter comme s'il normalisait tous les sauts de ligne dans les entités externes analysables de l'entrée (y compris l'entité document), avant l'analyse, en traduisant la séquence des deux caractères #xD #xA et tout caractère #xD qui ne soit pas suivis par #xA, en un seul caractère #xA.

2.12 Identification de langue

Dans le traitement de document, il est souvent utile d'identifier la langue naturelle ou formelle dans laquelle le contenu est écrit. Un attribut spécial, nommé xml:lang, peut être inséré dans les documents pour spécifier la langue utilisée dans les contenus et les valeurs d'attributs des éléments d'un document XML. Dans les documents valides, lorsque cet attribut est utilisé, il DOIT être déclaré, comme tout autre attribut. Les valeurs de l'attribut sont des identificateurs de langue définis par [IETF BCP 47], Tags for the Identification of Languages; de plus, la chaîne de caractères vide peut être spécifiée.

(Les productions 33 à 38 ont été supprimés.)

Par exemple :

<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
<p xml:lang="en-GB">What colour is it?</p>
<p xml:lang="en-US">What color is it?</p>
<sp who="Faust" desc='leise' xml:lang="de">
  <l>Habe nun, ach! Philosophie,</l>
  <l>Juristerei, und Medizin</l>
  <l>und leider auch Theologie</l>
  <l>durchaus studiert mit heißem Bemüh'n.</l>
</sp>

La langue spécifiée par xml:lang s'applique à l'élément dans lequel elle est spécifiée (y compris les valeurs de ses attributs), et à tous les éléments de son contenu, à moins qu'il ne soit remplacé par une autre instance de xml:lang. En particulier, la valeur vide de xml:lang est utilisée dans un élément B pour remplacer une spécification de xml:lang d'un élément A enveloppant, sans spécifier une autre langue. Dans B, on considère qu'il n'existe aucune information de langue de disponible, comme si xml:lang n'avait pas été spécifié dans B ou l'un de ses ancêtres. Les applications déterminent quelles valeurs d'attribut d'un élément et quelles parties de son contenu textuel, sont traitées comme des valeurs dépendantes de la langue décrite par xml:lang.

Note :

L'information de langue peut aussi être fournit par les protocoles de transport externes (p. ex. HTTP ou MIME). Lorsqu'elle est disponible, cette information doit être utilisée par les applications XML, mais l'information plus locale fournie par xml:lang devrait être considérée pour la remplacer.

Une déclaration simple de xml:lang pourrait prendre la forme suivante :

xml:lang CDATA #IMPLIED

mais des valeurs par défaut spécifiques peuvent aussi être données, le cas échéant. Dans un recueil de poèmes français pour étudiants anglais, avec des gloses et des notes en anglais, l'attribut xml:lang pourrait être déclaré de cette façon :

<!ATTLIST poem   xml:lang CDATA 'fr'>
<!ATTLIST gloss  xml:lang CDATA 'en'>
<!ATTLIST note   xml:lang CDATA 'en'>

3 Structures logiques

[Définition : Chaque document XML contient un ou plusieurs éléments, dont les limites sont marquées soit par des balises d'ouverture et des balises de fermeture, soit, pour les éléments vides, par une balise d'élément vide. Chaque élément a un type, identifié par un nom, parfois appelé son « identificateur générique » (IG), on peut y associer un jeu de spécifications d'attribut.] Chaque spécification d'attribut comprend un nom et une valeur.

Élément
[39]    element    ::=    EmptyElemTag
| STag content ETag [CF : Correspondance de type d'élément]
[CV : Élément valide]

Cette spécification ne contraint pas la sémantique de l'application, l'utilisation ou (au-delà de la syntaxe) les noms des types d'élément et d'attributs, hormis le fait que les noms commencant par une correspondance de (('X'|'x')('M'|'m')('L'|'l')) sont réservés à des fins de standardisation, dans cette version ou les versions ultérieures de cette spécification.

Contrainte de mise en forme : Correspondance de type d'élément

Le Name dans la balise de fermeture d'un élément DOIT correspondre au type de l'élément dans la balise d'ouverture.

Contrainte de validité : Élément valide

Un élément est valide s'il existe une déclaration correspondant à elementdecl où le Name correspond à un type d'élément, et l'une des conditions suivantes est vraie :

  1. La déclaration correspond à EMPTY et l'élément n'a pas de contenu (pas même de références d'entité, de commentaires, d'instructions de traitement ou d'espace blanc).

  2. La déclaration correspond à children et la suite d'éléments fils appartient au langage généré par l'expression régulière du modèle de contenu, avec du blanc optionnel, des commentaires et des instructions de traitement (p. ex. le balisage correspondant à la production [27] Misc) entre la balise d'ouverture et le premier élément fils, entre les éléments fils, ou entre le dernier élément fils et la balise de fermeture. Notez qu'une section CDATA contenant uniquement du blanc ou une référence à une entité dont le texte de remplacement ne correspond pas au non-terminal S, et par conséquent ne peut apparaître à ces positions; toutefois, une référence à une entité interne avec une valeur littérale constituée de références de caractères s'attendant à l'espace blanc correspond à S, puisque son texte de remplacement est l'espace blanc résultant de l'expansion de références de caractères.

  3. La déclaration correspond à Mixed, et le contenu (après remplacement des références d'entités par leur texte de remplacement) est constitué de données textuelles (y compris les sections CDATA), de commentaires, d'instructions de traitement et d'éléments fils dont les types correspondent aux noms dans le modèle du contenu.

  4. La déclaration correspond à ANY, et le contenu (après remplacement des références d'entités par leur texte de remplacement) est constitué de données textuelles, de sections CDATA), de commentaires, d'instructions de traitement et d'éléments fils dont les types ont été déclarés.

3.1 Balises d'ouverture, balises de fermeture et balises d'élément vide

[Définition : Le début de chaque élément XML non vide est marqué d'une balise d'ouverture.]

Balise d'ouverture
[40]    STag    ::=    '<' Name (S Attribute)* S? '>' [CF : Spécification unique de l'attribut]
[41]    Attribute    ::=    Name Eq AttValue [CV : Type de valeur de l'attribut]
[CF : Pas de références d'entité externe]
[CF : Pas de < dans les valeurs d'attribut]

Le Name des balises d'ouverture et de fermeture spécifie le type de l'élément. [Définition : Les paires Name-AttValue font référence aux spécifications d'attribut de l'élément], [Définition : pour chaque paire, le Name désigne le nom de l'attribut], et [Définition : le contenu de AttValue (le texte entre les délimiteurs ' ou ") désigne la valeur de l'attribut.] Notez que l'ordre des spécifications d'attribut dans une balise d'ouverture ou une balise d'élément vide n'est pas significatif.

Contrainte de mise en forme : Spécification unique de l'attribut

Un nom d'attribut NE DOIT PAS apparaître plus d'une fois dans la même balise d'ouverture ou la balise d'un élément vide.

Contrainte de validité : Type de valeur de l'attribut

L'attribut DOIT avoir été déclaré; la valeur DOIT correspondre au type déclaré pour cet attribut. (Pour les types d'attribut, voir 3.3 Déclarations de liste d'attributs.)

Contrainte de mise en forme : Pas de références d'entité externe

Les valeurs d'attributs NE DOIVENT PAS contenir directement ou indirectement des références d'entités vers des entités externes.

Contrainte de mise en forme : Pas de < dans les valeurs d'attribut

Le texte de remplacement de toute entité référencée directement ou indirectement dans une valeur d'attribut NE DOIVENT PAS contenir un <.

Exemple de balise d'ouverture :

<termdef id="dt-dog" term="dog">

[Définition : La fin de chaque élément qui commence par une balise d'ouverture DOIT être marqué d'une balise de fermeture contenant un nom qui renvoie au type de l'élément spécifié dans la balise d'ouverture :]

Balise de fermeture
[42]    ETag    ::=    '</' Name S? '>'

Exemple de balise de fermeture :

</termdef>

[Définition : Le texte entre la balise d'ouverture et la balise de fermeture est appelé contenu de l'élément :]

Contenu des éléments
[43]    content    ::=    CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*

[Définition : Un élément sans contenu est dit être vide.] La représentation d'un élément vide est une balise d'ouverture immédiatement suivie d'une balise de fermeture, ou une balise d'élément vide. [Définition : Une balise d'élément vide prends une forme spéciale :]

Balises pour éléments vides
[44]    EmptyElemTag    ::=    '<' Name (S Attribute)* S? '/>' [CF : Spécification unique de l'attribut]

Les balises d'élement vide peuvent être utilisées pour tout élément qui n'a pas de contenu, qu'il ait été déclaré ou non en utilisant le mot-clé EMPTY. À des fins d'interopérabilité, la balise d'élément vide DEVRAIT être utilisée, et DEVRAIT être utilisée seulement, pour les éléments qui ont été déclarés EMPTY.

Exemples d'éléments vides :

<IMG align="left"
 src="http://www.w3.org/Icons/WWW/w3c_home" />
<br></br>
<br/>

3.2 Déclarations de type d'élément

La structure d'un élément d'un document XML peut, à des fins de validation, être contrainte en utilisant les déclarations de type d'élément et de liste d'attributs. Une déclaration de type d'élément contraint le contenu de cet élément.

Les déclarations de type d'élément limitent habituellement les types d'élément qui peuvent apparaître comme fils de l'élément. Au choix de l'utilisateur, un processeur XML peut émettre un avertissement quand une déclaration mentionne un type d'élément pour lequel aucune déclaration n'est fournie, mais ceci ne constitue pas une erreur.

[Définition : Une déclaration de type d'élément prend la forme :]

Déclarations de type d'élément
[45]    elementdecl    ::=    '<!ELEMENT' S Name S contentspec S?'>' [CV : Unicité de la déclaration d'un type d'élément]
[46]    contentspec    ::=    'EMPTY' | 'ANY' | Mixed | children

où le Name indique le type d'élément déclaré.

Contrainte de validité : Unicité de la déclaration d'un type d'élément

Un type d'élément NE DOIT PAS être déclaré plus d'une fois.

Exemples de déclarations de type d'élément :

<!ELEMENT br EMPTY>
<!ELEMENT p (#PCDATA|emph)* >
<!ELEMENT %name.para; %content.para; >
<!ELEMENT container ANY>

3.2.1 Contenu d'élément

[Définition : Un type d'élément a un contenu élémentaire pur lorsque les éléments de ce type DOIVENT contenir uniquement des éléments fils, (pas de données textuelles), optionnellement séparés par de l'espace blanc (caractères correspondant au non-terminal S).] [Définition : Dans ce cas, la contrainte comprend un modèle de contenu, une grammaire simple régissant les types admis pour les éléments fils et l'ordre dans lequel ils peuvent apparaître.] La grammaire est construite à partir de particules de contenu (cp), constituées de noms, de listes de choix de particules de contenu, ou de listes de suites de particules de contenu :

Modèles de contenu d'élément
[47]    children    ::=    (choice | seq) ('?' | '*' | '+')?
[48]    cp    ::=    (Name | choice | seq) ('?' | '*' | '+')?
[49]    choice    ::=    '(' S? cp ( S? '|' S? cp )+ S? ')' [CV : Imbrication stricte des parenthèses dans une EP]
[50]    seq    ::=    '(' S? cp ( S? ',' S? cp )* S? ')' [CV : Imbrication stricte des parenthèses dans une EP]

où chaque Name est le type d'un élément qui peut apparaître comme un fils. Une particule de contenu dans une liste de choix peut apparaître dans le contenu élémentaire pur à l'endroit où une liste de choix apparaît dans la grammaire; les particules de contenu présentes dans une liste de suite DOIVENT toutes apparaître dans le contenu élémentaire pur dans l'ordre précisé dans la liste. Les caractères optionnels qui suivent un nom ou une liste déterminent si l'élément ou les particules de contenu dans la liste peuvent apparaître une fois ou plus (+), zéro fois ou plus (*), ou zéro ou une fois (?). L'absence d'un tel opérateur signifie que l'élément ou la particule de contenu DOIT apparaître exactement une fois. Cette syntaxe et sa signification sont identiques à celles utilisées dans les productions de cette spécification.

Le contenu d'un élément correspond à un modèle de contenu si et seulement si l'on peut tracer un chemin à travers le modèle de contenu, qui respecte les opérateurs de suite, de choix et de répétition et qui fait correspondre chaque élément du contenu à un type d'élément défini dans le modèle de contenu. À des fins de compatibilité, le fait qu'un modèle de contenu permet à un élément de correspondre avec plus d'une occurrence d'un type d'élément du modèle de contenu constitue une erreur. Pour de plus amples informations, voir E Modèles de contenu déterministes .

Contrainte de validité : Imbrication stricte des parenthèses dans une EP

Les parenthèses des textes de remplacement d'une entité paramètre DOIVENT être strictement imbriqués. Ceci signifie que si la parenthèse ouvrante ou fermante d'une production choice, seq, ou Mixed se retrouve dans le texte de remplacement d'une entité paramètre, ces deux parenthèses DOIVENT être contenues dans le même texte de remplacement.

À des fins d'interopérabilité, si une référence d'entité paramètre apparaît dans une construction choice, seq, ou Mixed son texte de remplacement DEVRAIT contenir au moins un caractère non blanc, et le premier et le dernier caractère non blanc du texte de remplacement ne DEVRAIENT pas être un connecteur (| ou ,).

Exemples de modèles de contenu d'élément :

<!ELEMENT spec (front, body, back?)>
<!ELEMENT div1 (head, (p | list | note)*, div2*)>
<!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*>

3.2.2 Contenu mixte

[Définition : Un type d'élément a un contenu mixte quand des éléments de ce type peuvent contenir des données textuelles, optionnellement, parsemés d'éléments fils.] Dans ce cas, les types des éléments fils peuvent être contraints, mais pas leur ordre ou leur nombre d'occurences :

Déclaration de contenu mixte
[51]    Mixed    ::=    '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
| '(' S? '#PCDATA' S? ')' [CV : Imbrication stricte des parenthèses dans une EP]
[CV : Unicité des types]

où les Name fournissent les types des éléments qui peuvent apparaître comme fils. Historiquement, le mot-clé #PCDATA dérive du terme « parsed character data. ».

Contrainte de validité : Unicité des types

Le même NE DOIT PAS apparaître plus d'une fois dans une seule déclaration de contenu mixte.

Exemples de déclarations de contenu mixte :

<!ELEMENT p (#PCDATA|a|ul|b|i|em)*>
<!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* >
<!ELEMENT b (#PCDATA)>

3.3 Déclarations de liste d'attributs

Les attributs sont utilisés pour associer des pairs nom-valeur avec des éléments. Les spécifications d'attribut NE DOIVENT PAS apparaître en dehors des balises d'ouvertures et des balises d'élément vide; ainsi, les productions utilisées pour les reconnaître apparaissent dans 3.1 Balises d'ouverture, balises de fermeture et balises d'élément vide. Les déclarations de liste d'attributs peuvent être utilisées pour :

  • définir un jeu d'attributs se rapportant à un type d'élément donné;

  • établir des contraintes de type pour ces attributs;

  • fournir des valeurs par défault pour des attributs.

[Définition : Les déclarations de liste d'attributs spécifient le nom, le type de données, et la valeur par défault (le cas échéant) de chaque attribut associé à un type d'élément donné :]

Déclaration de liste d'attributs
[52]    AttlistDecl    ::=    '<!ATTLIST' S Name AttDef* S? '>'
[53]    AttDef    ::=    S Name S AttType S DefaultDecl

Dans la règle AttlistDecl, Name est le type d'un élément. Au choix de l'utilisateur, un processeur XML PEUT envoyer un avertissement si des attributs sont déclarés pour un type d'élément non déclaré, mais ceci ne constitue pas une erreur. Dans la règle AttDef, Name est le nom de l'attribut.

Quand plus d'une AttlistDecl existe pour un type d'élément donné, le contenu de toutes les déclarations fournies est fusionnée. Quand plus d'une définition existe pour un même attribut d'un type d'élément donné, seule la première déclaration compte, les déclarations subséquentes sont ignorées. À des fins d'interopérabilité, les rédacteurs de la DTD peuvent choisir de fournir au plus une déclaration de liste d'attributs pour un type d'élément donné, au plus une définition d'attribut pour un nom d'attribut donné dans une déclaration de liste d'attributs et au moins une définition d'attribut dans chaque déclaration de liste d'attributs. À des fins d'interopérabilité, un processeur XML PEUT au gré de l'utilisateur envoyer un avertissement quand il existe plus d'une déclaration de liste d'attributs pour un type d'élément donné ou quand plus d'une définition d'attribut existe pour un attribut donné, mais ceci ne constitue pas une erreur.

3.3.1 Types d'attribut

Il existe trois sortes de types d'attribut XML : un type chaîne, un ensemble de types atomiques et des types énumérés. Le type chaîne peut prendre comme valeur toute chaîne littérale; les types atomiques sont plus limités. Les contraintes de validité notées dans la grammaire sont appliquées après que la valeur d'attribut ait été normalisée comme décrit dans 3.3.3 Normalisation de valeur d'attribut.

Types d'attribut
[54]    AttType    ::=    StringType | TokenizedType | EnumeratedType
[55]    StringType    ::=    'CDATA'
[56]    TokenizedType    ::=    'ID' [CV : ID]
[CV : Un seul ID par type d'élément]
[CV : Valeur par défault de l'attribut ID]
| 'IDREF' [CV : IDREF]
| 'IDREFS' [CV : IDREF]
| 'ENTITY' [CV : Nom d'entité]
| 'ENTITIES' [CV : Nom d'entité]
| 'NMTOKEN' [CV : Atome nomimal]
| 'NMTOKENS' [CV : Atome nomimal]

Contrainte de validité : ID

Les valeurs de type ID DOIVENT correspondre à la production Name. Un nom NE DOIT PAS apparaître plus d'une fois dans un document XML comme une valeur de ce type, c.-à-d. les valeurs ID DOIVENT identifier uniquement les éléments qui les portent.

Contrainte de validité : Un seul ID par type d'élément

Un type d'élément NE DOIT PAS spécifié plus d'un attribut ID.

Contrainte de validité : Valeur par défault de l'attribut ID

Un attribut ID DOIT avoir pour valeur par défault déclarée #IMPLIED ou #REQUIRED.

Contrainte de validité : IDREF

Les valeurs de type IDREF DOIVENT correspondre à la production Name, et les valeurs de type IDREFS doivent correspondre à la production Names; chaque Name DOIT correspondre à la valeur d'un attribut ID d'un élément du document XML; c.-à-d. les valeurs IDREF DOIVENT correspondre à la valeur d'un attribut ID.

Contrainte de validité : Nom d'entité

Les valeurs de type ENTITY DOIVENT correspondre à la production Name, les valeurs de type ENTITIES DOIVENT correspondre à la production Names; chaque Name DOIT correspondre au nom d'une entitée non analysable déclarée dans la DTD.

Contrainte de validité : Atome nomimal

Les valeurs de type NMTOKEN DOIVENT correspondre à la production Nmtoken; les valeurs de type NMTOKENS DOIVENT correspondre à la production Nmtokens.

[Définition : Les attributs énumérés peuvent prendre une valeur parmi une liste de valeurs fournie dans la déclaration.] Ils DOIVENT prendre l'une de ces valeurs. Il existe deux sortes de types d'attributs énumérés :

Types d'attributs énumérés
[57]    EnumeratedType    ::=    NotationType | Enumeration
[58]    NotationType    ::=    'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [CV : Attributs de notation]
[CV : Une notation par type d'élément]
[CV : Pas de notation sur l'élément vide]
[CV : Tokens unique]
[59]    Enumeration    ::=    '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [CV : Énumération]
[CV : Tokens unique]

Un attribut NOTATION identifie une notation, déclarée dans la DTD conjointement avec ses identificateurs systèmes et publics, que l'on utilisera pour interpréter l'élément auquel l'attribut est joint.

Contrainte de validité : Attributs de notation

Les valeurs de ce type DOIVENT correspondre à un des noms de notation inclus dans la déclaration; tous les noms de notation dans la déclaration DOIVENT être déclarés.

Contrainte de validité : Une notation par type d'élément

Un type d'élément NE DOIT PAS avoir plus d'un attribut NOTATION spécifié.

Contrainte de validité : Pas de notation sur l'élément vide

À des fins de compatibilité, un attribut de type NOTATION NE DOIT PAS être déclaré sur un élément déclaré EMPTY.

Contrainte de validité : Tokens unique

Les noms de notation dans une seule déclaration d'attribut de NotationType, aussi bien que les NmToken dans une seule déclaration d'attribut d'Enumeration, DOIVENT tous être distincts.

Contrainte de validité : Énumération

Les valeurs de ce type DOIVENT correspondre à un des atomes Nmtoken dans la déclaration.

À des fins d'intéropérabilité, le même Nmtoken NE DEVRAIT PAS apparaître plus d'une fois dans les types d'attribut énuméré d'un seul type d'élément.

3.3.2 Attribut par défaut

Une déclaration d'attribut fournit une information indiquant si la présence de l'attribut est REQUISE, et si non, comment un processeur XML réagit si un attribut déclaré est absent d'un document.

Attribut par défaut
[60]    DefaultDecl    ::=    '#REQUIRED' | '#IMPLIED'
| (('#FIXED' S)? AttValue) [CV : Attribut obligatoire]
[CV : Valeur par défaut d'un attribut syntaxiquement correct]
[CF : Pas de < dans les valeurs d'attribut]
[CV : Valeur par défaut fixe d'un attribut]
[CF : Pas de références d'entité externe]

Dans une déclaration d'attribut, #REQUIRED signifie que l'attribut DOIT toujours être fourni, #IMPLIED qu'aucune valeur par défaut n'est fournie. [Définition : Si la déclaration n'est pas #REQUIRED ou #IMPLIED, alors la valeur AttValue contient la valeur par défault déclarée; le mot-clé #FIXED indique que l'attribut DOIT toujours avoir la valeur par défaut. Lorsque le processeur XML rencontre un élément sans spécification pour un attribut pour lequel il a lu une déclaration de valeur par défaut; alors il DOIT rapporter à l'application, l'attribut avec la valeur par défaut déclarée.]

Contrainte de validité : Attribut obligatoire

Si la déclaration par défaut est le mot-clé #REQUIRED, alors l'attribut DOIT être spécifié pour tous les éléments du type dans la déclaration de la liste d'attributs.

Contrainte de validité : Valeur par défaut d'un attribut syntaxiquement correct

La valeur par défaut déclarée DOIT satisfaire aux contraintes syntaxiques du type d'attribut déclaré. C'est-à-dire, la valeur par défaut d'un attribut :

  • de type IDREF ou ENTITY doit correspondre à la production Name;

  • de type IDREFS ou ENTITIES doit correspondre à la production Names;

  • de type NMTOKEN doit correspondre à la production Nmtoken;

  • de type NMTOKENS doit correspondre à la production Nmtokens;

  • d'un type énuméré (soit un type NOTATION ou une Enumeration) doit correspondre à une des valeurs énumérées.

Notez que seules les contraintes syntaxiques du type sont requises ici; d'autres contraintes (p. ex. comme la valeur soit le nom d'une entité non analysable déclarée, pour un attribut de type ENTITY) seront rapportés par un analyseur validant seulement si un élément sans spécification pour cet attribut apparaît réellement.

Contrainte de validité : Valeur par défaut fixe d'un attribut

Si un attribut a une valeur par défaut déclarée avec le mot-clé #FIXED, les instances de cet attribut DOIVENT correspondre à la valeur par défaut.

Exemples de déclarations de liste d'attributs :

<!ATTLIST termdef
          id      ID      #REQUIRED
          name    CDATA   #IMPLIED>
<!ATTLIST list
          type    (bullets|ordered|glossary)  "ordered">
<!ATTLIST form
          method  CDATA   #FIXED "POST">

3.3.3 Normalisation de valeur d'attribut

Avant que la valeur d'un attribut ne soit passée à l'application ou avant de vérifier sa validité, le processeur XML DOIT normaliser la valeur de l'attribut en appliquant l'algorithme suivant, ou en utilisant une autre méthode de sorte que la valeur passée à l'application soit la même que celle produite par l'algorithme.

  1. tous les sauts de ligne DOIVENT avoir été normalisé en entrée en #xA comme décrit dans 2.11 Traitement des fins de ligne, alors le reste de cet algorithme opéra sur un texte normalisé de cette façon.

  2. Commencer avec une valeur normalisée constituée de la chaîne vide.

  3. Pour chaque caractère, référence d'entité, ou référence de caractère de la valeur d'attribut non normalisée, commencer au début et continuer jusqu'à la fin, de faire :

    Pour une référence de caractère, ajouter le caractère référencé à la valeur normalisée.

    Pour une référence d'entité, appliquer récursivement l'étape 3 de cet algorithme au texte de remplacement de l'entité.

    Pour un caractère espace blanc (#x20, #xD, #xA, #x9), ajouter un caractère espace (#x20) à la valeur normalisée.

    Pour les autres caractères, ajouter le caractère à la valeur normalisée.

Si le type d'attribut n'est pas CDATA, alors le processeur XML DOIT en plus traiter la valeur normalisée de l'attribut en éliminant tous caractères espace (#x20) de tête et de queue, et en replaçant les suites de caractères espace (#x20) par un seul caractère espace (#x20).

Notez que si la valeur d'attribut non normalisée contient une référence de caractère à un caractère espace blanc autre que l'espace (#x20), la valeur normalisée contient le caractère référencé lui-même (#xD, #xA ou #x9). Ce cas diffère du cas où la valeur non normalisée contient un caractère espace blanc (pas une référence), qui est remplacé par un caractère espace (#x20) dans la valeur normalisée et diffère aussi du cas où la valeur non normalisée contient une référence d'entité dont le texte de remplacement contient un caractère espace; étant traitées récursivement, le caractère espace blanc est remplacé par un caractère espace (#x20) dans la valeur normalisée.

Tous attributs pour lesquels aucune déclaration n'a été lu DEVRAIENT être traités par un processeur non-validant comme s'ils avaient été déclarés CDATA.

Lorsqu'une valeur d'attribut contient une référence à une entité pour laquelle aucune déclaration n'a été lue alors c'est une erreur.

Voici des exemples de normalisation d'attribut. Étant donné les déclarations suivantes :

<!ENTITY d "&#xD;">
<!ENTITY a "&#xA;">
<!ENTITY da "&#xD;&#xA;">

les spécifications d'attribut dans la colonne de gauche ci-dessous seraient normalisées en suites de caractères de la colonne du milieux si l'attribut a est déclaré NMTOKENS et à celles de la colonne de droite if a est déclaré CDATA.

Spécification d'attribut a est NMTOKENS a est CDATA
a="xyz"
x y z
#x20 #x20 x y z
a="&d;&d;A&a;&#x20;&a;B&da;"
A #x20 B
#x20 #x20 A #x20 #x20 #x20 B #x20 #x20
a="&#xd;&#xd;A&#xa;&#xa;B&#xd;&#xa;"
#xD #xD A #xA #xA B #xD #xA
#xD #xD A #xA #xA B #xD #xA

Notez que le dernière exemple est invalide (mais bien formé) si a est déclaré pour être de type NMTOKENS.

3.4 Sections conditionnelles

[Définition : Les sections conditionnelles sont des portions du sous-ensemble externe de la déclaration de type de document ou des entités paramètres externes qui sont incluses dans, ou excluses de, la structure logique de la DTD suivant le mot-clé qui les régissent.]

Section conditionnelle
[61]    conditionalSect    ::=    includeSect | ignoreSect
[62]    includeSect    ::=    '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>' [CV : Imbrication correcte de section conditionnelle et EP]
[63]    ignoreSect    ::=    '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>' [CV : Imbrication correcte de section conditionnelle et EP]
[64]    ignoreSectContents    ::=    Ignore ('<![' ignoreSectContents ']]>' Ignore)*
[65]    Ignore    ::=    Char* - (Char* ('<![' | ']]>') Char*)

Contrainte de validité : Imbrication correcte de section conditionnelle et EP

Si l'une des chaînes "<![", "[", ou "]]>" d'une section conditionnelle est contenue dans le texte de remplacement d'une référence d'entité paramétrée, chacune d'entre elles DOIT être contenue dans le même texte de remplacement.

Comme les sous-ensembles interne et externe de la DTD, une section conditionnelle peut contenir une ou plusieurs déclarations complètes, des commentaires, des instructions de traitement ou des sections conditionnelles imbriquées, entremêlées avec des espaces blancs.

Si le mot-clé d'une section conditionnelle est INCLUDE, alors le contenu de la section conditionnelle DOIT être traitée comme une partie de la DTD. Si le mot-clé de la section conditionnelle est IGNORE alors le contenu de la section conditionnelle NE DOIT PAS être traitée comme une partie de la DTD. Si une section conditionnelle marquée du mot-clé INCLUDE se trouve dans une section conditionnelle plus importante avec un mot-clé IGNORE, les sections conditionnelles intérieure et extérieure DOIVENT être ignorées. Le contenu d'une section conditionnelle ignorée DOIT être analysé en ignorant tous caractères après le "[" suivant le mot-clé, excepter une section conditionnelle qui commence par "<![" et se termine par "]]>", jusqu'à ce que la fin de la section conditionnelle correspondante soit trouvée. Les références d'entité paramètre NE DOIVENT PAS être reconnues par ce traitement.

Si le mot-clé d'une section conditionnelle est une référence d'entité paramètre, l'entité paramètre DOIT être remplacée par son contenu avant que le processeur ne décide s'il doit inclure ou ignorer la section conditionnelle.

Un exemple :

<!ENTITY % draft 'INCLUDE' >
<!ENTITY % final 'IGNORE' >

<![%draft;[
<!ELEMENT book (comments*, title, body, supplements?)>
]]>
<![%final;[
<!ELEMENT book (title, body, supplements?)>
]]>

4 Structures physiques

[Définition : Un document XML peut être constitué d'une ou plusieurs unités de stockage. Ces unités sont appelées entités; elles ont toutes un contenu et sont toutes identifiées par un nom d'entité (à l'exception de l'entité document et du sous-ensemble externe de la DTD).] Chaque document XML possède une entité appelée entité document, qui sert de point de départ pour le processeur XML et peut contenir tout le document.

Une entité peut être analysable ou non analysable. [Définition : Le contenu d'une entité analysable est considéré comme étant son texte de remplacement; ce texte est considéré comme partie intégrante du document.]

[Définition : Une entité non analysable est une resource dont le contenu peut ou peut ne pas être du texte, et s'il s'agit de texte, peut ne pas être du XML.] À chaque entité non-analysable a été associée une notation, identifiée par un nom. Au-delà de l'exigence qu'un processeur XML crée les identificateurs pour l'entité et la notation est mise à la disposition de l'application, le XML n'impose pas de contraintes sur le contenu des entités non-analysables.

Les entités analysables sont appelées par leur nom en utilisant des références d'entité; les entités non-analysables par leur nom, donné par la valeur des attributs de type ENTITY ou ENTITIES.

[Définition : Les entités générales sont des entités utilisées dans le contenu du document. Dans cette spécification, les entités générales sont parfois désignées par le terme non qualifié d'entité lorsque cette simplification n'implique pas d'ambiguïté.] [Définition : Les entités paramètres sont des entités analysables utilisées dans la DTD.] Ces deux types d'entités utilisent différentes formes de références et sont reconnus dans des contextes différents. De plus, ils occupent des espaces de noms distincts; une entité paramètre et une entité générale de même nom sont deux entités distinctes.

4.1 Références de caractère et d'entité

[Définition : Une référence de caractère fait référence à un caractère particulier du jeu de caractères ISO/CEI 10646, par exemple un caractère inaccessible directement à l'aide d'un clavier.]

Référence de caractère
[66]    CharRef    ::=    '&#' [0-9]+ ';'
| '&#x' [0-9a-fA-F]+ ';' [CF : Caractère admissible]

Contrainte de mise en forme : Caractère admissible

Les caractères référés en utilisant des références de caractère DOIVENT correspondre à la production Char.

Si une référence de caractère commence par « &#x », alors les chiffres et les lettres, jusqu'au terminateur ;, fournissent une représentation hexadécimale du point de code du caractère dans l'ISO/CEI 10646. Si elle commence seulement par « &# », alors les chiffres jusqu'au terminateur ;, fournissent une représentation décimale du point de code du caractère.

[Définition : Une référence d'entité fait référence au contenu d'une entité nommée.] [Définition : Les délimiteurs des références à des entités générales analysables sont l'esperluette (&) et le point-virgule (;).] [Définition : Les délimiteurs des références d'entités paramètres sont le caractère pour cent (%) et le point-virgule (;).]

Référence d'entité
[67]    Reference    ::=    EntityRef | CharRef
[68]    EntityRef    ::=    '&' Name ';' [CF : Entité déclarée]
[CV : Entité déclarée]
[CF : Entité analysable]
[CF : Pas de récursion]
[69]    PEReference    ::=    '%' Name ';' [CV : Entité déclarée]
[CF : Pas de récursion]
[CF : Dans la DTD]

Contrainte de mise en forme : Entité déclarée

Dans un document dépourvu de DTD, un document avec seulement un sous-ensemble interne de la DTD ne contenant pas de référence d'entité paramètre, ou un document avec « standalone='yes' », pour une référence d'entité qui n'a pas d'occurence dans le sous-ensemble externe ou d'entité paramètre, le Name donné dans la référence d'entité DOIT correspondre au nom d'une déclaration d'entité apparaissant ailleurs que dans le sous-ensemble externe ou dans une entité paramètre, toutefois, les documents bien formés n'ont pas besoin de déclarer les entités suivantes : amp, lt, gt, apos, quot. La déclaration d'une entité générale DOIT précéder toute référence à celle qui apparaisent dans une valeur par défaut d'une déclaration de liste d'attributs.

Notez que les processeurs non-validant ne sont pas obliger de lire et de traiter les déclarations d'entité apparaissant dans les entités paramètre ou dans le sous-ensemble externe; pour de tels documents, la règle suivant laquelle une entité doit être déclarée est une contrainte de forme seulement si standalone='yes'.

Contrainte de validité : Entité déclarée

Dans un document avec un sous-ensemble externe ou des références d'entités paramètres, si le document n'est pas autonome (si « standalone='no' » est spécifié ou s'il n'existe pas de déclaration standalone), alors le Name donné dans la référence DOIT correspondre à une déclaration d'entité. À des fins d'interopérabilité, les documents valides DEVRAIENT déclarer les entités amp, lt, gt, apos, quot, sous la forme précisée dans 4.6 Entités prédéfinies. La déclaration d'une entité paramètre DOIT précéder toute référence à celle-ci. De même, la déclaration d'une entité générale DOIT précéder toute déclaration de liste d'attributs contenant une valeur par défaut avec une référence directe ou indirecte à l'entité générale.

Contrainte de mise en forme : Entité analysable

Une référence d'entité NE DOIT PAS contenir le nom d'une entité non-analysable. Les entités non-analysables peut être référées seulement dans les valeurs d'attribut déclarées de type ENTITY ou ENTITIES.

Contrainte de mise en forme : Pas de récursion

Une entité analysable NE DOIT PAS contenir une référence, directement ou indirectement, récursive à elle-même.

Contrainte de mise en forme : Dans la DTD

Les références d'entité paramètre NE DOIVENT PAS apparaître en dehors de la DTD.

Exemples de références de caractère et de références d'entité :

Type <key>less-than</key> (&#x3C;) to save options.
This document was prepared on &docdate; and
is classified &security-level;.

Exemple de références d'entité paramètre :

<!-- declare the parameter entity "ISOLat2"... -->
<!ENTITY % ISOLat2 SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
<!-- ... now reference it. -->
%ISOLat2;

4.2 Déclarations d'entités

[Définition : Les entités sont déclarées de la façon suivante :]

Déclarations d'entités
[70]    EntityDecl    ::=    GEDecl | PEDecl
[71]    GEDecl    ::=    '<!ENTITY' S Name S EntityDef S?'>'
[72]    PEDecl    ::=    '<!ENTITY' S '%' S Name S PEDef S? '>'
[73]    EntityDef    ::=    EntityValue | (ExternalID NDataDecl?)
[74]    PEDef    ::=    EntityValue | ExternalID

Le Name identifie l'entité dans une référence d'entité ou, dans le cas d'une entité non-analysable, dans la valeur d'un attribut de type ENTITY ou ENTITIES. Si une même entité est déclarée plus d'une fois, seule la première déclaration rencontrée est liée; au gré de l'utilisateur, un processeur XML PEUT alors émettre un avertissement si des entités sont déclarées plusieurs fois.

4.2.1 Entités internes

[Définition : Si la définition d'entité est EntityValue, l'entité ainsi définie est appelée entité interne. Il n'y a pas d'objet physique stocké séparément, et le contenu de l'entité est donné dans la déclaration.] Notez que certains traitements d'entité et de références de caractère dans la valeur littérale d'entité peut être requise pour produire le texte de remplacement correct : voir 4.5 Construction du texte de remplacement d'une entité.

Une entité interne est une entité analysable.

Exemple de déclaration d'entité interne :

<!ENTITY Pub-Status "This is a pre-release of the specification.">

4.2.2 Entités externes

[Définition : Si l'entité n'est pas interne, il s'agit d'une entité externe, déclarée comme suit :]

Déclaration d'entité externe
[75]    ExternalID    ::=    'SYSTEM' S SystemLiteral
| 'PUBLIC' S PubidLiteral S SystemLiteral
[76]    NDataDecl    ::=    S 'NDATA' S Name [CV : Notation déclarée]

Si la déclaration NDataDecl est présente, il s'agit d'une entité non-analysable générale; autrement il s'agit d'une entité analysable.

Contrainte de validité : Notation déclarée

Le Name DOIT correspondre au nom déclaré d'une notation.

[Définition : La production SystemLiteral est appelée identificateur système de l'entité. Elle est destinée à être convertie en une référence d'URI (telle que définie dans [IETF RFC 3986]), dans le cadre du processus de déréférencement, pour obtenir l'entrée que le processeur XML utilisera poour construire le texte de remplacement de l'entité.] Un processeur XML peut signaler une erreur si un identificateur de système contient un identificateur de fragment (commençant avec un caractère #). Sauf indication contraire fournit par une information en dehors du champ d'application de cette spécification (p. ex. un type d'élément XML spécial défini dans une DTD particulière, ou une instruction de traitement définie par la spécification d'une application particulière), les URI relatifs sont relatifs à l'emplacement de la ressource dans laquelle la déclaration d'entité se trouve. Ceci est défini comme étant l'entité externe contenant le '<' qui commence la déclaration, au point où c'est analysé comme une déclaration. Un URI peut donc être relatif à l'entité document, à l'entité contenant le sous-ensemble externe de la DTD, ou à une quelconque entité paramètre externe. Les tentatives de récupération de la ressource identifiée par un URI peuvent être redirigées au niveau de l'analyseur (par exemple, dans un résolveur d'entité) ou à un niveau plus bas (au niveau du protocole, par exemple, via un en-tête HTTP Location:). En l'abscence d'informations supplémentaires en dehors du champ d'application de cette spécification à l'intérieur de la ressource, l'URI de base d'une ressource est toujours l'URI de la ressource courante retournée. En d'autres termes, il s'agit de l'URI de la ressource récupérée après que toute redirection se soit produite.

Les identificateurs systèmes (et d'autres chaînes XML destinées à être utilisées comme références d'URI) peuvent contenir des caractères qui, en accord avec [IETF RFC 3986], doivent être échappés avant une URI peut être utilisée pour récupérer la ressource référencée. Les caractères à échapper sont les caractères de contrôle, de #x0 à #x1F et #x7F, (dont la plupart ne peuvent pas apparaître dans le XML), l'espace #x20, les délimiteurs '<' #x3C, '>' #x3E et '"' #x22, les caractères imprudents '{' #x7B, '}' #x7D, '|' #x7C, '\' #x5C, '^' #x5E et '`' #x60, ainsi que tous les caractères au-dessus de #x7F. Puisque l'échappenent n'est pas toujours un traitement entièrement réversible, il DOIT être effectuer seulement lorsqu'il est absolument nécessaire et aussi tard que possible dans une chaîne de traitement. En particulier, ni le processus de conversion d'une URI relative en une URI absolue, ni le processus de passage d'une référence d'URI à un processus ou un composant logiciel chargé de déréférencement ne DEVRAIT déclencher l'échappement. Lorsque l'échappement se produit, il DOIT être réalisé comme suit :

  1. Chaque caractère a échappé est représenté sous la forme [Unicode] d'un ou plusieurs octets en UTF-8.

  2. Les octets résultant sont échappés selon le mécanisme de transformation d'URI (c'est-à-dire, en convertissant chaque octet en % HH, où HH est la notation hexadécimale de la valeur de l'octet).

  3. Le caractère d'origine est remplacé par la séquence de caractères résultante.

Note :

Dans une prochaine édition de cette spécification, le Groupe de travail XML Core a l'intention de remplacer le paragraphe précédent et la liste des étapes par une référence à une prochaine révision de l'IETF RFC 3987, qui définira "Legacy Extended IRIs (LEIRIs)". Lorsque cette révision sera disponible, l'intention du GT XML Core est de l'utiliser pour remplacer ce qui précède par un langage similaire, dans toutes les futures révisions des spécifications liées au XML relevant de sa compétence.

[Définition : En plus d'un identificateur système, un identificateur externe peut contenir un identificateur public.] Un processeur XML qui tente de récupérer le contenu de l'entité may utiliser toute combinaison des identificateurs public et système ainsi que des informations supplémentaires en dehors du champ de cette spécification pour essayer de générer une référence URI de remplacement. Si le processeur n'est pas en mesure de le faire, il DOIT utiliser la référence d'URI spécifiée par l'identificateur système. Avant qu'une correspondance soit tentée, toutes chaîne d'espaces blancs dans l'identificateur public DOIVENT être normalisé en de simples caractères espaces (#x20), et l'espace blanc de tête et de queue DOIT être éliminé.

Exemples de déclaration d'entité externe :

<!ENTITY open-hatch
         SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY open-hatch
         PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN"
         "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY hatch-pic
         SYSTEM "../grafix/OpenHatch.gif"
         NDATA gif >

4.3 Entités analysables

4.3.1 La déclaration de texte

Les entités analysables externes DEVRAIENT commencer par une déclaration de texte.

Déclaration de texte
[77]    TextDecl    ::=    '<?xml' VersionInfo? EncodingDecl S? '?>'

La déclaration de texte DOIT être fournie littéralement, et non pas par une référence d'une entité analysable. La déclaration de texte NE DOIT PAS apparaître à une autre position que le commencement d'une entité analysable externe. La déclaration de texte dans une entité analysable externe n'est pas considérée comme faisant partie de son texte de remplacement.

4.3.2 Entités analysables bien formées

L'entité document est bien formée si elle correspond à la production étiquetée document. Une entité générale analysable externe est bien formée si elle correspond à la production étiquetée extParsedEnt. Toutes les entités paramètres externes sont bien formées par définition.

Note :

Seules les entités analysables qui sont référencées directement ou indirectement dans le document doivent être bien formées.

Entités analysables bien formées
[78]    extParsedEnt    ::=    TextDecl? content

Une entité générale analysable interne est bien formée si son texte de remplacement correspond à la production étiquetée content. Toute entité paramètre interne est bien formée par définition.

Il découle du caractère bien formé des entités générales que les structures logique et physique d'un document XML s'imbriquent proprement; aucun balise d'ouverture, balise de fermeture, balise d'élément vide, élément, commentaire, instruction de traitement, référence de caractère, ou référence d'entité ne peut commencer dans une entité et se terminer dans une autre.

4.3.3 Codage des caractères dans les entités

Chaque entité analysable externe d'un document XML peut utiliser un codage différent pour ses caractères. Tous les processeurs XML DOIVENT être capable de lire les entités codées en UTF-8 et en UTF-16. Les termes « UTF-8 » et « UTF-16 » de cette spécification ne s'appliquent pas aux relatif au codages de caractères, y compris mais non limités à UTF-16BE, UTF-16LE, ou CESU-8.

Les entités codées en UTF-16 DOIVENT et les entités codées en UTF-8 MAY commencer par une marque d'ordre d'octets décrite dans l'annexe H de [ISO/IEC 10646:2000], section 16.8 de [Unicode] (le caractère ZERO WIDTH NO-BREAK SPACE, #xFEFF). La marque est une signature de codage et ne fait partie ni du balisage ni des données textuelles du document XML. Les processeurs XML DOIVENT être capables d'utiliser ce caractère pour distinguer les documents codés en UTF-8 et en UTF-16.

Si le texte de remplacement d'une entité externe commence avec le caractère U+FEFF, et qu'aucune déclaration de texte n'est présente, alors une marque d'ordre d'octets DOIT être présente, si l'entité est codées en UTF-8 ou UTF-16.

Bien que seul le soutien des codages UTF-8 et UTF-16 ne soit requis des processeurs XML, il est reconnu que d'autres codages sont utilisés à travers le monde, et il peut être souhaitable que les processeurs XML puissent lire les entités qui les utilisent. En absence d'information de codage de caractères externes (comme des en-têtes MIME), les entités analysables qui sont stockées dans un codage autre qu'UTF-8 ou UTF-16 DOIVENT commencer par une déclaration de texte (voir 4.3.1 La déclaration de texte) contenant une déclaration de codage :

Déclaration de codage
[80]    EncodingDecl    ::=    S 'encoding' Eq ('"' EncName '"' | "'" EncName "'" )
[81]    EncName    ::=    [A-Za-z] ([A-Za-z0-9._] | '-')* /* Encoding name contains only Latin characters */

Dans l'entité document, la déclaration de codage se trouve dans la déclaration XML. EncName est le nom du codage utilisé.

Dans une déclaration de codage, les valeurs « UTF-8 », « UTF-16 », « ISO-10646-UCS-2 », et « ISO-10646-UCS-4 » DEVRAIENT être utilisées pour les divers codages et transformations d'Unicode / ISO/CEI 10646, les valeurs « ISO-8859-1 », « ISO-8859-2 », ... « ISO-8859- n » (où n est un nombre) DEVRAIENT être utilisées pour les parties de l'ISO 8859, et les valeurs « ISO-2022-JP », « Shift_JIS », et « EUC-JP » DEVRAIENT être utilisées pour les diverses formes de codage de JIS X-0208-1997. Il est RECOMMANDE que les codages de caractères enregistrés (comme charset) par l'Internet Assigned Numbers Authority [IANA-CHARSETS], autres que ceux listés ci-dessus, soient désignés en utilisant leurs noms enregistrés; les autres codages DEVRAIENT utilisent des noms commençant par un préfixe « x- ». Les processeurs XML DEVRAIENT évaluer les correspondances de noms de codages de caractères sans égard à la casse et DEVRAIENT interpréter un nom de codage enregistrés par l'IANA soit comme le codage enregistré à l'IANA à ce nom, soit le traité comme inconnu (les processeurs ne sont, bien sûr, pas tenu de reconnaître tous les codages enregistrés à l'IANA).

En l'absence d'information fournie par un protocole de transport externe (p. ex. HTTP ou MIME), C'est une erreur fatale qu'une entité comportant une déclaration de codage soit présentée au processeur XML dans un codage différent de celui mentionné dans la déclaration, ou qu'une entité ne commence pas par une marque d'ordre d'octets ou ne contienne pas de déclaration de codage à utiliser un codage autre que UTF-8 Notez que l'ASCII étant un sous-ensemble d'UTF-8, les entités ASCII n'ont strictement pas besoin d'une déclaration de codage.

Une TextDecl qui apparaît ailleurs qu'au début d'une entité externe est une erreur fatale.

Une erreur fatale doit être signalée lorsqu'un processeur XML rencontre une entité utilisant un codage qu'il est incapable de traiter. C'est une erreur fatale si une entité XML est déterminée (par défaut, via une déclaration de codage, ou un protocole de haut niveau) pour être dans un certain codage mais contient des séquences d'octets qui ne sont pas légales dans ce codage. En particulier, c'est une erreur fatale si une entité codée en UTF-8 contient des séquences d'unités de code ou mal formées telles que définies dans la section 3.9 de Unicode [Unicode] . À moins qu'un codage ne soit déterminé par un protocole de haut niveau, c'est aussi une erreur fatale si une entité XML ne contient pas de déclaration de codage et son contenu n'est pas légal en UTF-8 ou UTF-16.

Exemples de déclarations de texte contenant une déclaration de codage :

<?xml encoding='UTF-8'?>
<?xml encoding='EUC-JP'?>

4.4 Traitement des entités et des références par un processeur XML

Le tableau ci-dessous résume les contextes dans lesquels les références de caractère, les références d'entité, et les invocations à des entités non-analysables peuvent se produire, ainsi que le comportement REQUIS d'un processeur XML dans chaque cas. Les étiquettes de la colonne la plus à gauche décrivent le contexte de reconnaissance :

Référence dans le contenu

une référence n'importe où après la balise d'ouverture et avant la balise de fermeture d'un élément; correspond au non-terminal contenu.

Référence dans une valeur d'attribut

une référence dans la valeur d'un attribut dans une balise ouvrante, ou dans une valeur par défaut dans une déclaration d'attribut; correspond au non-terminal AttValue.

Valeur d'attribut

un Name, et non pas une référence, apparaissant comme la valeur d'un attribut qui a été déclaré de type ENTITY, ou comme un des membres (séparés par des espaces) de la valeur d'un attribut qui a été déclaré de type ENTITIES.

Référence dans une valeur d'entité

une référence dans la valeur littérale d'entité d'une entité paramètre ou interne dans la déclaration d'entité correspond au non-terminal EntityValue.

Référence dans la DTD

une référence dans les sous-ensembles interne ou externe de la DTD, mais en-dehors de EntityValue, AttValue, PI, Comment, SystemLiteral, PubidLiteral, ou du contenu d'une section conditionnelle ignorée (voir 3.4 Sections conditionnelles).

Type d'entité Caractère
Paramètre Interne générale Externe analysable générale Non-analysable
Référence dans le contenu Non reconnu Inclus Inclus si validation Interdit Inclus
Référence dans une valeur d'attribut Non reconnu Inclus dans littéral Interdit Interdit Inclus
Apparaît comme valeur d'attribut Non reconnu Interdit Interdit Signalé Non reconnu
Référence dans EntityValue Inclus dans littéral Non interprété Non interprété Erreur Inclus
Référence dans la DTD Inclus comme EP Interdit Interdit Interdit Interdit

4.4.1 Non reconnu

En dehors de la DTD, le caractère % n'a pas de signification particulière; ainsi, ce qui seraient des références d'entité paramètre dans la DTD ne sont pas reconnus comme balisage dans le contenu. De même, les noms des entités non-analysables ne sont pas reconnus excepter lorsqu'ils apparaissent dans la valeur d'un attribut déclarées de manière appropriée.

4.4.2 Inclus

[Définition : Une entité est incluse quand son texte de remplacement est récupéré et traité, à la place de la référence elle-même, comme s'il était une partie du document à l'endroit où la référence est reconnue.] Le texte de remplacement peut contenir des données textuelles et du balisage (excepter pour les entités paramètres) qui DOIVENT être reconnus de la manière habituelle. (La chaîne de caractères « AT&amp;T; » se développe en « AT&T; » et l'esperluette restante n'est pas reconnue comme un délimiteur de référence d'entité.) Une référence de caractère est incluse quand le caractère indiqué est traité à la place de la référence elle-même.

4.4.3 Inclus si validation

Lorsqu'un processeur XML reconnait une référence à une entité analysable, afin de valider le document, le processeur DOIT inclure son texte de remplacement. Si l'entité est externe, et si le processeur n'a pas l'intention de valider le document XML, le processeur PEUT, mais pas nécessairement, inclure le texte de remplacement de l'entité. Si un processeur non-validant n'inclus pas le texte de remplacement, il DOIT informer l'application qu'il a reconnu l'entité, mais ne l'a pas lu.

Cette règle est motivée par le fait que l'inclusion automatique fournit par le mécanisme d'entité du SGML et du XML, conçu avant tout pour faciliter la modularité lors de la rédaction, n'est pas nécessairement approprié pour d'autres applications, en particulier le document de navigation. Par exemple, lorsqu'un navigateur rencontre une référence d'entité analysable externe, il pourrait choisir de fournir une indication visuelle de la présence de l'entité et la récupérer pour l'affichage uniquement sur demande.

4.4.4 Interdit

Les formes suivantes sont interdites, et constituent des erreurs fatales :

  • L'apparition d'une référence à une entité non-analysable, excepter dans la EntityValue d'une déclaration d'entité;

  • L'apparition de tout caractère ou de référence d'entité générale dans la DTD, excepter à l'intérieur d'une EntityValue ou d'une AttValue.

  • Une référence d'entité externe dans une valeur d'attribut.

4.4.5 Inclus dans littéral

Lorsqu'une référence d'entité apparaît dans une valeur d'attribut, ou lorsqu'une référence d'entité paramètre apparaît dans une valeur littérale d'entité, son texte de remplacement DOIT être traité à la place de la référence elle-même comme s'il se trouvait dans le document à l'emplacement où la référence a été reconnue, excepter que les caractères guillemet simple et double dans le texte de remplacement DOIVENT toujours être traités comme un caractère de données normal et ne NE DOIVENT PAS terminer le littéral. L'exemple qui suit est bien formé :

<!ENTITY % YN '"Yes"' >
<!ENTITY WhatHeSaid "He said %YN;" >

alors que celui-ci ne l'est pas :

<!ENTITY EndAttr "27'" >
<element attribute='a-&EndAttr;>

4.4.6 Signalé

Quand le nom d'une entité non-analysable apparaît comme un token dans la valeur d'un attribut de type déclaré ENTITY ou ENTITIES, un processeur validant DOIT informer l'application des identificateurs système et public (le cas échéant) de l'entité et de sa notation associée.

4.4.7 Non interprété

Lorsqu'une référence d'entité générale se trouve dans la EntityValue d'une déclaration d'entité, il ne DOIT pas interprété et est laissé tel quel.

4.4.8 Inclus comme EP

Tout comme avec les entités analysables externes, les entités paramètres doivent être incluses lors de la validation uniquement. Lorsqu'une référence d'entité paramètre est reconnue dans la DTD et incluse, son texte de remplacement DOIT être complété d'un caractère espace (#x20) au début et à la fin; ceci dans le but de s'assurer que le texte de remplacement des entités paramètres contient un nombre entier d'unités lexicales dans la DTD. Ce comportement NE DOIT PAS s'appliqué aux références d'entité paramètre sans les valeurs d'entité; tels que décris dans 4.4.5 Inclus dans littéral.

4.4.9 Erreur

C'est une erreur pour une référence à une entité non analysée d'apparaître dans la EntityValue d'une déclaration d'entité.

4.5 Construction du texte de remplacement d'une entité

En faisant état du traitement des entités internes, il convient de distinguer deux formes de la valeur de l'entité. [Définition : Pour une entité interne, la valeur littérale d'entité est la chaîne entre guillemets qu'on trouve dans la déclaration d'entité, correspondant au non-terminal EntityValue.] [Définition : Pour une entité externe, la valeur littérale d'entité est le texte exacte contenu dans l'entité.] [Définition : Pour une entité interne, le texte de remplacement est le contenu de l'entité, après remplacement des références de caractère et des références d'entités paramétrées.] [Définition : Pour une entité externe, le texte de remplacement est le contenu de l'entité, après décapage de la déclaration de texte (en laissant tout l'espace blanc l'encadrant) s'il en existe un mais sans le remplacement des références de caractères ou des références d'entité paramétre.]

La valeur littérale d'entité telle que donnée dans une déclaration d'entité interne (EntityValue) peut contenir des références de caractère, d'entité paramètre et d'entité générale. De telles références DOIVENT être entièrement contenues dans la valeur littérale d'entité. FIXME Le texte de remplacement qui est inclus (ou inclus dans le littérale) tel que décrit ci-dessus DOIT contenir le texte de remplacement de toute référence d'entité paramètre, ainsi DOIT contenir le caractère FIXME toutefois, les références d'entité générale DOIVENT être laissées telles quelles, sans remplacement. Par exemple, étant donné les déclarations suivantes :

<!ENTITY % pub    "&#xc9;ditions Gallimard" >
<!ENTITY   rights "All rights reserved" >
<!ENTITY   book   "La Peste: Albert Camus,
&#xA9; 1947 %pub;. &rights;" >

alors le texte de remplacement de l'entité « book » est :

La Peste: Albert Camus,
© 1947 Éditions Gallimard. &rights;

La référence d'entité générale « &rights; » sera développée si la référence « &book; » venait à apparaître dans le contenu du document ou dans une valeur d'attribut.

Ces règles simples peuvent avoir des interactions complexes; on trouvera un exemple difficile expliqué en détails, voir D Développement des références d'entité et de caractère .

4.6 Entités prédéfinies

[Définition : Les références d'entité ou de caractère peuvent être utilisées pour échapper le caractère inférieur-à, l'esperluette et d'autres délimiteurs. Un ensemble d'entités générales (amp, lt, gt, apos, quot) est défini à cette fin. Les références numériques de caractère peuvent aussi être utilisées; elles sont développées dès que reconnues et DOIVENT être traitées comme des données textuelles, de sorte que les références numériques de caractère « &#60; » et « &#38; » peuvent être utilisés pour échapper < et & lorsqu'elles apparaissent dans une donnée textuelle.]

Tous les processeurs XML DOIVENT reconnaître ces entités, qu'elles soient déclarées ou non. À des fins d'interopérabilité, les documents XML valides DEVRAIENT déclarer ces entités, comme n'importe quelles autres, avant leur utilisation. Si les entités lt ou amp sont déclarées, elles DOIVENT être déclarées comme des entités internes dont le texte de remplacement est une référence de caractère au caractère respectif (inférieur à ou esperluette) à échapper; le double échappement est REQUIS pour ces entités afin que les références sur elles produisent un résultat bien formé. Si les entités gt, apos, ou quot sont déclarées, elles DOIVENT être déclarées comme des entités internes dont le texte de remplacement est un seul caractère à échapper (ou une référence de caractère à un caractère; le double échappement est ici OPTIONNEL mais inoffensif). Par exemple :

<!ENTITY lt     "&#38;#60;">
<!ENTITY gt     "&#62;">
<!ENTITY amp    "&#38;#38;">
<!ENTITY apos   "&#39;">
<!ENTITY quot   "&#34;">

4.7 Déclarations de notation

[Définition : Une notation identifiée par un nom le format d'une entité non-analysable, le format des éléments qui portent un attribut de notation, ou l'application à laquelle une instruction de traitement est adressée.]

[Définition : Une déclaration de notation fournit, d'une part, un nom à la notation, à utiliser dans les déclarations d'entité, les déclarations de liste d'attributs et les spécifications d'attribut; d'autre part, un identificateur externe de la notation qui peut permettre à un processeur XML, ou son application cliente, de localiser une application d'aide capable de traiter les données de cette notation.]

[82]    NotationDecl    ::=    '<!NOTATION' S Name S (ExternalID | PublicID) S? '>' [CV : Nom de notation unique]
[83]    PublicID    ::=    'PUBLIC' S PubidLiteral

Contrainte de validité : Nom de notation unique

Un Name donné NE DOIT PAS être déclaré dans plus d'une déclaration de notation.

Les processeurs XML DOIVENT fournir aux applications les nom et identificateur(s) externe(s) de toute notation déclarée et mentionnée dans une valeur d'attribut, une définition d'attribut ou une déclaration d'entité. Ils PEUVENT aussi transformer l'identificateur externe en un identificateur système, un nom de fichier, ou toute autre information nécessaire pour permettre à l'application d'appeler un processeur pour les données dans la notation décrite. (Toutefois, il n'y a pas erreur lorsque des documents XML déclarent et se référent à des notations pour lesquelles des applications idoines ne sont pas disponibles sur le système où le processeur XML ou l'application est en fonctionnement).

4.8 L'entité document

[Définition : L'entité document sert de racine à l'arbre des entités et de point de départ au processeur XML.] Cette spécification ne précise pas comment l'entité document est localisée par un processeur XML; contrairement aux autres entités, l'entité document n'a pas de nom et peut fort bien apparaître dans le flux d'entrée d'un processeur sans la moindre identification.

5 Conformité

5.1 Processeurs validant et non-validant

Les processeurs XML conformes sont validant ou non-validant.

Les processeurs validant et non-validant DOIVENT signaler les violations de contraintes de forme de cette spécification dans le contenu de l'entité document et de toute autre entité analysable qu'ils lisent.

[Définition : Les processeurs validatants DOIVENT, au gré de l'utilisateur, signaler les violations de contraintes exprimées par les déclarations de la DTD, et les violations des contraintes de validité précisées par cette spécification.] Pour ce faire, les processeurs XML validant DOIVENT lire et traiter la DTD complète ainsi que toutes les entités analysables externes mentionnées dans le document.

Les processeurs non-validant sont tenus de vérifier uniquement la forme de l'entité document, y compris le sous-ensemble interne de la DTD complet. [Définition : Bien qu'ils ne soient pas tenus de vérifier la validité du document, ils sont TENUS de traiter toutes les déclarations qu'ils lisent dans le sous-ensemble interne de la DTD ainsi que dans toute entité paramètre qu'ils lisent, jusqu'à la première référence à une entité paramètre qu'ils ne lisent pas; c'est-à-dire, qu'ils DOIVENT utiliser l'information de ces déclarations pour normaliser les valeurs d'attribut, inclure le texte de remplacement des entités internes, et fournir les valeurs implicites d'attribut.] Sauf si standalone="yes", ils NE DOIVENT PAS traiter les déclarations d'entité ni les déclarations de liste d'attributs qui suivent une référence d'entité paramètre qui n'est pas lu, puisque l'entité peut contenir des déclarations contradictoires; lorsque standalone="yes", les processeurs DOIVENT traiter ces déclarations.

Notez que lors du traitement de documents non valides avec un processeur non validant, l'application ne peut pas être présentée avec une information cohérente. Par exemple, plusieurs exigences d'unicité peuvent ne pas être respectées dans le document, telles que l'inclusion de plus d'un élément avec le même id, la duplication de déclarations d'éléments ou de notations avec le même nom, etc.

5.2 Utilisation des processeurs XML

Le comportement d'un processeur XML validant est éminemment prévisible; il doit lire chaque parties d'un document et signaler toutes les violations de contrainte de forme et de validité. On est moins exigeant avec un processeur non-validant, qui n'a besoin de lire que l'entité document. Il en résulte deux effets qui peuvent être d'importance pour les utilisateurs de processeurs XML :

  • Certaines erreurs de forme, notamment celles dont la détection exige de lire les entités externes, peuvent échapper à un processeur non-validateur. Des exemples de contraintes pouvant être violées sans avertissement sont celles appelées Entity Declared, Parsed Entity et No Recursion, ainsi que quelques cas décrits comme interdit dans 4.4 Traitement des entités et des références par un processeur XML.

  • L'information transmise du processeur à l'application peut varier, selon que le processeur lit ou non les entités paramètres et externes. Par exemple, un processeur non-validant peut ne pas normaliser des valeurs d'attribut, ne pas inclure le texte de remplacement d'entités internes, ou ne pas fournir des valeurs implicites d'attribut, où cela dépend de la lecture préalable des déclarations dans les entités externes ou paramètres, ou dans le sous-ensemble interne après une référence d'entité paramètre non lue.

Afin d'optimiser l'interopérabilité entre différents processeurs XML, les applications qui utilisent des processeurs non-validant NE DEVRAIENT PAS se fier à des comportements facultatifs de tels processeurs. Les applications qui nécessitent des fonctions (comme la déclaration de valeurs par défaut d'attribut et des entités internes qui sont ou peuvent être spécifiées dans des entités externes) DEVRAIENT utiliser des processeurs validant.

6 Notation

La grammaire formelle du XML est donnée dans cette spécification en utilisant une simple notation Backus-Naur étendue (EBNF). Chaque règle de la grammaire définit un symbole, sous la forme :

symbol ::= expression

Les symboles sont écris avec une lettre initiale majuscule s'ils sont le symbole initial d'un langage régulier, autrement, ils sont écris avec une lettre initiale minuscule. Les chaînes littérales sont entre guillemets anglais simples ou doubles.

Dans l'expression du côté droit d'une règle, les expressions suivantes sont utilisées en correspondance avec des chaînes d'un ou plusieurs caractères :

#xN

N est un entier hexadécimal, l'expression équivaut au caractère de l'ISO/CEI 10646 dont le point de code (UCS-4) a la valeur N. Le nombre de zéros en tête dans la forme #xN n'est pas significatif.

[a-zA-Z], [#xN-#xN]

correspond à n'importe quel Char dont la valeur appartient à l'intervalle indiqué (inclusivement).

[abc], [#xN#xN#xN]

correspond à n'importe quel Char dont la valeur est parmi les caractères énumérés. Les énumérations et les intervalles peuvent être mélangés dans un jeu de crochets.

[^a-z], [^#xN-#xN]

correspond à n'importe quel Char dont la valeur est en-dehors de l'intervalle indiqué.

[^abc], [^#xN#xN#xN]

correspond à n'importe quel Char dont la valeur n'est pas parmi les caractères énumérés. Les énumérations et les intervalles de valeurs interdites peuvent être mélangés dans un jeu de crochets.

"string"

correspond à une chaîne littérale correspondant à celle indiquée entre les doubles quotes.

'string'

correspond à une chaîne littérale correspondant à celle indiquée entre les simples quotes.

Ces symboles peuvent être combinés pour correspondre à des motifs plus complexes comme suit, où A et B représentent des expressions simples :

(expression)

l'expression est traitée comme une unité et peut être combinée comme descrit dans cette liste.

A?

correspond à A ou rien; A est optionnel.

A B

correspond à A suivi de B. Cet opérateur a une priorité plus élévée que l'alternative; ainsi, A B | C D est identique à (A B) | (C D).

A | B

correspond à A ou B.

A - B

correspond à n'importe quelle chaîne qui correspond à A mais ne correspond pas à B.

A+

correspond une ou plusieurs occurrences de A. La concaténation a une priorité plus élévée que l'alternative; ainsi, A+ | B+ est identique à (A+) | (B+).

A*

correspond à zéro, une ou plusieurs occurrences de A. La concaténation a une priorité plus élévée que l'alternative; ainsi, A* | B* est identique à (A*) | (B*).

Les autres notations utilisées dans les productions sont :

/* ... */

commentaire.

[ cf : ... ]

contrainte de forme; elle identifie par un nom une contrainte sur des documents bien formés associée à une production.

[ cv : ... ]

contrainte de validité; elle identifie par un nom une contrainte sur des documents valides associée à une production.

A Références

A.1 Références normatives

IANA-CHARSETS
(Internet Assigned Numbers Authority) Official Names for Character Sets, éd. Keld Simonsen et coll. (voir http://www.iana.org/assignments/character-sets).
IETF RFC 2119
IETF (Internet Engineering Task Force). RFC 2119: Key words for use in RFCs to Indicate Requirement Levels. Scott Bradner, 1997. (voir http://www.ietf.org/rfc/rfc2119.txt).
IETF BCP 47
IETF (Internet Engineering Task Force). BCP 47, consisting of RFC 4646: Tags for Identifying Languages , and RFC 4647: Matching of Language Tags , A. Phillips, M. Davis. 2006.
IETF BCP 47
IETF (Internet Engineering Task Force). BCP 47, consisting of RFC 4646: Tags for Identifying Languages , et RFC 4647: Matching of Language Tags , A. Phillips, M. Davis. 2006.
IETF RFC 3986
IETF (Internet Engineering Task Force). RFC 3986: Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee, R. Fielding, L. Masinter. 2005. (voir http://www.ietf.org/rfc/rfc3986.txt).
ISO/IEC 10646
ISO (International Organization for Standardization). ISO/IEC 10646-1:2000. Information technology — Universal Multiple-Octet Coded Character Set (UCS) — Part 1: Architecture and Basic Multilingual Plane and ISO/IEC 10646-2:2001. Information technology — Universal Multiple-Octet Coded Character Set (UCS) — Part 2: Supplementary Planes, as, from time to time, amended, replaced by a new edition or expanded by the addition of new parts. [Geneva]: International Organization for Standardization. (Voir http://www.iso.org/iso/home.htm pour la dernière version.)
ISO/IEC 10646:2000
ISO (International Organization for Standardization). ISO/IEC 10646-1:2000. Information technology — Universal Multiple-Octet Coded Character Set (UCS) — Part 1: Architecture and Basic Multilingual Plane. [Genève]: International Organization for Standardization, 2000.
Unicode
The Unicode Consortium. The Unicode Standard, Version 5.0.0, defined by: The Unicode Standard, Version 5.0 (Boston, MA, Addison-Wesley, 2007. ISBN 0-321-48091-0).
UnicodeNormal
The Unicode Consortium. Unicode normalization forms. Mark Davis and Martin Durst. 2008. (voir http://unicode.org/reports/tr15/).

A.2 Autres références

Aho/Ullman
Aho, Alfred V., Ravi Sethi, and Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools. Reading: Addison-Wesley, 1986, rpt. corr. 1988.
Brüggemann-Klein
Brüggemann-Klein, Anne. Formal Models in Document Processing. Habilitationsschrift. Faculté de Mathématiques de l'Université de Freiburg, 1993. (voir ftp://ftp.informatik.uni-freiburg.de/documents/papers/brueggem/habil.ps).
Brüggemann-Klein and Wood
Brüggemann-Klein, Anne, and Derick Wood. Deterministic Regular Languages. Universität Freiburg, Institut für Informatik, Bericht 38, Oktober 1991. Extended abstract in A. Finkel, M. Jantzen, Hrsg., STACS 1992, S. 173-184. Springer-Verlag, Berlin 1992. Lecture Notes in Computer Science 577. Full version titled One-Unambiguous Regular Languages dans Information and Computation 140 (2): 229-253, Février 1998.
Clark
James Clark. Comparison of SGML and XML. (voir http://www.w3.org/TR/NOTE-sgml-xml-971215).
IANA-LANGCODES
(Internet Assigned umbers Authority) Registry of Language Tags (See http://www.iana.org/assignments/language-subtag-registry.)
IANA-LANGCODES
(Internet Assigned umbers Authority) Registry of Language Tags (See http://www.iana.org/assignments/language-subtag-registry.)
IETF RFC 2141
IETF (Internet Engineering Task Force). RFC 2141: URN Syntax, éd. R. Moats. 1997. (voir http://www.ietf.org/rfc/rfc2141.txt).
IETF RFC 3023
IETF (Internet Engineering Task Force). RFC 3023: XML Media Types. éd. M. Murata, S. St.Laurent, D. Kohn. 2001. (voir http://www.ietf.org/rfc/rfc3023.txt).
IETF RFC 2781
IETF (Internet Engineering Task Force). RFC 2781: UTF-16, an encoding of ISO 10646, éd. P. Hoffman, F. Yergeau. 2000. (voir http://www.ietf.org/rfc/rfc2781.txt).
ISO 639
(International Organization for Standardization). ISO 639:1988 (E). Code for the representation of names of languages. [Genève]: International Organization for Standardization, 1988.
ISO 3166
(International Organization for Standardization). ISO 3166-1:1997 (E). Codes for the representation of names of countries and their subdivisions — Part 1: Country codes [Genève]: International Organization for Standardization, 1997.
ISO 8879
ISO (International Organization for Standardization). ISO 8879:1986(E). Information processing — Text and Office Systems — Standard Generalized Markup Language (SGML). Première édition — 1986-10-15. [Genève]: International Organization for Standardization, 1986.
ISO/IEC 10744
ISO (International Organization for Standardization). ISO/IEC 10744-1992 (E). Information technology — Hypermedia/Time-based Structuring Language (HyTime). [Genève]: International Organization for Standardization, 1992. Extended Facilities Annexe. [Genève]: International Organization for Standardization, 1996.
WEBSGML
ISO (International Organization for Standardization). ISO 8879:1986 TC2. Information technology — Document Description and Processing Languages. [Genève]: International Organization for Standardization, 1998. (voir http://www.sgmlsource.com/8879/n0029.htm).
XML Names
Tim Bray, Dave Hollander, et Andrew Layman, éditeurs. Namespaces in XML. Textuality, Hewlett-Packard, et Microsoft. World Wide Web Consortium, 1999. (voir http://www.w3.org/TR/xml-names/).

B Classes de caractères

En raison des changements aux productions [4] et [5], les productions de cette annexe sont maintenant orphelinnes et ne sont plus utilisées pour déterminer les caractères du nom. Cette annexe pourrait être supprimée dans une prochaine édition de cette spécification; les autres spécifications qui souhaitent se référer aux productions du présent document devraient le faire à l'aide d'une référence vers la production(s) appropriée(s) de la Quatrième Édition de cette spécification.

Conformément aux caractéristiques définies dans le standard Unicode, les caractères sont classés en caractères de base (parmi lesquels, on retrouve les lettres de l'alphabet latin sans diacritiques), en caractères idéographiques et en caractères jonctifs (cette classe contient la plupart des diacritiques). Les chiffres et les extenseurs sont aussi distingués.

Caractères
[84]    Letter    ::=    BaseChar | Ideographic
[85]    BaseChar    ::=    [#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | [#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | [#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | [#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | [#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | [#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | [#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | [#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | [#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | [#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | [#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | [#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | [#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | [#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | [#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | [#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | [#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | [#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | [#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | [#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | [#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | [#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | [#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | [#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | [#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | [#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | [#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | [#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | [#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | #x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | #x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | #x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | [#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | [#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | #x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | [#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | [#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | [#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | [#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | [#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | #x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | [#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | [#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | [#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | [#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]
[86]    Ideographic    ::=    [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]
[87]    CombiningChar    ::=    [#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | [#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | [#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | [#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | #x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | [#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | [#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | #x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | [#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | [#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | #x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | [#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | [#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | [#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | [#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | [#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | #x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | [#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | #x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | [#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | [#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | #x3099 | #x309A
[88]    Digit    ::=    [#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | [#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | [#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | [#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]
[89]    Extender    ::=    #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]

Les classes de caractères définies ci-dessus peuvent être dérivées de la base de données des caractères d'Unicode de la façon suivante :

C XML et SGML (Non normatif)

Le XML a été conçu de telle sorte qu'il soit un sous-ensemble de SGML, ce qui signifie que tout document XML devrait également être un document SGML conforme. Pour une comparaison détaillée des restrictions supplémentaires que le XML impose aux documents au-delà de celles imposées par le SGML, voir [Clark].

D Développement des références d'entité et de caractère (Non normatif)

Cette annexe contient quelques exemples illustrant la suite des opérations de reconnaissance et de développement d'entité et de références de caractères, tel que spécifiées dans 4.4 Traitement des entités et des références par un processeur XML.

Si la DTD contient la déclaration :

<!ENTITY example "<p>An ampersand (&#38;#38;) may be escaped
numerically (&#38;#38;#38;) or with a general entity
(&amp;amp;).</p>" >

alors le processeur XML reconnaîtra les références de caractères lors de l'analyse de la déclaration d'entité, et les résoudra avant de stocker la chaîne de caractères suivante comme valeur de l'entité « example » :

<p>An ampersand (&#38;) may be escaped
numerically (&#38;#38;) or with a general entity
(&amp;amp;).</p>

Dans le document, une référence à « &example; » provoquera une nouvelle analyse du texte, après quoi les balises d'ouverture et de fermeture de l'élément p seront reconnues et les trois références seront reconnues et développées, il en résultera un élément p avec le contenu suivant (rien que des données, pas de délimiteurs ou de balisage) :

An ampersand (&) may be escaped
numerically (&#38;) or with a general entity
(&amp;).

Un exemple plus complexe illustrera complètement les règles et leurs effets. Dans l'exemple suivant, les numéros de ligne ne servent que de référence.

1 <?xml version='1.0'?>
2 <!DOCTYPE test [
3 <!ELEMENT test (#PCDATA) >
4 <!ENTITY % xx '&#37;zz;'>
5 <!ENTITY % zz '&#60;!ENTITY tricky "error-prone" >' >
6 %xx;
7 ]>
8 <test>This sample shows a &tricky; method.</test>

Ce qui a pour résultat :

Dans l'exemple suivant :

<!DOCTYPE foo [ 
<!ENTITY x "&lt;"> 
]> 
<foo attr="&x;"/>

le texte de remplacement de x sont les quatre caractrères "&lt;" parce que les références aux entités générales dans les valeurs d'entités sont passées. Le texte de remplacement de lt est une référence de caractère au caractère inférieur à, par exemple les cinq caractères "&#60;" (voir 4.6 Entités prédéfinies). Comme aucun ne contient un caractère inférieur à, le résultat est bien formé.

Si la définition de x avait été

<!ENTITY x "&#60;">

alors le document n'aurait pas été bien formé, parce que le texte de remplacement de x aurait été un simple caractère "<" qui n'est pas permit dans les valeurs d'attribut (voir WFC : Pas de < dans les valeurs d'attribut).

E Modèles de contenu déterministes (Non normatif)

Comme noté dans 3.2.1 Contenu d'élément, il est nécessaire que les modèles de contenu dans les déclarations de type d'élément soient déterministes. Pour favoriser la compatibilité avec le SGML (lequel appelle des modèles de contenu déterministes « non-ambiguës »); les processeurs XML construits en utilisant sur la base de systèmes SGML peuvent signaler les modèles de contenu non déterministes comme des erreurs.

Par exemple, le modèle de contenu ((b, c) | (b, d)) est non déterministe, car étant donné un b initial, le processeur XML ne peut déterminer à quel b du modèle il correspond sans savoir d'avance quel élément suit le b. Dans ce cas, les deux références à b peuvent être fusionnées en une seule référence, le modèle devenant (b, (c | d)). Un b initial correspond maintenant clairement à un seul nom dans le modèle de contenu. Le processeur n'a plus besoin de prévoir ce qui suit; c ou d serait accepté.

Plus formellement : un automate à états finis peut être construit à partir du modèle de contenu en utilisant les algorithmes standards, p. ex. l'algorithme 3.5 de la section 3.9 de Aho, Sethi et Ullman [Aho/Ullman]. Dans plusieurs de ces algorithmes, un ensemble des suivants est construit pour chaque position dans l'expression régulière (c.-à-d. chaque feuille dans l'arbre syntaxique de l'expression régulière); si une des positions a un ensemble des suivants dans lequel plus d'une des positions suivantes a le même nom de type d'élément, alors le modèle de contenu est erroné et peut être signalé comme tel.

Il existe des algorithmes permettant de réduire automatiquement beaucoup, mais pas tous, les modèles de contenu non-déterministes à des modèles déterministes équivalents; voir Brüggemann-Klein 1991 [Brüggemann-Klein].

F Auto-détection du codage de caractères (Non normatif)

La déclaration de codage XML tient le rôle d'étiquette interne à chaque entité, indiquant quel codage de caractères y est utilisé. Avant qu'un processeur XML puisse lire l'étiquette interne, toutefois, il doit savoir quel codage de caractères est apparement utilisé, ce qui est précisément ce que l'étiquette interne essaye d'indiquer. En général, la situation est sans issue. Elle n'est pas totalement désespérée en XML, puisque le XML limite le cas général de deux façons : chaque implémentation est supposée prendre en charge qu'un ensemble fini de codages de caractères, et la position et le conteu de la déclaration de codage XML sont restreint de telle sorte qu'il est possible d'autodétecter le codage de caractère utilisé dans chaque entité dans les cas normaux. De plus, dans bien des cas d'autres sources d'information sont disponibles en plus du flux de données XML lui-même. Deux cas peuvent être distingués, selon qu'une entité XML est présentée au processeur avec ou sans, l'information (externe) l'accompagnant. Nous considérons d'abord le dernier cas.

F.1 Détection sans Information de Codage Externe

Étant donné que toute entité XML non accompagnée de l'information de codage externe et non codée en UTF-8 ou UTF-16 doit commencer par une déclaration de codage XML, dont les premiers caractères doivent être '<?xml', tout processeur conforme peut déterminer, après avoir lu de deux à quatre octets de l'entrée, lequel des cas suivants s'applique. En lisant cette liste, il peut être utile de se rappeler qu'en UCS-4, '< et '?' sont représentés par « #x0000003C » et « #x0000003F » respectivement, alors que la marque d'ordre d'octets exigée d'un flux de données en UTF-16 est « #xFEFF ». La notation## est utilisée pour indiquer n'importe quelle valeur d'octet excepter que deux ## consécutifs ne peuvent avoir la valeur 00.

Avec une marque d'ordre d'octets :

00 00 FE FF UCS-4, machine grand-boutienne (ordre 1234)
FF FE 00 00 UCS-4, machine petit-boutienne (ordre 4321)
00 00 FF FE UCS-4, ordre inhabituel d'octet (2143)
FE FF 00 00 UCS-4, ordre inhabituel d'octet (3412)
FE FF ## ## UTF-16, grand-boutien
FF FE ## ## UTF-16, petit-boutien
EF BB BF UTF-8

Sans marque d'ordre d'octets :

00 00 00 3C UCS-4 ou d'autre codages avec une unité de code de 32 octets et des caractères ASCII codés en valeurs ASCII, respectivement en gros boutiste (1234), petit boutiste (4321) et deux ordres d'octets inhabituels (2143 et 3412). La déclaration de codage doit être lue pour déterminer quel codage entre l'UCS-4 ou autres codages 32-bits supportés appliqué.
3C 00 00 00
00 00 3C 00
00 3C 00 00
00 3C 00 3F UTF-16BE ou ISO-10646-UCS-2 grand-boutien ou d'autre codage avec une unité de code à 16 octets en gros boutiste et les caractères ASCII codés en valeurs ASCII (la déclaration de codage doit être lue pour déterminer lequel).
3C 00 3F 00 UTF-16LE ou ISO-10646-UCS-2 petit boutiste ou d'autre codage avec une unité de code à 16 octets en petit boutiste et les caractères ASCII codés en valeurs ASCII (la déclaration de codage doit être lue pour déterminer lequel).
3C 3F 78 6D UTF-8, ISO 646, ASCII, certaines parties de l'ISO 8859, Shift-JIS, EUC, ou tout autre codage sur 7 bits, 8 bits ou de longeur variable qui garantissent que les caractères ASCII ont leur positions, longueurs, et valeurs habituelle; la déclaration de codage courante doit être lue pour déterminer lequel d'entre eux appliquer, mais puisque tous ces codages utilisent les mêmes motifs d'octet pour les caractères ASCII, la déclaration de codage elle-même peut être lue de manière fiable.
4C 6F A7 94 EBCDIC (quelque soit la version; la déclaration de codage complète doit être lue pour déterminer quelle page de code est utilisée).
autre UTF-8 sans déclaration de codage, ou alors le flux de données est corrompu, fragmentaire ou encapsulée dans une enveloppe de quelque sorte.

Note :

Dans les cas ci-dessus, qui ne nécessitent pas la lecture de la déclaration de codage pour déterminer le codage, la section 4.3.3 exige toujours que la déclaration de codage, si elle existe, soit lue et que le nom de codage soit vérifier pour correspondre au codage courant de l'entité. Aussi, il est possible que de nouveaux codages de caractères soient inventés ce qui rendra nécessaire d'utiliser la déclaration de codage pour déterminer l'encodage, dans les cas où ce n'est pas nécessaire à l'heure actuelle.

Ce niveau d'auto-détection est suffisant pour lire la déclaration de codage XML et analyser l'identifiant du codage de caractères, qui est nécessaire pour distinguer les membres individuels de chaque famille de codage (p. ex. pour appeler UTF-8 à partir de 8859, et les parties de 8859 à partir d'autres codes, et pour distinguer la page spécifique de code EBCDIC, etc.)

Puisque les contenus de la déclaration de codage sont limités aux caractères du répertoire ASCII (toujours encodé), un processeur peut lire de façon fiable la déclaration de codage complète dès qu'il a détecté quelle famille de codage est utilisée. En pratique, tous les codages de caractères font partie d'une des catégories sus-mentionnées; la déclaration de codage XML permet donc une identification raisonnablement robuste du codage de caractères, même en l'absence d'une source d'information externe fiable (système d'exploitation ou protocole de transport). Note : puisque les entités analysables externes en UTF-16 peuvent débuter par n'importe quel caractères, cette auto-détection ne fonctionne pas toujours. De plus, les codages de caractère tels que UTF-7 peuvent ne pas être détecté détectés de manière fiable, à cause de la surchage qu'ils imposent aux caractères ASCII.

Dès que le processeur a détecté le codage de caractère utilisé, il peut agir en conséquence, en appelant une routine d'entrée pour chaque cas, ou en appelant la fonction de conversion appropriée pour chaque caractère en entrée.

Comme tout système d'auto-étiquetage, la déclaration de codage XML ne fonctionnera pas si un logiciel change le jeu de caractères de l'entité ou le codage sans mettre à jour la déclaration de codage. Les implémenteurs de routines de codage de caractères doivent veiller à assurer l'exactitude de l'information interne ou externe utilisée pour étiquetter l'entité.

F.2 Les priorités dans la Présence de l'Information Externe de Codage

Le second cas de figure se présente lorsque l'entité XML est accompagnée d'un information de codage, comme dans certains systèmes de fichier et certains protocoles réseau. En présence de plusieurs sources d'information, leur priorité relative et la méthode préférée de gestion des conflits devraient être spécifiés. comme une partie du protocole de haut niveau utilisée pour délivrer le XML. En particulier, voir notamment le [IETF RFC 3023] et son successeur, qui définit les types MIME text/xml et application/xml et fournit des indications utiles. Pour faciliter l'intéropérabilité, toutefois, la règle suivante est recommandée.

  • Si une entité XML se trouve dans un fichier, la marque d'ordre d'octet et la déclaration de codage sont utilisées (le cas échéant) pour déterminer le codage de caractères.

G Groupe de Travail W3C XML (Non normatif)

Cette spécification a été préparée et approuvée pour publication par le Groupe de Travail W3C XML (GT). L'approbation de cette spécification par le GT n'implique pas nécessairement que tous les membres du GT aient votés pour son approbation. Les participants actuels et anciens du GT XML sont :

H Groupe de Travail W3C XML Core (Non normatif)

La cinquième édition de cette spécification a été préparée par le Groupe de Travail W3C XML Core (GT). Les participants de ce GT au moment de la publication de cette édition étaient :

I Notes de production (Non normatif)

Cette édition a été codé dans une version légèrement modifiée de la XMLspec-i18n DTD, v2.10. Les versions XHTML ont été produites avec une combinaision des feuilles de styles xmlspec-i18n.xsl, diffspec.xsl, et REC-xml-i18n.xsl.

J Suggestions pour les noms XML (Non normatif)

Les suggestions suivantes définissent ce qui est considéré comme bonne pratique pour la construction de noms XML utilisés pour les noms d'éléments, les noms d'attributs, les cibles d'instruction de traitement, les noms d'entités, les noms de notation, et les valeurs d'attributs de type ID, elles sont censés orienter les auteurs de documents et les concepteurs de schémas.

Les deux premières suggestions sont directement dérivées des règles données pour les identifiants dans Standard Annex #31 (UAX #31) du standard Unicode, version 5.0 [Unicode], et exclue tous les caractères de contrôle, enfermant les marques sans chasse, les nombres non décimaux, les caractères à usage privé, les caractères de ponctuation (avec les exceptions notées), les caractères de symbole, les points de code non assignés, et les caractères d'espace blanc. Les autres suggestions sont principalement dérivées de l'Appendice B des précédentes éditions de cette spécification.

  1. Le premier caractère d'un nom devrait avoir une propriété Unicode ID_Start, ou être '_' #x5F.

  2. Les caractères, hormis le premier, devrait avoir une propriété Unicode ID_Continue, ou être un des caractères listés dans le tableau intitulé "Characters for Natural Language Identifiers" dans UAX #31, à l'exception de "'" #x27 et "’" #x2019.

  3. Les caractères dans les noms devraient être exprimés en utilisant la Forme de Normalisation C définie dans [UnicodeNormal].

  4. Les caractères idéographiques qui ont une décomposition canonique (y compris ceux des intervalles [#xF900-#xFAFF] et [#x2F800-#x2FFFD], avec 12 exceptions) ne devraient pas être utilisés dans les noms.

  5. Les caractères qui ont une décomposition de compatibilité (ceux qui ont une "compatibility formatting tag" dans le champs 5 de Unicode Character Database -- marquée par le champs 5 en commençant par un "<") ne devraient pas être utilisés dans les noms. Cette suggestion ne s'applique pas aux caractères qui, en dépit de leurs décompositions de compatibilité sont régulièrement utilisés dans leurs scripts, par exemple #x0E33 THAI CHARACTER SARA AM ou #x0EB3 LAO CHARACTER AM.

  6. Les caractères composés destinés pour une utilisation avec des symboles seulement (incluant ceux des intervalles [#x20D0-#x20EF] et [#x1D165-#x1D1AD]) ne devraient pas être utilisés dans les noms.

  7. Les caractères d'annotation interlinéaire ([#xFFF9-#xFFFB]) ne devraient pas être utilisés dans les noms.

  8. Les caractères de sélection de variation ne doivent pas être utilisés dans les noms.

  9. Les noms qui sont absurdes, imprononçable, difficile à lire, ou peuvent facilement être confondus avec d'autres noms ne devraient pas être utilisés.