Précédent   Forum du club des développeurs et IT Pro > Autres langages > XML/XSL et SOAP > Valider
Valider W3C XML Schemas, DTD, Relax NG, Schematron...) et tout ce qui permet de les mettre en oeuvre. Avant de poster -> FAQ XML, Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/10/2012, 18h26   #1
devendart
Invité de passage
 
Inscription : 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
devendart est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2012, 17h12   #2
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 113
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 113
Points : 10 349
Points : 10 349
Envoyer un message via Skype™ à thelvin
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.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2012, 17h37   #3
tsuji
Membre chevronné
 
Inscription : octobre 2011
Messages : 412
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 412
Points : 675
Points : 675
[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.
tsuji est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h19.


 
 
 
 
Partenaires

Hébergement Web