1 Schémas XML - cours 2 Éric Laporte Institut Gaspard-Monge Université Paris-Est...

Post on 04-Apr-2015

106 views 0 download

Transcript of 1 Schémas XML - cours 2 Éric Laporte Institut Gaspard-Monge Université Paris-Est...

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