+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité de passage
    Inscrit en
    octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 10
    Points : 0
    Points
    0

    Par défaut [RELAX NG] [Emacs, mode nXML] Correspondance entre les grammaires XML Schema et Relax NG (surtout les es

    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 :
    Code :
    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>
    Et le document à valider est :
    Code :
    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">&#922;&#959;&#955;&#959;&#963;&#963;&#972;&#962; &#964;&#951;&#962; &#929;&#972;&#948;&#959;&#965;</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>
    Je convertis le schéma type W3 en Relax NG non-compact :
    Code :
    1
    2
     
        :-)  $ xsltproc -o 13-07.rng ./XSDtoRNG.xsl 13-07.xsd
    Là, je tente conversion Relax NG non-compact en Relax NG compact :
    Code :
    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
     :-)  $
    L'erreur provient du fait que typeHistoire a un attribut mixed="true".
    Je corrige à la main le fichier rng comme suit :
    Code :
    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>
    Et là, je peux faire :
    Code :
    1
    2
    3
     
        :-)  $ trang -I rng -O rnc 13-07.rng 13-07.rnc 
        :-)  $
    Plus de message d'erreur.

    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 :
    Code :
    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 }
    On peut constater que ce langage mérite bien sont adjectif de "compact"!

    Maintenant, il me reste deux erreurs irréductibles.
    A)
    Code :
    1
    2
     
         xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd"
    Avec le message :
    Attribute not allowed.
    B)
    Code :
    1
    2
     
    	        <image_principale fichier="colossus.jpg" l="528" h="349"/>
    Avec le message :
    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.

  2. #2
    Membre Expert
    Inscrit en
    octobre 2011
    Messages
    700
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 700
    Points : 1 225
    Points
    1 225

    Par défaut

    Citation Envoyé par Valrik Voir le message
    Missing xmlns="http://www.kehogo.com/ns/mdm/1.0"
    Puique image_principale ne vit pas dans cette espace, c'est evidemment de l'impliquer de cela avec l'espace de nom default.

    Il faut prendre ces mesures.
    [1] Ajouter une espace null dans la partie de déclarations.
    Code :
    1
    2
     
    namespace local=""
    [2] Et puis, la ligne d'image_principale doit être ecrite comme ça.
    Code :
    1
    2
     
      element local:image_principale { typeImage },

  3. #3
    Invité de passage
    Inscrit en
    octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 10
    Points : 0
    Points
    0

    Par défaut

    Impeccable! tsuji. :-)
    J'ai compris mon erreur et maintenant je n'ai plus d'erreur sur cette ligne.

    Reste l'erreur sur xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd" avec xsi:schemaLocation qui passe au rouge.

    Il y a bien une solution un peu barbare...
    Code :
    1
    2
    3
    4
    5
    6
     
    <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">
    -->
    Ainsi, la barre d'état passe à "Valid", mais ce n'est pas très élégant de procéder ainsi!

    J'aimerais avoir à ne pas modifier le fichier xml en fonction du type de schéma.

  4. #4
    Membre Expert
    Inscrit en
    octobre 2011
    Messages
    700
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 700
    Points : 1 225
    Points
    1 225

    Par défaut

    Reste l'erreur sur xsi:schemaLocation="http://www.kehogo.com/ns/mdm/1.0 13-07.xsd" avec xsi:schemaLocation qui passe au rouge.
    Tous les processeurs de wxsl doivent supporter tacitement l'espace de nom XMLSchema-instance. Mais cela n'a evidemment pas de sens pour un processeur de relaxng. Si vous voulez les laisser passer, vous pouvez faire comme cela.

    [3] Déclarer un préfix comme xsi dans la section propre.
    Code :
    1
    2
     
    namespace xsi="http://www.w3.org/2001/XMLSchema-instance"
    [4) Et puis, ajouter ceci dans la racine du document.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
     
    anciennes_merveilles =
      element anciennes_merveilles {
        (attribute xsi:schemaLocation {list {xsd:anyURI+}} 
        |attribute xsi:noNamespaceSchemaLocation {xsd:anyURI}
        )?,
        element merveille { typeMerveille }+
      }
    Les types de ces attributs ne sont peut-être pas les meilleurs - je n'y ai pas pensé trop, mais ça peut travailler déjà raisonnablement bien.

  5. #5
    Invité de passage
    Inscrit en
    octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 10
    Points : 0
    Points
    0

    Par défaut

    Et bien, ma foi, tout cela me paraît raisonnablement parfait. Ça fonctionne super! Plus aucune erreur.

    En fait, si je comprends bien, il faut traiter l'élément racine comme un élément ordinaire qui posséderait des attributs dont les valeurs sont des espaces de noms.

    Un grand merci pour ton aide précieuse. ;-)

  6. #6
    Invité de passage
    Inscrit en
    octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 10
    Points : 0
    Points
    0

    Par défaut

    Oups! Je viens de m'apercevoir que j'avais fait un erreur.

    En effet, j'avais oublié de coller namespace xsi="http://www.w3.org/2001/XMLSchema-instance" après la kyrielle de "namespaces". Et lorsque j'ai rectifié le code, je me suis retrouvé dans le même cas de figure qu'au début.

    Voila le code qui provoque une erreur :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    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"
    namespace xsi="http://www.w3.org/2001/XMLSchema-instance"
    namespace local = ""
     
    start = anciennes_merveilles
    anciennes_merveilles =
       (attribute xsi:schemaLocation {list {xsd:anyURI+}} 
        |attribute xsi:noNamespaceSchemaLocation {xsd:anyURI}
       )?,
       element anciennes_merveilles {
          element merveille { typeMerveille }+
       }
    typeMerveille =
       element nom { typeNom }+,
       element lieu { ...
    Et voici l'emplacement de l'erreur détectée dans le fichier xml :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?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">
        __________________
               |
               |_____ En erreur! (Attribute not allowed)

  7. #7
    Membre Expert
    Inscrit en
    octobre 2011
    Messages
    700
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 700
    Points : 1 225
    Points
    1 225

    Par défaut

    Je ne peux pas confirmer mais ça n'engage que moi.

  8. #8
    Invité de passage
    Inscrit en
    octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 10
    Points : 0
    Points
    0

    Par défaut

    Que veux tu dire par là? Qu'il y a une incohérence entre ton application et Emacs?

    En tout cas, puisque l'attribut xsi:schemaLocation n'a pas de signification particulière, je serais pour ne pas déclarer le namespace. Après tout, cela fonctionne fort bien sans. Qu'en penses-tu?

    J'ai l'impression que si cet espace de noms n'est pas déclaré, l'argument est traité comme une vulgaire chaîne de caractères dont le contenu est "xsi:schemaLocation". Et ainsi, le code xml correspond bien au schéma.

  9. #9
    Membre Expert
    Inscrit en
    octobre 2011
    Messages
    700
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 700
    Points : 1 225
    Points
    1 225

    Par défaut

    C'est fort bien si tu es content que l'attribut schemaLocation ne soit pas là par quelque moyen que ce soit. Mais je veux dire qu'il soit toléré par l'addition que j'ai mise là dans le rnc. Je n'ai rien à dire de plus en Emac, peut-être pour un jour ultérier, je ne sais pas.

  10. #10
    Invité de passage
    Inscrit en
    octobre 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : octobre 2010
    Messages : 10
    Points : 0
    Points
    0

    Par défaut

    OK, et merci encore pour ton aide.


+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •