Comment déclarer les attributs xml:* dans un schéma W3C XML Schema?
Eric van der Vlist, Dyomedea (vdv@dyomedea.com).
mercredi 1er mars 2006
Table des matières
Question
Particularités des attributs xml:*
Déclaration des attributs
Autoriser tous les attributs xml:*, valides ou non
Autoriser tous les attributs xml:* s'ils sont définis et valides
Autoriser certains attributs xml:* s'ils sont définis et valides
Autres articles :
Question
J'ai une structure XML avec un élément contenant un attribut du genre xml:lang="fr". Comment faire pour le déclarer dans mon schéma W3C XML Schema?
Particularités des attributs xml:*
Les recommandations XML 1.0 et 1.1 réservent le préfixe « xml » dans tous les noms (éléments, attributs, entités, ...) à des utilisations définies par le W3C.
Le préfixe « xml: » et les attributs préfixés par « xml: » sont donc concernés par cette règle.
Le préfixe « xml: » a la particularité d'être le seul préfixe d'espace de noms affecté à un espace de noms sans devoir être déclaré. L'URI de l'espace de noms auquel il est affecté est « http://www.w3.org/XML/1998/namespace ».
Le W3C publie et maintient un schéma décrivant cet espace de noms (qui ne contient actuellement que des attributs) à l'adresse « http://www.w3.org/2001/xml.xsd ».
Déclaration des attributs
Les techniques qui sont appliquées pour faire référence à ces attributs sont applicables à tout espace de noms et peuvent être utilisées, par exemple, pour faire référence aux attributs XLink.
Suivant le niveau de contrôle que l'on souhaite imposer à ces attributs, on pourra utiliser une des trois méthodes suivantes:
Autoriser tous les attributs xml:*, valides ou non
Si l'on souhaite autoriser tout attribut xml:*, qu'il ait été défini par le W3C ou non et sans faire aucun contrôle sur son contenu, on utilisera la particule W3C XML Schema « xs:anyAttribute » en mode « lax » sans importer le schéma de l'espace de noms « http://www.w3.org/XML/1998/namespace », par exemple :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFor
mDefault="qualified"
targetNamespace="http://ns.xmlfr.org/example/" xmlns:example="h
ttp://ns.xmlfr.org/example/">
<xs:element name="document">
<xs:complexType>
<xs:sequence>
<xs:element ref="example:titre"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="titre">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:token">
<xs:anyAttribute namespace="http://www.w3.org/XML/1998/
namespace" processContents="lax"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
Ce schéma valide des documents tels que :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:lang="fr">Titre</titre>
</document>
ou :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:lang="ceci ne devrait pas être permis">Titre</titr
e>
</document>
ou :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:id="titre">Titre</titre>
</document>
ou encore :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:interdit="titre">Titre</titre>
</document>
Autoriser tous les attributs xml:* s'ils sont définis et valides
Si l'on souhaite autoriser tout attribut xml:* conformément à sa définition par le W3C, on utilisera la particule W3C XML Schema « xs:anyAttribute » en mode « strict » après avoir importé le schéma de l'espace de noms « http://www.w3.org/XML/1998/namespace », par exemple :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFor
mDefault="qualified"
targetNamespace="http://ns.xmlfr.org/example/" xmlns:example="h
ttp://ns.xmlfr.org/example/">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/xml.xsd"/>
<xs:element name="document">
<xs:complexType>
<xs:sequence>
<xs:element ref="example:titre"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="titre">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:token">
<xs:anyAttribute namespace="http://www.w3.org/XML/1998/
namespace" processContents="strict"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
Ce schéma valide des documents tels que :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:lang="fr">Titre</titre>
</document>
ou :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:id="titre">Titre</titre>
</document>
Mais pas :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:lang="ceci ne devrait pas être permis">Titre</titr
e>
</document>
qui correspond à une valeur interdite pour « xml:lang », ni :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:interdit="titre">Titre</titre>
</document>
qui correspond à un attribut non défini par le W3C.
Autoriser certains attributs xml:* s'ils sont définis et valides
Si l'on souhaite autoriser uniquement certains xml:* (par exemple xml:lang) conformément à leur définition par le W3C, on fera référence à ces attributs après avoir importé le schéma de l'espace de noms « http://www.w3.org/XML/1998/namespace », par exemple :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFor
mDefault="qualified"
targetNamespace="http://ns.xmlfr.org/example/" xmlns:example="h
ttp://ns.xmlfr.org/example/">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
schemaLocation="http://www.w3.org/2001/xml.xsd"/>
<xs:element name="document">
<xs:complexType>
<xs:sequence>
<xs:element ref="example:titre"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="titre">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:token">
<xs:attribute ref="xml:lang"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
Ce schéma valide des documents tels que :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:lang="fr">Titre</titre>
</document>
Mais pas :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:id="titre">Titre</titre>
</document>
qui correspond à un attribut auquel nous n'avons pas fait référence, ni :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:lang="ceci ne devrait pas être permis">Titre</titr
e>
</document>
qui correspond à une valeur interdite pour xml:lang, ni :
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://ns.xmlfr.org/example/">
<titre xml:interdit="titre">Titre</titre>
</document>
qui correspond à un attribut non défini par le W3C.
Autres articles :
-
xsi:schemaLocation et noNamespaceSchemaLocation.
-
Importer un espace de noms avec W3C XML Schema
Copyright 2006, Eric van der Vlist
|