Bonjour à tous.
Voila, je suis un utilisateur intensif d'Emacs et je dois me mettre au langage XML. Pour cette dernière raison, j'ai acheté, sur conseil de ce site, le livre "Petit manuel de prise en main de XML". Il est parfait pour débuter.
Pour en revenir à Emacs, le mode majeur, maintenant par défaut, du langage XML est nXML. Il fonctionne à merveille. Mais il a l'inconvénient (ou peut être l'avantage?) d'utiliser les schémas Relax NG compact.
J'ai donc du me mettre également à ce langage qui me semble extrêmement puissant. En effet, par rapport aux schémas du W3 on réduit par trois ou quatre le volume du fichier.
Outre le fait qu'il faut que j'apprenne un langage supplémentaire, et je ne parle pas de la version non compact de Relax NG, j'ai pas mal de difficultés pour convertir les schémas type W3 (.xsd) en Relax NG compact.
Il y a bien trang, qui permet des conversions automatiques, mais il lui manque le passage de XML Schema en relax NG dans ses deux formes.
Néanmoins, il existe un fichier XSLT, qui comble cette lacune. Il s'agit de XSDtoRNG.xsl. Il semble fonctionner correctement hormis le fait qu'il ne gère pas les éléments avec un attribut mixed="true". Une petite rectification, à la main et à posteriori directement dans le ficher ".rng", règle le problème.
Je vais prendre un exemple concret à partir du livre déjà cité.
Le point de départ est le schéma W3 :
Et le document à valider est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.kehogo.com/ns/mdm/1.0" targetNamespace="http://www.kehogo.com/ns/mdm/1.0" elementFormDefault="qualified"> <xs:element name="anciennes_merveilles"> <xs:complexType> <xs:sequence> <xs:element name="merveille" type="typeMerveille" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="typeMerveille"> <xs:sequence> <xs:element name="nom" type="typeNom" maxOccurs="unbounded"/> <xs:element name="lieu" type="xs:string"/> <xs:element name="hauteur" type="typeHauteur"/> <xs:element name="historique" type="typeHistorique"/> <xs:element name="image_principale" type="typeImage" form="unqualified"/> <xs:element name="source" type="typeSource" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="typeNom"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="langue" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="typeHauteur"> <xs:simpleContent> <xs:extension base="xs:nonNegativeInteger"> <xs:attribute name="unité" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="typeHistorique"> <xs:sequence> <xs:element name="année_construction" type="typeAnnée"/> <xs:element name="année_destruction" type="typeAnnée" minOccurs="0"/> <xs:element name="motif_destruction" type="typeDestr" minOccurs="0"/> <xs:element name="histoire" type="typeHistoire"/> </xs:sequence> </xs:complexType> <xs:complexType name="typeAnnée"> <xs:simpleContent> <xs:extension base="xs:positiveInteger"> <xs:attribute name="ère" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:simpleType name="typeDestr"> <xs:restriction base="xs:string"> <xs:enumeration value="tremblement de terre"/> <xs:enumeration value="incendie"/> </xs:restriction> </xs:simpleType> <xs:complexType name="typeHistoire" mixed="true"> <xs:sequence> <xs:element name="para" minOccurs="0" maxOccurs="unbounded"> <xs:complexType/> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="typeImage"> <xs:attribute name="fichier" type="xs:anyURI" use="required"/> <xs:attribute name="l" type="xs:positiveInteger" use="required"/> <xs:attribute name="h" type="xs:positiveInteger" use="required"/> </xs:complexType> <xs:complexType name="typeSource"> <xs:attribute name="idsection" type="xs:positiveInteger" use="required"/> <xs:attribute name="idjournal" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:schema>
Je convertis le schéma type W3 en Relax NG non-compact :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 <?xml version="1.0"?> <!-- Note : Les experts ne sont pas d'accord sur les dates précises ou les dimensions de la plupart des merveilles. Dans ce cas, j'ai choisi une année ou une dimension médiane afin que tous les attributs soient numériques. --> <mdm:anciennes_merveilles xmlns:mdm="http://www.kehogo.com/ns/mdm/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd"> <!-- Cet exemple ne contient qu'une seule merveille. --> <mdm:merveille> <mdm:nom langue="Français">Le colosse de Rhodes</mdm:nom> <mdm:nom langue="Grec">Κολοσσός της Ρόδου</mdm:nom> <mdm:lieu>Rhodes en Grèce</mdm:lieu> <mdm:hauteur unité="mètres">32</mdm:hauteur> <mdm:historique> <mdm:année_construction ère="BC">282</mdm:année_construction> <mdm:année_destruction ère="BC">226</mdm:année_destruction> <mdm:motif_destruction>tremblement de terre</mdm:motif_destruction> <mdm:histoire> En 294 avant J.C., les habitants de l'île de Rhodes ont commencé la construction d'une gigantesque statue de Hélios, le dieu du soleil. Ils pensaient en effet que c'était grâce à lui qu'ils avaient pu soutenir un long siège de l'île et en ressortir vainqueurs.<mdm:para/>Le colosse était construit en bronze renforcé de fer et alourdi par des pierres. Bien qu'il soit souvent représenté comme enjambant le port de Mandrákion, nous savons aujourd'hui que c'est techniquement impossible et qu'il devait donc probablement être situé à côté de ce port.<mdm:para/>La statue s'effondra à la suite d'un tremblement de terre en 226 avant J.C. Elle se brisa au niveau des genoux et se coucha au sol. L'oracle de Delphes annonça qu'elle était tombée parce que le peuple de Rhodes avait offensé Hélios et ils décidèrent donc de ne pas la reconstruire.<mdm:para/>La statue resta au sol jusqu'en 654 après J.C. Même brisée, elle était si impressionnante que beaucoup faisaient le voyage pour la contempler. </mdm:histoire> </mdm:historique> <image_principale fichier="colossus.jpg" l="528" h="349"/> <mdm:source idsection="101" idjournal="21"/> </mdm:merveille> </mdm:anciennes_merveilles>
Là, je tente conversion Relax NG non-compact en Relax NG compact :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 :-) $ xsltproc -o 13-07.rng ./XSDtoRNG.xsl 13-07.xsd
L'erreur provient du fait que typeHistoire a un attribut mixed="true".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 :-) $ trang -I rng -O rnc 13-07.rng 13-07.rnc ~/tmp/essai_relax/livre_ch_13/tmp/13-07-06/13-07.rng:67:27: error: missing children :-) $
Je corrige à la main le fichier rng comme suit :
Et là, je peux faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <rng:define name="typeHistoire"> <rng:zeroOrMore> <rng:text/> <rng:element name="para"> <rng:text/> </rng:element> <rng:text/> </rng:zeroOrMore> </rng:define>
Plus de message d'erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 :-) $ trang -I rng -O rnc 13-07.rng 13-07.rnc :-) $
Je suis donc maintenant l'heureux possesseur d'un schéma NG compact fonctionnel. En fait, pas vraiment, car lorsque je charge le fichier XML exemple du livre, Emacs me stipule qu'il n'est pas valide. En réalité, il l'est effectivement puisque c'est l'exemple du livre et donc, il doit y avoir un problème dans le schéma.
Tout d'abord, je règle les erreurs les plus faciles à résoudre : Beaucoup de données ne sont pas au bon format d'après le schéma. Pas exemple, la donnée "nom". J'ajoute donc dans mon schéma, xsd:string au typeNom. Même principe pour typeHauteur et typeAnnée avec un entier positif.
Le code définitif est donc :
On peut constater que ce langage mérite bien sont adjectif de "compact"!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 default namespace = "http://www.kehogo.com/ns/mdm/1.0" namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" namespace rng = "http://relaxng.org/ns/structure/1.0" start = anciennes_merveilles anciennes_merveilles = element anciennes_merveilles { element merveille { typeMerveille }+ } typeMerveille = element nom { typeNom }+, element lieu { xsd:string }, element hauteur { typeHauteur }, element historique { typeHistorique }, element image_principale { typeImage }, element source { typeSource }* typeNom = attribute langue { xsd:string }, xsd:string typeHauteur = attribute unité { xsd:string }, xsd:positiveInteger typeHistorique = element année_construction { typeAnnée }, element année_destruction { typeAnnée }?, element motif_destruction { typeDestr }?, element histoire { typeHistoire } typeAnnée = attribute ère { xsd:string }, xsd:positiveInteger typeDestr = "tremblement de terre" | "incendie" typeHistoire = (text, element para { text }, text)* typeImage = attribute fichier { xsd:anyURI }, attribute l { xsd:positiveInteger }, attribute h { xsd:positiveInteger } typeSource = attribute idsection { xsd:positiveInteger }, attribute idjournal { xsd:positiveInteger }
Maintenant, il me reste deux erreurs irréductibles.
A)
Avec le message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd"B)Attribute not allowed.
Avec le message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2<image_principale fichier="colossus.jpg" l="528" h="349"/>
Missing xmlns="http://www.kehogo.com/ns/mdm/1.0"
J'ai cherché sur internet une solution à mon problème, mais il semblerait que relax NG ne soit pas beaucoup utilisé. Il y a donc peut d'écrits sur ce sujet.
Quelqu'un peut-il m'éclairer sur les correspondances entre les XML Schemas et les schémas Relax NG? Tout particulièrement au sujet des espaces de noms et de leurs attributs, c'est là que je bute comme le montre l'exemple.
Merci d'avance pour votre aide.
Partager