Schémas XML - cours 2 Éric Laporte Institut Gaspard-Monge Université Paris-Est Marne-la-Vallée
Sommaire Valider un seul élément 4 Déclarations locales 7 Identifiants et références 13 Modularisation 41
Valider un élément (1/2) Valider un élément (2/2) Schéma pour plusieurs types de documents Contraindre l'élément racine (1/2) Contraindre l'élément racine (2/2) Éléments déclarés en local (1/3) Éléments déclarés en local (2/3) Éléments déclarés en local (3/3) Déclarations locales ou globales Identifiants Déclarer des identifiants Le type simple s:ID (1/2) Le type simple s:ID (2/2) Références à des identifiants (1/2) Références à des identifiants (2/2) Listes de références à des identifiants (1/2) Listes de références à des identifiants (2/2) Identifiants et références s:unique (1/6) s:unique (2/6) s:unique (3/6) s:unique (4/6) s:unique (5/6) s:unique (6/6) Expressions Xpath (1/6) Expressions Xpath (2/6) Expressions Xpath (3/6) Expressions Xpath (4/6) Expressions Xpath (5/6) Expressions Xpath (6/6) s:key Déclarer des références à des identifiants (1/5) Déclarer des références à des identifiants (2/5) Déclarer des références à des identifiants (3/5) Déclarer des références à des identifiants (4/5) Déclarer des références à des identifiants (5/5) s:ID ou s:unique Une grammaire en plusieurs schémas Solution 1 : s:include (1/2) Solution 1 : s:include (2/2) s:include Coexistence de plusieurs espaces de noms Solution 2 : s:import (1/2) Solution 2 : s:import (2/2) s:import Solution 3 : s:any (1/2) Solution 3 : s:any (2/2) Référence à plusieurs schémas XML Espaces de noms acceptés Contrôle de la validation <s:anyAttribute> Schéma d'un document cible sans espace de noms (1/2) Schéma d'un document cible sans espace de noms (2/2) Schémas caméléons
Valider un élément (1/2) On peut valider un document contenant seulement un élément Il suffit qu'il ait été déclaré en global dans le schéma <?xml version="1.0" encoding="utf-8"?> <Track xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://igm.univ-mlv.fr/~laporte/audio http://igm.univ-mlv.fr/~laporte/xml/schema/collectionGenres.xsd" xmlns="http://igm.univ-mlv.fr/~laporte/audio"> <Track_ID>37</Track_ID> <Name>American Beauty - Theme</Name> <Artist>Air</Artist> <Album>american beauty soundtrack</Album>
Valider un élément (2/2) L'élément Track a été déclaré en global <?xml version="1.0" encoding="UTF-8"?> <!-- collectionGenres.xsd --> <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio"> <s:element name="Tracks"> (...) </s:element> <s:element name="Track"> <s:complexType> <s:sequence> <s:element ref="aud:Track_ID"/>
Schéma pour plusieurs types de documents Un schéma unique pour plusieurs types de documents <s:element name="CATALOG"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="jr:PLANT"/> </s:sequence> </s:complexType> </s:element> <s:element name="INVOICE"> <s:element minOccurs="0" maxOccurs="unbounded" ref="jr:ITEM"/> (...)
Contraindre l'élément racine (1/2) On veut imposer aud:iTunes comme seul élément racine possible Déclarer tous les autres éléments en local <?xml version="1.0" encoding="UTF-8"?> <!-- imposer-racine.xsd --> <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio" elementFormDefault="qualified"> <s:element name="iTunes"> <s:complexType> <s:sequence> <s:element name="Major_Version" type="s:integer"/> <s:element name="Minor_Version" type="s:integer"/> <s:element name="Application_Version" type="s:decimal"/> <s:element name="Music_Folder" type="s:string"/> <s:element name="Library_Persistent_ID" type="s:NCName"/> <s:element name="Tracks">
Contraindre l'élément racine (2/2) Déclarer un élément en local : à l'intérieur de la spécification du type dont il fait partie <s:element name="iTunes"> <s:complexType> <s:sequence> <s:element name="Major_Version" type="s:integer"/> <s:element name="Minor_Version" type="s:integer"/> <s:element name="Application_Version" type="s:decimal"/> <s:element name="Music_Folder" type="s:string"/> <s:element name="Library_Persistent_ID" type="s:NCName"/> <s:element name="Tracks"> <s:element minOccurs="0" maxOccurs="unbounded" name="Track">
Éléments déclarés en local (1/3) Si l'élément est utilisé dans plusieurs contextes, il faut le déclarer plusieurs fois Cela peut être avec des types différents <s:element name="iTunes"> <s:complexType> <s:sequence> <s:element name="Major_Version" type="s:integer"/> (...) <s:element name="Tracks"> <s:element minOccurs="0" maxOccurs="unbounded" name="Track">
Éléments déclarés en local (2/3) Si tous les éléments sont déclarés en local, sauf l'élément racine : schéma en poupées russes <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio" elementFormDefault="qualified"> <s:element name="iTunes"> <s:complexType> <s:sequence> <s:element name="Major_Version" type="s:integer"/> <s:element name="Minor_Version" type="s:integer"/> <s:element name="Application_Version" type="s:decimal"/> <s:element name="Music_Folder" type="s:string"/> <s:element name="Library_Persistent_ID" type="s:NCName"/> <s:element name="Tracks"> <s:element minOccurs="0" maxOccurs="unbounded" name="Track"> <s:element name="Track_ID" type="s:integer"/> <s:element name="Name" type="s:token"/> <s:element name="Artist" type="s:token"/> <s:element minOccurs="0" name="Composer" type="s:token"/> <s:element minOccurs="0" name="Album" type="s:token"/> <s:element minOccurs="0" name="Genre"> <s:simpleType> <s:restriction base="s:token"> <s:enumeration value="Pop"/> <s:enumeration value="Rock"/> <s:enumeration value="Rock/Pop"/> <s:enumeration value="Rap"/>
Éléments déclarés en local (3/3) Pour qu'ils aient l'espace de noms cible, déclarer elementFormDefault="qualified" à la racine ou form="qualified" dans chaque déclaration Sinon, ils n'ont pas d'espace de noms (mauvaise pratique) <?xml version="1.0" encoding="UTF-8"?> <!-- imposer-racine.xsd --> <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio" elementFormDefault="qualified"> <s:element name="iTunes"> <s:complexType> <s:sequence> <s:element name="Major_Version" type="s:integer"/>
Déclarations locales ou globales Plus strict : les éléments ne peuvent être que là où on les a déclarés Possibilité de surcharge : utiliser le même nom d'élément pour autre chose ailleurs Déclarations globales Plus souple : les éléments peuvent apparaître à la racine Plus de réutilisation Plus lisible : plus faciles à trouver dans le schéma On peut mélanger
Identifiants <!--ligne7.xml --> <td id="crimee" headers="station" class="gauche">Crimée</td> <td headers="pre_dep_sem crimee" class="espace">5:31</td> <td headers="pre_dep_sem crimee">5:37</td> <td headers="pre_dep_sem crimee">5:41</td> <td headers="der_dep_sem crimee" class="espace_2">0:34</td> <td headers="der_dep_sem crimee">0:36</td> <td headers="der_dep_we crimee" class="der_dep_we debut_der_dep_we">1:37*</td> <td headers="der_dep_we crimee" class="der_dep_we fin_der_dep_we"/> Quand le même objet figure plusieurs fois dans un document, cela complique toute modification de l'objet Conserver une seule représentation de l'objet, avec un identifiant, et remplacer les autres par l'identifiant
Déclarer des identifiants Garantir qu'un ensemble de valeurs sont toutes différentes Exemple : dans ligne7.xml, l'attribut id de td <tbody> <tr class="impair"> <td class="f"> <span/> </td> <td class="carte"> <a href="http://www.ratp.info/Proxi/proxi.php" onclick="proxi('605434;2435848'); return false;"> <img src="horaires_metro7.php_fichiers/picto_carte.gif" alt="Plan de quartier"/> </a> <td id="la_courneuve___8_mai_1945" headers="station" class="gauche"> <strong>La Courneuve - 8 Mai 1945</strong>
Le type simple s:ID (1/2) Les s:ID déclarés s:ID d'un document doivent être tous différents Mécanisme issu des DTD <s:element name="td"> <s:complexType mixed="true"> <s:sequence> <s:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/> </s:sequence> <s:attribute name="id" type="s:ID"/> <s:attribute name="class" type="s:token"/> <s:attribute name="headers" type="s:token"/> </s:complexType> </s:element>
Le type simple s:ID (2/2) Valeurs : obligatoirement des identificateurs sans ":" Ne convient pas pour des identifiants numériques ou contenant des espaces element content failed type check: Marsh Marigold does not match pattern [_:A-Za-zÀ-ÖØ-öø-ÿĀ-... <PLANT family="Ranunculaceae"> <COMMON>Columbine</COMMON> <BOTANICAL>Aquilegia canadensis</BOTANICAL> <ZONE>3</ZONE> <LIGHT>Mostly Shady</LIGHT> <PRICE unit="dollar">9.37</PRICE> <AVAILABILITY>030699</AVAILABILITY> </PLANT> <COMMON>Marsh Marigold</COMMON> <BOTANICAL>Caltha palustris</BOTANICAL>
Références à des identifiants (1/2) Garantir qu'un identificateur est identique à un des identifiants déclarés s:ID Exemple : dans ligne7ref.xml, l'attribut name de a <td class="carte"> <a href="http://www.ratp.info/Proxi/proxi.php" onclick="proxi('605434;2435848'); return false;"> <img src="horaires_metro7.php_fichiers/picto_carte.gif" alt="Plan de quartier"/> </a> </td> <td id="la_courneuve___8_mai_1945" headers="station" class="gauche"> <a name="la_courneuve___8_mai_1945"> <strong>La Courneuve - 8 Mai 1945</strong>
Références à des identifiants (2/2) Spécifie que chaque identificateur déclaré s:IDREF est identique à un des identifiants déclarés s:ID <s:element name="a"> <s:complexType> <s:sequence> <s:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/> </s:sequence> <s:attribute name="name" type="s:IDREF"/> <s:attribute name="href" type="s:token"/> <s:attribute name="onclick" type="s:token"/> </s:complexType> </s:element>
Listes de références à des identifiants (1/2) Références aux plantes de même nom scientifique <PLANT id="p16"> <COMMON>Violet, Dog-Tooth</COMMON> <BOTANICAL same-name="p17 p18"> <GENUS>Erythronium</GENUS> <SPECIES>americanum</SPECIES> </BOTANICAL> (...) </PLANT> <PLANT id="p17"> <COMMON>Trout Lily</COMMON> <BOTANICAL same-name="p16 p18">
Listes de références à des identifiants (2/2) s:IDREFS : liste de références séparées par des espaces <s:element name="PLANT"> <s:complexType> (...) <s:attribute name="id" type="s:ID"/> </s:complexType> </s:element> <s:element name="BOTANICAL"> <s:attribute name="same-name" type="s:IDREFS"/>
Identifiants et références s:ID, s:IDREF, s:IDREFS spécifient à la fois - la forme des identifiants - les propriétés d'unicité Les schémas XML permettent de séparer les deux questions Ils proposent un nouveau mécanisme qui couvre uniquement les propriétés d'unicité La forme des identifiants est déjà couverte par les types simples
s:unique (1/6) Spécifie que les contenus des COMMON dans un même CATALOG sont tous différents et que chaque noeud PLANT en contient au plus un <s:element name="CATALOG"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="jr:PLANT"/> </s:sequence> </s:complexType> <s:unique name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:unique> </s:element>
s:unique (2/6) N'importe quel type de chaîne de caractères peut servir d'identifiant La déclaration s:unique est rattachée à la déclaration de l'élément CATALOG S'il y a plusieurs CATALOG, il y a plusieurs "domaines" à l'intérieur desquels les identifiants sont tous différents <s:element name="CATALOG"> <s:complexType> (...) </s:complexType> <s:unique name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:unique> </s:element>
s:unique (3/6) s:selector spécifie les noeuds qui peuvent avoir un identifiant s:field spécifie les identifiants Si on oublie l'espace de noms, il n'y a pas de message d'erreur : <s:field xpath="PLANT"/> Le validateur ne trouve aucun noeud, et donc ne vérifie aucune contrainte <s:element name="CATALOG"> (...) <s:unique name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:unique> </s:element>
s:unique (4/6) "domaine" pour l'unicité ... noeud à identifier ... CATALOG ... PLANT PLANT noeud à identifier ... COMMON BOTANICAL ZONE LIGHT Bloodroot 4 Sanguinaria Canadensis Mostly Shady identifiant <s:unique name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:unique>
s:unique (5/6) L'évaluation de s:field xpath doit donner une valeur unique, qui est convertie en chaîne de caractères Expressions Xpath (langage normalisé par le W3C aussi) <s:unique name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:unique>
s:unique (6/6) S'il y a plusieurs s:field, l'identifiant est le n-uplet des chaînes de caractères correspondantes <s:element name="CATALOG"> (...) <s:unique name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:BOTANICAL"/> <s:field xpath="jr:PRICE"/> </s:unique> </s:element> Spécifie qu'il n'y a pas deux entrées avec à la fois le même nom scientifique et le même prix
Expressions Xpath (1/6) Dans s:selector et s:field, xpath contient une expression Xpath Langage normalisé par le W3C aussi <s:unique name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:unique> PLANT noeud à identifier COMMON BOTANICAL ZONE Bloodroot 4 Sanguinaria Canadensis identifiant
Expressions Xpath (2/6) Autres expressions Xpath utilisables dans s:unique <s:unique name="common"> <s:selector xpath="jr:PLANT/jr:COMMON"/> <s:field xpath="."/> </s:unique> CATALOG PLANT COMMON BOTANICAL ZONE noeud à identifier Bloodroot 4 Sanguinaria Canadensis identifiant
Expressions Xpath (3/6) Attributs <s:field xpath="@number"/> <s:field xpath="attribute::number"/> ... PLANT noeud à identifier number="27" NAME ZONE LIGHT identifiant COMMON BOTANICAL 4 Mostly Shady normalized= "bloodroot" Bloodroot Sanguinaria Canadensis
Expressions Xpath (4/6) <s:field xpath="jr:NAME/jr:COMMON"/> noeud à identifier PLANT ... number="27" NAME ZONE LIGHT COMMON BOTANICAL 4 Mostly Shady normalized= "bloodroot" Bloodroot Sanguinaria Canadensis identifiant
Expressions Xpath (5/6) <s:field xpath=".//jr:COMMON"/> noeud à identifier PLANT ... number="27" NAME ZONE LIGHT COMMON BOTANICAL 4 Mostly Shady normalized= "bloodroot" Bloodroot Sanguinaria Canadensis identifiant
Expressions Xpath (6/6) <s:field xpath=".//jr:COMMON/@normalized"/> noeud à identifier PLANT ... number="27" NAME ZONE LIGHT COMMON BOTANICAL 4 Mostly Shady normalized= "bloodroot" Bloodroot Sanguinaria Canadensis identifiant
s:key Comme <s:unique> mais spécifie que - les contenus des COMMON présents dans un même CATALOG sont tous distincts - chaque noeud PLANT en contient un et un seul <s:key name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:key>
Déclarer des références à des identifiants (1/5) Garantir qu'un identificateur est identique à un des identifiants déclarés par s:unique ou s:key Exemple : références aux plantes de même nom scientifique <PLANT id="16"> <COMMON>Violet, Dog-Tooth</COMMON> <BOTANICAL> <GENUS>Erythronium</GENUS> <SPECIES>americanum</SPECIES> </BOTANICAL> (...) <seeAlso>Trout Lily</seeAlso> <seeAlso>Adder's-Tongue</seeAlso> </PLANT> <PLANT id="17"> <COMMON>Trout Lily</COMMON>
Déclarer des références à des identifiants (2/5) Spécifie que le contenu de chaque seeAlso est identique à un des identifiants (même valeur et même type) et que chaque seeAlso en contient au plus un (inutile ici) <s:element name="CATALOG"> <s:complexType> (...) </s:complexType> <s:key name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:key> <s:keyref name="commonRefs" refer="jr:common"> <s:selector xpath="jr:PLANT/jr:seeAlso"/> <s:field xpath="."/> </s:keyref> </s:element>
Déclarer des références à des identifiants (3/5) "domaine" pour l'unicité CATALOG PLANT PLANT noeud identifié noeud référence BOTANICAL seeAlso COMMON BOTANICAL Erythronium americanum Trout Lily Trout Lily Erythronium americanum référence identifiant <s:keyref name="commonRefs" refer="jr:common"> <s:selector xpath="jr:PLANT/jr:seeAlso"/> <s:field xpath="."/> </s:keyref>
Déclarer des références à des identifiants (4/5) s:keyref fait référence à une déclaration s:unique ou s:key <s:element name="CATALOG"> (...) <s:key name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:key> <s:keyref name="commonRefs" refer="jr:common"> <s:selector xpath="jr:PLANT/jr:seeAlso"/> <s:field xpath="."/> </s:keyref> </s:element> On peut avoir plusieurs références au même identifiant Les noeuds du s:selector du s:keyref peuvent ne contenir aucune référence
Déclarer des références à des identifiants (5/5) L'élément auquel on attache s:keyref doit être soit l'élément auquel on a attaché s:unique ou s:key, soit un ancêtre de cet élément Si on attache s:keyref à un ancêtre, cela renforce la contrainte d'unicité : pour les références présentes, les identifiants doivent être uniques sur l'ensemble des domaines du s:unique ou du s:key, et non sur chaque domaine séparément
s:ID ou s:unique s:ID Plus simple Type prédéfini s:IDREFS s:unique et s:key Plus puissant : - Type des identifiants libre, y compris numéros et n-uplets - La portée de l'unicité n'est pas nécessairement tout le document - Plusieurs jeux d'identifiants possibles pour un même document
Une grammaire en plusieurs schémas Grammaires complexes Documents complexes Nouvelles variantes de projets existants Objectifs Répartir une grosse grammaire en plusieurs schémas Réutiliser Laisser un schéma ouvert à une évolution future 3 solutions
Solution 1 : s:include (1/2) <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio"> <s:include schemaLocation="audio-piste.xsd"/> <s:element name="iTunes"> <s:complexType> <s:sequence> <s:element ref="aud:Major_Version"/> <s:element ref="aud:Minor_Version"/> <s:element ref="aud:Application_Version"/> <s:element ref="aud:Music_Folder"/> <s:element ref="aud:Library_Persistent_ID"/>
Solution 1 : s:include (2/2) <?xml version="1.0" encoding="UTF-8"?> <!-- audio-piste.xsd --> <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/audio" xmlns:aud="http://igm.univ-mlv.fr/~laporte/audio"> <s:element name="Track"> <s:complexType> <s:sequence> <s:element ref="aud:Track_ID"/> <s:element ref="aud:Name"/> <s:element ref="aud:Artist"/> <s:element minOccurs="0" ref="aud:Composer"/>
s:include Un schéma principal coordonne les autres Le schéma principal dépend des autres Il doit être construit et maintenu en tenant compte des autres Les modules inclus doivent avoir le même espace de noms cible Dans chaque module, répéter les déclarations
Coexistence de plusieurs espaces de noms Insérer des parties en XHTML dans le catalogue de plantes <PLANT family="Ranunculaceae"> <COMMON>Anemone</COMMON> ... <AVAILABILITY>122698</AVAILABILITY> <xh:div> <xh:img src="http://.../images/chargimages/121.jpg" alt="Anemone blanda"/> Bulbe rustique de la famille des renonculacées<xh:br/><xh:br/> FEUILLAGE : Feuilles très lobées vert foncé semi érigées<xh:br/> Le document a deux espaces de noms et deux schémas
Solution 2 : s:import (1/2) L'espace de noms principal du document est celui de l'élément racine Le schéma principal est le schéma correspondant Il importe les autres schémas <?xml version="1.0" encoding="UTF-8"?> <!-- plusieursEN.xsd --> <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://igm.univ-mlv.fr/~laporte/jardinerie" xmlns:jr="http://igm.univ-mlv.fr/~laporte/jardinerie" xmlns:xh="http://www.w3.org/1999/xhtml"> <s:import namespace="http://www.w3.org/1999/xhtml" schemaLocation="http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd"/> <s:element name="CATALOG"> <s:complexType>
Solution 2 : s:import (2/2) <s:element name="PLANT"> <s:complexType> <s:sequence> <s:element ref="jr:COMMON"/> (...) <s:element ref="jr:AVAILABILITY"/> <s:element ref="xh:div" minOccurs="0"/> </s:sequence> <s:attribute name="family" type="s:NCName"/> </s:complexType> </s:element> Déclarer des préfixes pour les espaces de noms Exception : l'espace de noms xml, inutile de le déclarer <s:attribute ref="xml:lang"/>
s:import Un schéma principal coordonne les autres Le schéma principal dépend des autres Il doit être construit et maintenu en tenant compte des autres Un schéma importé doit avoir un autre espace de noms cible Le document cible peut contenir des éléments spécifiés dans le schéma importé Ces éléments ont l'espace de noms importé
Solution 3 : s:any (1/2) Le document cible fait référence aux deux schémas Celui qui correspond à l'élément racine et à son espace de noms s'applique en premier <?xml version="1.0" encoding="ISO-8859-1"?> <!-- plantCatalogTextAny.xml --> <CATALOG xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://igm.univ-mlv.fr/~laporte/jardinerie http://igm.univ-mlv.fr/~laporte/xml/schema/plusieursEN-any.xsd http://www.w3.org/1999/xhtml http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd" xmlns="http://igm.univ-mlv.fr/~laporte/jardinerie" xmlns:xh="http://www.w3.org/1999/xhtml"> <PLANT family="Papaveraceae">
Solution 3 : s:any (2/2) Le schéma qui s'applique en premier appelle l'autre par s:any s:any ne spécifie pas quel élément peut apparaître <s:element name="PLANT"> <s:complexType> <s:sequence> <s:element ref="jr:COMMON"/> (...) <s:element ref="jr:AVAILABILITY"/> <s:any namespace="http://www.w3.org/1999/xhtml" minOccurs="0"/> </s:sequence> <s:attribute name="family" type="s:NCName"/> </s:complexType> </s:element>
Référence à plusieurs schémas XML On peut faire référence à n schémas indépendants La valeur d'attribut contient 2n chaînes séparées par des espaces Le document cible doit être valide par rapport à chaque schéma indépendamment xsi:schemaLocation="espace-de-noms-1 URL-1.xsd espace-de-noms-2 URL-2.xsd" xmlns="espace-de-noms-1" xmlns:en2="espace-de-noms-2">
Espaces de noms acceptés <s:any namespace="http://www.w3.org/1999/xhtml"/> Le validateur accepte un espace de noms spécifique <s:any namespace="##any"/> ou <s:any/> Le validateur accepte n'importe quel espace de noms (défaut) <s:any namespace="##other"/> Le validateur accepte tout espace de noms autre que l'espace de noms cible, et valide par rapport au schéma correspondant
Contrôle de la validation <s:any namespace="http://www.w3.org/1999/xhtml" process-contents="strict"/> Le validateur vérifie la validité par rapport au schéma (défaut) process-contents="lax"/> Le validateur vérifie la validité seulement si le schéma correspondant à l'espace de noms est disponible <s:any process-contents="skip"/> Le validateur saute cette partie
<s:anyAttribute> Permettre n'importe quels attributs <s:element name="PLANT"> <s:complexType> <s:sequence> <s:element ref="jr:COMMON"/> (...) <s:element ref="jr:AVAILABILITY"/> </s:sequence> <s:anyAttribute processContents="skip"/> </s:complexType> </s:element>
Schéma d'un document cible sans espace de noms (1/2) L'élément racine du document cible n'a pas d'espace de noms Le schéma ne peut valider que des documents sans espace de noms ("schéma caméléon") Ce n'est pas une bonne pratique <?xml version="1.0" encoding="ISO-8859-1"?> <Tracks> <Track> <?xml version="1.0" encoding="UTF-8"?> <!-- collection-chameleon.xsd --> <s:schema xmlns:s="http://www.w3.org/2001/XMLSchema"> <s:element name="Tracks"> <s:complexType>
Schéma d'un document cible sans espace de noms (2/2) Le document cible peut faire référence au schéma <?xml version="1.0" encoding="utf-8"?> <Tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://igm.univ-mlv.fr/~laporte/xml/schema/collection-chameleon.xsd"> <Track>
Schémas caméléons Les schémas inclus (s:include) doivent avoir le même espace de noms cible que le schéma principal Si le schéma inclus n'a pas d'espace de noms cible, les noms déclarés dedans passent automatiquement dans l'espace de noms cible du schéma principal