Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Inscrit en
    avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 4
    Points : 1
    Points
    1

    Par défaut Type attribut conditionel

    Bonjour,

    Je suis en train de créer un XSD dans lequel j'aimerai valider un élément de la forme suivante:
    Code :
    1
    2
     
    <Vecteur Unite="V" Start="0" Stop="5" Step="0.1"/>
    ou
    Code :
    1
    2
    3
    4
    5
    6
     
    <Vecteur Unite="V">
       <Start>0<Start/>
       <Stop>5<Stop/>
       <Step>0.1<Step/>
    <Vecteur/>
    Dans lequel les type des éléments ou attributs Start, Stop et Step sont du type correspondant à l'attribut "Unite" de l’élément Vecteur (pouvant valoir "V" ou "I").

    J'ai essayé plusieurs solutions sans succès.
    Pour la première solution j'ai crée 2 groupes d'attributs mais XML Schema ne permet pas de faire des unions de groupe d'attributs d'après ce que j'ai compris et essayé.
    Pour la seconde solution j'ai essayé de faire un "choice" de 2 types d'élement avec les bonne types mais alors les noms de ces deux éléments sont identiques (Vecteur) ce qui pose un problème.

    Voici mon code pour la seconde solution:
    XSD:
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     
        <xsd:simpleType name="unite">
            <xsd:restriction base="xsd:string">
                <xsd:enumeration value="I"/>
                <xsd:enumeration value="V"/>
            </xsd:restriction>
        </xsd:simpleType>
     
        <xsd:simpleType name="V">
            <xsd:restriction base="xsd:decimal">
                <xsd:minInclusive value="-200"/>
                <xsd:maxInclusive value="200"/>
                <xsd:fractionDigits value="3"/>
            </xsd:restriction>
        </xsd:simpleType>
     
        <xsd:simpleType name="I">
            <xsd:restriction base="xsd:decimal">
                <xsd:minInclusive value="-1"/>
                <xsd:maxInclusive value="1"/>
                <xsd:fractionDigits value="6"/>
            </xsd:restriction>
        </xsd:simpleType>
     
     
        <xsd:group name="Vgroup">
            <xsd:sequence>
                <xsd:element name="Start" type="V"/>
                <xsd:element name="Stop" type="V"/>
            </xsd:sequence>
        </xsd:group>
     
        <xsd:group name="Igroup">
            <xsd:sequence>
                <xsd:element name="Start" type="I"/>
                <xsd:element name="Stop" type="I"/>
            </xsd:sequence>
        </xsd:group>
     
        <xsd:element name="Test">
            <xsd:complexType>
                <xsd:choice>
                    <xsd:element name="Vecteur">
                        <xsd:complexType>
                            <xsd:group ref="Vgroup"/>
                            <xsd:attribute name="Mode" type="unite" fixed="V"/>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="Vecteur">
                        <xsd:complexType>
                            <xsd:group ref="Igroup"/>
                            <xsd:attribute name="Mode" type="unite" fixed="I"/>
                        </xsd:complexType>
                    </xsd:element>                
                </xsd:choice>
            </xsd:complexType>
        </xsd:element>
     
    </xsd:schema>
    XML:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <Test>
        <Vecteur Mode="V">
            <Start>0</Start>
            <Stop>5</Stop>
        </Vecteur>
    </Test>
    Avez-vous une solution?
    Merci

  2. #2
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 859
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 859
    Points : 16 320
    Points
    16 320

    Par défaut

    Pas faisable. La validité d'un élément ou d'un attribut, ne peut pas dépendre des valeurs (valides, donc,) prises par d'autres éléments ou attributs.

    En langage savant, on dit que XML Schema permet de valider la grammaire du format, pas sa sémantique.

    Citation Envoyé par devendart Voir le message
    Avez-vous une solution?
    En XML Schema 1.1 il y aurait toujours moyen d'utiliser <xs:assert>, qui du coup se dédouane du côté grammaire seulement. Mais bon, c'est pas géré par grand-chose.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
    Partagez vos connaissances, mais aussi comment s'en servir.

  3. #3
    Membre Expert
    Inscrit en
    octobre 2011
    Messages
    696
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 696
    Points : 1 220
    Points
    1 220

    Par défaut

    [0] En xsd 1.0, effectivement vous ne pouvez pas faire comme montré. C'est tout à fait défendu. Le mieux on peut faire c'est de relié le type au temps tardif et dynamique.

    [0.1] Le xml doit préciser le type.
    Code :
    1
    2
    3
    4
    5
    6
    <Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Vecteur Mode="V" xsi:type="ctV">
            <Start>0</Start>
            <Stop>5</Stop>
        </Vecteur>
    </Test>
    ou le types ctV et ctI sont définis à mon sens dans le xsd ci-après.

    [0.2] Le xsd, je commente le xsd:element Test et le remplace par ceux qui suivent.
    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
        <!--
        <xsd:element name="Test">
            <xsd:complexType>
                <xsd:choice>
                    <xsd:element name="Vecteur">
                        <xsd:complexType>
                            <xsd:group ref="Vgroup"/>
                            <xsd:attribute name="Mode" type="unite" fixed="V"/>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="Vecteur">
                        <xsd:complexType>
                            <xsd:group ref="Igroup"/>
                            <xsd:attribute name="Mode" type="unite" fixed="I"/>
                        </xsd:complexType>
                    </xsd:element>                
                </xsd:choice>
            </xsd:complexType>
        </xsd:element>
        -->
        <xsd:element name="Test">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="Vecteur" maxOccurs="unbounded" type="vecteurType" />
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
     
        <xsd:complexType name="vecteurType" abstract="true" />
     
        <xsd:complexType name="ctV">
            <xsd:complexContent>
                <xsd:extension base="vecteurType">
                    <xsd:group ref="Vgroup" />
                    <xsd:attribute name="Mode" type="unite" fixed="V" />
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
     
        <xsd:complexType name="ctI">
            <xsd:complexContent>
                <xsd:extension base="vecteurType">
                    <xsd:group ref="Igroup" />
                    <xsd:attribute name="Mode" type="unite" fixed="I" />
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    [0.3] Vous devrez le tailler un peu pour arriver ce que vous souhaitez arriver plus exactement, par example, j'ai mis maxOccurs="unbounded" arbitrairement et il se peut que vous n'en voudriez autrement...

    [0.4] Effectivement une solution comme telle peut parâitre maladroite; mais, avec xsd 1.0 c'est la mieux à mon sens qu'on puisse faire.

    [1] Avec xsd 1.1, ce genre de problèmes serait résolu bien plus concis et satisfaisant: on peut utilser l'element xsd:alternative pour arriver une résolution bien nette. Les supports de xsd 1.1 dans les applications ne sont pourtant mois répandus pour le moment. C'est déjà tout à fait faisable.

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
  •