Bonjour,

Je suis en train d'apprendre le format XSD et je créée quelques exercices persos pour essayer de bien comprendre.

Et là, je bute sur un problème que je n'arrive pas à résoudre.

La balise A ne peut contenir que des balises B ou/et C dont la somme des deux est au moins égale à zéro. L'ordre des balises B et C dans A ne doit pas avoir d'importance.
Voici les restrictions :
1) Si au moins deux balises B se trouvent dans A, une seule balise C au maximum est autorisée
2) Si au moins deux balises C se trouvent dans A, une seule balise B au maximum est autorisée

Voici la structure de mon fichier XML :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
 
<root xsi:noNamespaceSchemaLocation="schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
    <a></a>
 
</root>
Et, le principal, mon fichier 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
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="a"></xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
 
    <xs:element name="a">
        <xs:complexType>
            <xs:choice minOccurs="1" maxOccurs="1">
                <xs:sequence>
                    <xs:group ref="mon_groupe_1" minOccurs="0" maxOccurs="unbounded"></xs:group>
                    <xs:group ref="mon_groupe_2" minOccurs="0" maxOccurs="unbounded"></xs:group>
                </xs:sequence>
            </xs:choice>
        </xs:complexType>
    </xs:element>
 
    <xs:group name="mon_groupe_1">
        <xs:sequence id="un_seul_b_plusieurs_c">
            <xs:element ref="b" minOccurs="0" maxOccurs="1"></xs:element>
            <xs:element ref="c" minOccurs="0" maxOccurs="unbounded"></xs:element>
        </xs:sequence>
    </xs:group>
 
    <xs:group name="mon_groupe_2">
        <xs:sequence id="un_seul_c_plusieurs_b">
            <xs:element ref="c" minOccurs="0" maxOccurs="1"></xs:element>
            <xs:element ref="b" minOccurs="0" maxOccurs="unbounded"></xs:element>
        </xs:sequence>
    </xs:group>
 
    <xs:element name="b">
        <xs:complexType>
            <xs:sequence></xs:sequence>
        </xs:complexType>
    </xs:element>
 
    <xs:element name="c">
        <xs:complexType>
            <xs:sequence></xs:sequence>
        </xs:complexType>
    </xs:element>
 
</xs:schema>
Cela ne marche pas comme je veux.

En gros, pour résumer, ceci est par exemple valide :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
 
<root xsi:noNamespaceSchemaLocation="schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
    <a>
        <b />
        <c />
        <b />
    </a>
</root>
Mais ceci ne l'est pas :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
 
<root xsi:noNamespaceSchemaLocation="schema.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
    <a>
        <b />
        <c />
        <b />
        <c />
    </a>
</root>
Auriez-vous une idée du problème ? Merci !!

Pendant ce temps, je continue à chercher...