1 schémas xml - cours 2 Éric laporte institut gaspard-monge université paris-est marne-la-vallée
TRANSCRIPT
1
Schémas XML - cours 2
Éric Laporte
Institut Gaspard-Monge
Université Paris-Est Marne-la-Vallée
2
Sommaire
Valider un seul élément 4
Déclarations locales 7
Identifiants et références 13
Modularisation 41
3
4. Valider un élément (1/2)
5. Valider un élément (2/2)
6. Schéma pour plusieurs types de documents
7. Contraindre l'élément racine (1/2)
8. Contraindre l'élément racine (2/2)
9. Éléments déclarés en local (1/3)
10. Éléments déclarés en local (2/3)
11. Éléments déclarés en local (3/3)
12. Déclarations locales ou globales
13. Identifiants
14. Déclarer des identifiants
15. Le type simple s:ID (1/2)
16. Le type simple s:ID (2/2)
17. Références à des identifiants (1/2)
18. Références à des identifiants (2/2)
19. Listes de références à des identifiants (1/2)
20. Listes de références à des identifiants (2/2)
21. Identifiants et références
22. s:unique (1/6)
23. s:unique (2/6)
24. s:unique (3/6)
25. s:unique (4/6)
26. s:unique (5/6)
27. s:unique (6/6)
28. Expressions Xpath (1/6)
29. Expressions Xpath (2/6)
30. Expressions Xpath (3/6)
31. Expressions Xpath (4/6)
32. Expressions Xpath (5/6)
33. Expressions Xpath (6/6)
34. s:key
35. Déclarer des références à des identifiants (1/5)
36. Déclarer des références à des identifiants (2/5)
37. Déclarer des références à des identifiants (3/5)
38. Déclarer des références à des identifiants (4/5)
39. Déclarer des références à des identifiants (5/5)
40. s:ID ou s:unique
41. Une grammaire en plusieurs schémas
42. Solution 1 : s:include (1/2)
43. Solution 1 : s:include (2/2)
44. s:include
45. Coexistence de plusieurs espaces de noms
46. Solution 2 : s:import (1/2)
47. Solution 2 : s:import (2/2)
48. s:import
49. Solution 3 : s:any (1/2)
50. Solution 3 : s:any (2/2)
51. Référence à plusieurs schémas XML
52. Espaces de noms acceptés
53. Contrôle de la validation
54. <s:anyAttribute>
55. Schéma d'un document cible sans espace de noms (1/2)
56. Schéma d'un document cible sans espace de noms (2/2)
57. Schémas caméléons
4
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>
5
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"/>
6
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:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" ref="jr:ITEM"/> </s:sequence> </s:complexType> </s:element>(...)
7
Contraindre l'élément racine (1/2)
On veut imposer aud:iTunes comme seul élément racine possibleDé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">
8
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:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="Track"> <s:complexType> <s:sequence>
9
É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:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="Track">
10
É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:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="unbounded" name="Track"> <s:complexType> <s:sequence> <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"/>
11
É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"/>
12
Déclarations locales ou globales
Déclarations localesPlus strict : les éléments ne peuvent être que là où on les a
déclarésPossibilité de surcharge : utiliser le même nom d'élément
pour autre chose ailleurs
Déclarations globalesPlus souple : les éléments peuvent apparaître à la racinePlus de réutilisationPlus lisible : plus faciles à trouver dans le schéma
On peut mélanger
13
Identifiants
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
<!--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"/>
14
Déclarer des identifiants
Garantir qu'un ensemble de valeurs sont toutes différentesExemple : 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> <td id="la_courneuve___8_mai_1945" headers="station" class="gauche"> <strong>La Courneuve - 8 Mai 1945</strong> </td>
15
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>
16
Le type simple s:ID (2/2)
Valeurs : obligatoirement des identificateurs sans ":"Ne convient pas pour des identifiants numériques ou
contenant des espaceselement 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> <PLANT family="Ranunculaceae">
<COMMON>Marsh Marigold</COMMON> <BOTANICAL>Caltha palustris</BOTANICAL>
17
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> </a> </td>
18
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>
19
Listesde 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"> <GENUS>Erythronium</GENUS> <SPECIES>americanum</SPECIES>
20
Listesde 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:complexType>(...) <s:attribute name="same-name" type="s:IDREFS"/> </s:complexType> </s:element>
21
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
22
s:unique (1/6)Spécifie que les contenus des COMMON dans un même
CATALOG sont tous différentset 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>
23
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>
24
s:unique (3/6)
s:selector spécifie les noeuds qui peuvent avoir un identifiant
s:field spécifie les identifiantsSi 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>
25
s:unique (4/6)
CATALOG
PLANT
BOTANICALCOMMON
BloodrootSanguinaria Canadensis
PLANT
...
ZONE LIGHT
4Mostly Shady
...
noeud à identifier
identifiant
<s:unique name="common"> <s:selector xpath="jr:PLANT"/> <s:field xpath="jr:COMMON"/> </s:unique>
"domaine"pour l'unicité
26
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>
27
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
28
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
BOTANICALCOMMON
BloodrootSanguinaria Canadensis
ZONE
4
noeud à identifier
identifiant
29
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>
PLANT
BOTANICALCOMMON
BloodrootSanguinaria Canadensis
ZONE
4
noeud à identifier
identifiant
CATALOG
30
Expressions Xpath (3/6)
Attributs <s:field xpath="@number"/><s:field xpath="attribute::number"/>
PLANT
NAME
BOTANICALCOMMON
BloodrootSanguinaria Canadensis
ZONE
...
LIGHT
4Mostly Shady
noeud à identifier
identifiantnumber="27"
normalized="bloodroot"
31
Expressions Xpath (4/6)
<s:field xpath="jr:NAME/jr:COMMON"/>
PLANT
NAME
BOTANICALCOMMON
BloodrootSanguinaria Canadensis
ZONE
...
LIGHT
4Mostly Shady
noeud à identifier
identifiant
number="27"
normalized="bloodroot"
32
Expressions Xpath (5/6)
<s:field xpath=".//jr:COMMON"/>
PLANT
NAME
BOTANICALCOMMON
BloodrootSanguinaria Canadensis
ZONE
...
LIGHT
4 Mostly Shady
noeud à identifier
identifiant
number="27"
normalized="bloodroot"
33
Expressions Xpath (6/6)
<s:field xpath=".//jr:COMMON/@normalized"/>
PLANT
NAME
BOTANICALCOMMON
BloodrootSanguinaria Canadensis
ZONE
...
LIGHT
4 Mostly Shady
noeud à identifier
identifiant
number="27"
normalized="bloodroot"
34
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>
35
Déclarerdes 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>
36
Déclarerdes 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>
37
Déclarerdes références à des identifiants (3/5)
CATALOG
PLANT
BOTANICALCOMMON
Trout Lily Erythroniumamericanum
PLANT
seeAlso
Trout Lily
noeud identifié
identifiant
<s:keyref name="commonRefs" refer="jr:common"> <s:selector xpath="jr:PLANT/jr:seeAlso"/> <s:field xpath="."/> </s:keyref>
"domaine"pour l'unicité
BOTANICAL
Erythroniumamericanum
noeudréférence
référence
38
Déclarerdes 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
39
Déclarerdes 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
40
s:ID ou s:unique
s:IDPlus simpleType prédéfini s:IDREFS
s:unique et s:keyPlus 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
41
Une grammaire en plusieurs schémas
Grammaires complexesDocuments complexesNouvelles variantes de projets existants
ObjectifsRépartir une grosse grammaire en plusieurs schémasRéutiliserLaisser un schéma ouvert à une évolution future
3 solutions
42
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"/>
43
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"/>
44
s:include
Un schéma principal coordonne les autresLe schéma principal dépend des autresIl 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
45
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
46
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 correspondantIl 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>
47
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 nomsException : l'espace de noms xml, inutile de le déclarer
<s:attribute ref="xml:lang"/>
48
s:import
Un schéma principal coordonne les autresLe schéma principal dépend des autresIl doit être construit et maintenu en tenant compte des autres
Un schéma importé doit avoir un autre espace de noms cibleLe document cible peut contenir des éléments spécifiés dans
le schéma importéCes éléments ont l'espace de noms importé
49
Solution 3 : s:any (1/2)
Le document cible fait référence aux deux schémasCelui 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">
50
Solution 3 : s:any (2/2)
Le schéma qui s'applique en premier appelle l'autre par s:anys: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>
51
Référence à plusieurs schémas XML
On peut faire référence à n schémas indépendantsLa valeur d'attribut contient 2n chaînes séparées par des
espacesLe document cible doit être valide par rapport à chaque
schéma indépendamment
xsi:schemaLocation="espace-de-noms-1 URL-1.xsdespace-de-noms-2URL-2.xsd"
xmlns="espace-de-noms-1" xmlns:en2="espace-de-noms-2">
52
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
53
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)
<s:any namespace="http://www.w3.org/1999/xhtml" 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
54
<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>
55
Schéma d'un document ciblesans 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>
56
Schéma d'un document ciblesans 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>
57
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