Espaces de noms et DTD
Comment faire pour utiliser les espaces de nom dans les documents XML valides ?
Deux conditions :
Les types d'éléments et d'attributs affectés à un espace de nommage doivent être déclarés par un nom qualifié (c'est-à-dire avec un préfixe d'espace de nom)
xmlns :prefix="uri"
Les attributs xmlns servant à désigner les déclarations d'espaces de nom doivent être déclarés dans la DTD.
L'exemple suivant présente un document XML qui n'est pas valide. On utilise dans l'arbre des éléments XML, des attributs qualifiés et qui ne sont pas spécifiés avec le préfix dans la DTD.
Pour que l'exemple précédent deviendra valide selon sa DTD interne, on doit prendre en compte la déclaration des espaces de noms dans la DTD.
L'attribut style de l'élément notice est associé à l'espace de noms html. Il est qualifié : html :style
L'attribut xmlns servant à la déclaration de l'espace de nom est déclaré dans la DTD. Cette déclaration est combinée avec le mot-clé #FIXED. On s'assure ainsi que dans l'élément racine "notice" une déclaration d'espace de noms interviendra toujours pour l'espace de nom html.
<!DOCTYPE notice [
<!ELEMENT notice (#PCDATA)>
<!ATTLIST notice html:style CDATA #IMPLIED
xmlns:html CDATA #FIXED "http://www.w3.org/TR/REC-html40" >
]>
<notice html:style="font-color:red">
Ce document est valide!
</notice>
Exemple : DTD avec deux espaces de noms
L'exemple suivant présente un cas particulier d'utilisation d'espaces de noms. Il est possible d'avoir plusieurs espaces de noms identiques (c-à-d se référant à la même URI)
dans la DTD. L'analyseur vérifie seulement si les noms ou attributs sont différents peu importe le préfixe qui les accompagne.
Les deux types d'éléments déclarés dans la DTD possèdent le même nom local "notice", se différencient pourtant par le préfixe (ns1 et ns2)
Ils appartiennent au même espace de nommage,
Mais, du point de vue de la DTD, deux types d'éléments différents sont déclarés (à savoir ns1 :notice et ns2 :notice)
Ainsi ce document est valide.