Bonjour,

Je suis en train de rédiger un schema XSD pour un fichier .XML.
Je souhaiterais ajouter une contrainte pour ne pouvoir n'assigner des attributs que si un autre a une valeur particulière, ou si ce n'est pas possible, au moins ne pas pouvoir assigner certains attributs si d'autres le sont déjà.

Voici le bout de code :
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
<xs:element name="activity">
   <xs:complexType>
      <xs:sequence minOccurs="0">
         <!-- <xs:element ref="startDate" minOccurs="0"/>
         <xs:element ref="endDate" minOccurs="0"/> -->
         <xs:element ref="activity" minOccurs="0" maxOccurs="unbounded"/>
         <xs:element ref="account" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:string" use="required"/>
      <xs:attribute name="name" type="xs:string" use="required"/>
      <xs:attribute name="start" type="xs:string" use="required"/>
      <xs:attribute name="end" type="xs:string" use="required"/>
      <xs:attribute name="type" use="required">
         <xs:simpleType>
            <xs:restriction base="xs:NMTOKEN">
               <xs:enumeration value="Root"/>
               <xs:enumeration value="Resource"/>
               <xs:enumeration value="Training"/>
               <xs:enumeration value="Project"/>
               <xs:enumeration value="Presales"/>
            </xs:restriction>
         </xs:simpleType>
      </xs:attribute>
      <!-- Attributes for a task -->
      <xs:attribute name="comment" type="xs:string"/>
      <xs:attribute name="probability" type="xs:int"/>
      <xs:attribute name="duration" type="xs:int"/>
      <!-- Attributes for a resource -->
      <xs:attribute name="role" type="xs:string"/>
   </xs:complexType>
</xs:element>

Dans l'idéal, je souhaiterais que l'on ne puisse assigner ces attributs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
   <xs:attribute name="comment" type="xs:string"/>
   <xs:attribute name="probability" type="xs:int"/>
   <xs:attribute name="duration" type="xs:int"/>
à l'élément "activity" que si l'attribut "type" a la valeur "Training", "Presales" ou "Project", et cet attribut :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
   <xs:attribute name="role" type="xs:string"/>
à l'élément "activity" que si l'attribut "type" a la valeur "Resource".

Si ce n'est pas possible, je souhaiterais que si on assigne les trois attributs ci-dessus, on ne puisse pas assigner le dernier, et vice versa.

Pour la seconde solution, j'ai pensé à choice, mais je ne peux pas l'insérer à cet endroit. Je me demande si ce n'est pas à cause de la séquence qui a déjà été déclarée plus haut.
Je suis débutant en XML Schema mais j'ai pourtant besoin d'implémenter ces règles relativement complexes.

Merci de votre aide,
Rémi.