IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Valider XML Discussion :

[XSD] Choix influant sur autres éléments


Sujet :

Valider XML

  1. #1
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 117
    Points : 97
    Points
    97
    Par défaut [XSD] Choix influant sur autres éléments
    Bonjour,

    pour mon application, je suis arrivé au schéma ci-dessous, mais il est incomplet et j'aimerais y apporter les contraintes suivantes :
    - Un PorteConsommable peut avoir SOIT 4, SOIT 16 éléments Consommable, selon qu'il est respectivement de type Cassette ou Portoir (Hors pour l'instant j'ai simplement su mettre des limites)
    - Lorsque le PorteConsommable est de type Cassette, les consommables associés doivent avoir un élément supplémentaire de type string avec les restrictions "Haut|Bas" (ça je sais faire mais pas différencier suivant le type ...)

    Dans les deux cas, mon problème est le même, savoir faire un choix qui ait des incidences sur d'autres éléments.

    Merci d'avance pour votre aide


    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
      <!-- Définitions des éléments -->
      <xs:element name="Comete">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="Plaque"/>
            <xs:element ref="PorteConsommable" maxOccurs="3"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Plaque">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="CAB"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="PorteConsommable">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="Type"/>
            <xs:element ref="CAB"/>
            <xs:element ref="Consommable" minOccurs="4" maxOccurs="16"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="Consommable">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="CAB"/>
          </xs:sequence>
          <xs:attribute name="Position" use="required" type="typePosition"/>
        </xs:complexType>
      </xs:element>
      <xs:element name="Type" type="typePorteConsommable"/>
      <xs:element name="CAB" type="typeCàB"/>
     
      <!-- Définitions des types -->
      <xs:simpleType name="typePosition">
        <xs:restriction base="xs:integer">
          <xs:minInclusive value="1"/>
          <xs:maxInclusive value="16"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType name="typePorteConsommable">
        <xs:restriction base="xs:string">
          <xs:enumeration value="Cassette"/>
          <xs:enumeration value="Portoir"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType name="typeCàB">
        <xs:restriction base="xs:string">
          <xs:pattern value="[0-9]{13}"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:schema>

  2. #2
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 117
    Points : 97
    Points
    97
    Par défaut
    Je vois que ca ne déchaine pas les foules ....

    Je vais essayer de m'expliquer un peu plus clairement par l'exemple.

    Je voudrais que ces deux XML soit validés par le même schéma :
    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
        <PorteConsommables>
                <NomPortoir>Portoir</NomPortoir>
                <CAB>6012918061745</CAB>
                <Ligne Nom="A" Positionnement="Haut">
                    <Consommable Emplacement="1">
                        <CAB>4056873090115</CAB>
                    </Consommable>
                    <Consommable Emplacement="4">
                        <CAB>1600423043422</CAB>
                    </Consommable>
                    <Consommable Emplacement="3">
                        <CAB>8829122765525</CAB>
                    </Consommable>
                    <Consommable Emplacement="2">
                        <CAB>5701212667106</CAB>
                    </Consommable>
                </Ligne>
                <Ligne Nom="A" Positionnement="Bas">
                    <Consommable Emplacement="4">
                        <CAB>7393687111348</CAB>
                    </Consommable>
                    <Consommable Emplacement="1">
                        <CAB>7623684093924</CAB>
                    </Consommable>
                    <Consommable Emplacement="2">
                        <CAB>3762027942134</CAB>
                    </Consommable>
                    <Consommable Emplacement="3">
                        <CAB>2740474106038</CAB>
                    </Consommable>
                </Ligne>
                <Ligne Nom="C" Positionnement="Bas">
                    <Consommable Emplacement="3">
                        <CAB>6629936631262</CAB>
                    </Consommable>
                    <Consommable Emplacement="2">
                        <CAB>6335676641605</CAB>
                    </Consommable>
                    <Consommable Emplacement="4">
                        <CAB>0856435806157</CAB>
                    </Consommable>
                    <Consommable Emplacement="4">
                        <CAB>3813823802510</CAB>
                    </Consommable>
                </Ligne>
        </PorteConsommables>
    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
        <PorteConsommables>
                <NomCassette>Cassette</NomCassette>
                <CAB>4127675662133</CAB>
                <LigneCass Nom="A">
                    <Consommable Emplacement="3">
                        <CAB>4093577544909</CAB>
                    </Consommable>
                    <Consommable Emplacement="4">
                        <CAB>1785562515919</CAB>
                    </Consommable>
                    <Consommable Emplacement="4">
                        <CAB>2841652860000</CAB>
                    </Consommable>
                    <Consommable Emplacement="2">
                        <CAB>1449940167676</CAB>
                    </Consommable>
                </LigneCass>
        </PorteConsommables>
    Dans le premier cas, ou le porte consommable est de type "Portoir", il peut contenir de 1 à 4 lignes, et l'attribut "Positionnement" est obligatoire.

    Dans le second cas, le porte consommable est de type "Cassette", il ne peut y avoir qu'une seule ligne, et l'attribut "Positionnement" est interdit.

    Voila le XSD que j'ai pour l'instant concernant cette partie :
    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
      <xs:element name="NomCassette" fixed="Cassette" final="#all"/>
      <xs:element name="NomPortoir" fixed="Portoir" final="#all"/>
     
      <xs:complexType name="typeLigne">
        <xs:sequence minOccurs="4" maxOccurs="4">
          <xs:element name="Consommable" type="typeConsommable"/>
        </xs:sequence>
        <xs:attribute name="Nom" type="typeNomLigne" use="required"/>
        <xs:attribute name="Positionnement" type="typePositionnement"/>
      </xs:complexType>
     
      <xs:complexType name="typeLigneCassette">
        <xs:complexContent>
          <xs:extension base="typeLigne">
            <xs:attribute name="Positionnement" type="typePositionnement" use="prohibited"/>
          </xs:extension>
        </xs:complexContent>
      </xs:complexType>
     
      <xs:group name="groupPortoir">
        <xs:sequence>
          <xs:element ref="NomPortoir"/>
          <xs:element ref="CAB"/>
          <xs:element name="Ligne" type="typeLigne" maxOccurs="4">
            <xs:unique name="unique-EmplacementConsommableParLignePortoir">
              <xs:selector xpath="Consommable"/>
              <xs:field xpath="@Emplacement"/>
            </xs:unique>
          </xs:element>
        </xs:sequence>
      </xs:group>
     
      <xs:group name="groupCassette">
        <xs:sequence>
          <xs:element ref="NomCassette"/>
          <xs:element ref="CAB"/>
          <xs:element name="LigneCass" type="typeLigneCassette" maxOccurs="1">
            <xs:unique name="unique-EmplacementConsommableParLigneCassette">
              <xs:selector xpath="Consommable"/>
              <xs:field xpath="@Emplacement"/>
            </xs:unique>
          </xs:element>
        </xs:sequence>
      </xs:group>
     
      <xs:complexType name="typePorteConsommables">
        <xs:choice>
          <xs:group ref="groupCassette"/>
          <xs:group ref="groupPortoir"/>
        </xs:choice>
      </xs:complexType>
     
      <xs:complexType name="typeCOMETE">
        <xs:sequence>
          <xs:element name="Plaque" type="typePlaque"/>
          <xs:element name="PorteConsommables" type="typePorteConsommables" maxOccurs="3">
            <xs:unique name="unique-Ligne">
              <xs:selector xpath="Ligne"/>
              <xs:field xpath="@Nom"/>
            </xs:unique>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    J'arrive bien en utilisant les "group" et la balise "choice" à n'avoir que l'un ou l'autre de mes groupes, dont les types sont un peu spécialisés (malheureusement, je redéfini plusieurs fois certaines choses ....).
    Par contre, je suis d'une part obligé d'utiliser des noms d'élément différent pour le "PorteConsommable", et d'autre part, l'attribut "Positionnement" n'est jamais utilisé .....


    Merci de votre aide, j'ai beau chercher dans les cahiers de références ou sur les forums, je tâtonne et n'arrive à rien ...

  3. #3
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 117
    Points : 97
    Points
    97
    Par défaut
    Personne pour m'aider ?
    Serait-ce impossible de faire un xsd qui définisse finement ces deux types d'élément ?

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut
    Est-ce-que ceci http://www.developpez.net/forums/d87...sation-choice/ peut resoudre ton probleme?

Discussions similaires

  1. [XSD] Elément réservé à d'autres éléments
    Par FRED.G dans le forum Valider
    Réponses: 1
    Dernier message: 15/03/2009, 22h57
  2. Réponses: 3
    Dernier message: 18/06/2008, 10h26
  3. Réponses: 2
    Dernier message: 21/10/2007, 13h26
  4. [XSD] comment faire des tests sur des éléments
    Par attila771 dans le forum Valider
    Réponses: 1
    Dernier message: 11/10/2007, 12h32
  5. pointer sur un autre élément d'une liste en codage
    Par rahan_dave dans le forum Access
    Réponses: 3
    Dernier message: 03/02/2006, 13h25

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