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 :

Type attribut conditionel


Sujet :

Valider XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 5
    Points
    5
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <Vecteur Unite="V" Start="0" Stop="5" Step="0.1"/>
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
        <!--
        <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.

Discussions similaires

  1. Changer Type attribut
    Par fattouch_squall dans le forum Langage
    Réponses: 4
    Dernier message: 20/05/2011, 12h33
  2. [Oracle][ODBC]Restricted data type attribute violation
    Par jolatouf dans le forum VBScript
    Réponses: 1
    Dernier message: 03/09/2010, 12h33
  3. [Facelets] probleme type attributs
    Par jdvacheron dans le forum JSF
    Réponses: 7
    Dernier message: 05/09/2008, 15h08
  4. Restricted data type attribute violation
    Par yupa dans le forum Oracle
    Réponses: 0
    Dernier message: 16/01/2008, 16h38

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