Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 343
    Points : 234
    Points
    234
    Par défaut Gérer les références et les attributs d'une balise + question element maxOccurs
    Bonjour à tout le monde,

    Je débute avec le XML/XSD et j'ai un petit problème avec un schéma XSD que je voudrais faire. Voici le contexte (exemple purement fictif, je ne peux pas partager l'entièreté du code) :

    J'ai une balise "Ident" qui contient elle même trois balises (Sex, FirstName, LastName), mais qui contient aussi deux attributs pour elle : type (passport obligatoirement), et le pays qui doit être dans contenu dans les trois pays suivants : France, Anglette, ou Pays-Bas.
    Je ne sais pas trop comment je dois faire pour aller les deux dans mon XSD. Voici le code

    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
     
    <xsd:element name="Ident">  
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="sex"/>
            <xsd:element ref="firstName"/>
            <xsd:element ref="lastName"/>
          </xsd:sequence>
          <xsd:simpleContent>
            <xsd:extension base="xsd:string">
              <xsd:attribute name="type"  use="optional" fixed="passport"/>
              <xsd:attribute name="Country" use="required">
                <xsd:simpleType>
                  <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="France"/>
                    <xsd:enumeration value="Angleterre"/>
                    <xsd:enumeration value="Pays-Bas"/>
                  </xsd:restriction>
                </xsd:simpleType>
              </xsd:attribute>
            </xsd:extension>
          </xsd:simpleContent>
        </xsd:complexType>
      </xsd:element>
    J'ai entré mon XML et mon XSD dans un validateur en ligne et j'obtiens ce warning : The content of '#AnonType_livre' is invalid. Element 'simpleContent' is invalid, misplaced, or occurs too often.
    Il indique clairement les lignes simpleContent du code que j'indique plus haut.

    Je voudrais déjà savoir si un XSD avec des warnings uniquement peut être considéré comme correct ou non.
    Ensuite, pourriez-vous m'aiguiller pour ce que je souhaite faire ?

    Enfin j'ai une question bonus au sujet des maxOccurs, j'en ai mis plein dans mon XSD sur des elements, j'ai vu ça sur Internet. Mais j'ai des warnings : Attribute 'maxOccurs' cannot appear in element 'element'.

    Par exemple sur ce code-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsd:element name="firstName"     type="xsd:string" maxOccurs="1"/>
    Avez-vous une idée ? Des versions différentes de XSD/XML utilisées ? Je ne sais pas...

    Merci beaucoup,

    alers

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    octobre 2011
    Messages
    1 344
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 344
    Points : 2 374
    Points
    2 374
    Par défaut
    [0] Pous s'ajouter les attributs type et Country, on fait comme ça.
    Code xsd : 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
    <xsd:element name="Ident">  
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="sex"/>
                <xsd:element ref="firstName"/>
                <xsd:element ref="lastName"/>
            </xsd:sequence>
            <xsd:attribute name="type" use="optional" fixed="passport" />
            <xsd:attribute name="Country" use="required">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="France"/>
                        <xsd:enumeration value="Angleterre"/>
                        <xsd:enumeration value="Pays-Bas"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:attribute>
        </xsd:complexType>
    </xsd:element>

    [1] La cardinalité ne pourrait mettre dans des éléments globaux, c'est-à-dire des xsd:element directement sous xsd:schema, la racine. Ce ne devrait pas un "warning", c'est une erreur et la moteur devrait s'arrêter tout court. Par exemple, le fragment fait référence à xsd:element name="firstName" qui devrait être précisément un élément global dans ce sens: il ne devrait pas y avoir un attribut @maxOccurs ou @minOccurs. Pour dire que firstName puisse avoir plusieurs, 3 par exemple, on fait ça.
    Code xsd : Sélectionner tout - Visualiser dans une fenêtre à part
                <xsd:element ref="firstName" maxOccurs="3' />
    Mais, pas ça.
    Code xsd : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <!-- etc -->
    <xsd:element name="firstName" type="xsd:string" maxOccurs="3" />    <!-- c'est faux. -->
    <!-- etc -->
    </xsd:schema>
    [1.1] Ou bien, si c'est local, c'est permis.
    Code xsd : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                <xsd:element ref="sex"/>
                <xsd:element name="firstName" maxOccurs="3" />
                <xsd:element ref="lastName"/>

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 343
    Points : 234
    Points
    234
    Par défaut
    Ça fonctionne comme ça, merci beaucoup !

    Si je comprends bien pour les maxOccurs, la règle serait : si un xsd:element est déclaré en référence quelque part, alors le maxOccurs doit être placé à l'endroit où est déclarée la différence (pas dans le bloc de l'élément en question). C'est bien ça ?

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    octobre 2011
    Messages
    1 344
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 344
    Points : 2 374
    Points
    2 374
    Par défaut
    Si je comprends bien pour les maxOccurs, la règle serait : si un xsd:element est déclaré en référence quelque part, alors le maxOccurs doit être placé à l'endroit où est déclarée la différence (pas dans le bloc de l'élément en question). C'est bien ça ?
    Pas tout à fait : l'essentiel est que la cardinalité ne puisse être parue que dans des éléments xsd:element locaux (muni un @ref ou un @name n'est peu importe). Qu'elle ne puisse absolument pas être parue dans des éléments xsd:element globaux. La raison est quelque peu comme ça : un element global xsd:element est tout à fait capable d'être utilisé pour valider un document où le balise de son nom soit la raicine du document lui-même. Or il n'a pas de sens d'avoir une cardinalité qui ne soit pas (1, 1) pour (minOccurs, maxOccurs). C'est du raisonnement primaire.

Discussions similaires

  1. Personnaliser les attributs d'une balise html
    Par artistenherbe dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 09/05/2012, 19h11
  2. [WD16] Afficher les attributs d'une balise XML
    Par bombseb dans le forum WinDev
    Réponses: 8
    Dernier message: 01/03/2012, 15h43
  3. Recuperer les attributs d'une balise XML
    Par chwal dans le forum Langage
    Réponses: 2
    Dernier message: 21/08/2010, 14h40
  4. Avoir tous les attributs d'une balise
    Par Nulenprogra dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/10/2007, 19h21
  5. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo