2017-08-18 3 views
1

J'ai une structure XML plutôt simple;XML Schema (XSD 1.1) Enumération dynamique en fonction d'un autre attribut

<list... > 
    <members> 
     <person type="NAME_WITH_A"> 
      <name>Ada</name> 
     </person> 
     <person type="NAME_WITH_B"> 
      <name>Berta</name> 
     </person> 
    </members> 
</list> 

Je veux limiter la valeur du « nom » à un certain ensemble de noms, en fonction de la valeur du « type » d'attribut de l'élément « personne ».

Ainsi, par exemple, si <person type="NAME_WITH_A">, seuls les noms

  • Anna
  • Ada
  • Amanda

devrait être valide, si <person type="NAME_WITH_B">, ne

  • Berta,
  • Bob
  • Bret

devraient être des valeurs valides pour l'élément <name>.

Selon this question i créé le schéma suivant:

<xs:schema xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="list"> 
</xs:element> 

<xs:element name="person"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="name"/> 
     </xs:sequence> 
     <xs:attribute name="type" use="required"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:enumeration value="NAME_WITH_A"/> 
        <xs:enumeration value="NAME_WITH_B"/> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 
</xs:element> 

<xs:element name="name"> 
    <xs:alternative test="@type='NAME_WITH_A'" type="choice_names_A"/> 
    <xs:alternative test="@type='NAME_WITH_B'" type="choice_names_B"/> 
    <xs:alternative type="xs:error"/> 
</xs:element> 

<xs:element name="members"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="person" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:simpleType name="choice_names_A"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Anna"/> 
     <xs:enumeration value="Ada"/> 
     <xs:enumeration value="Amanda"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="choice_names_B"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Berta"/> 
     <xs:enumeration value="Bob"/> 
     <xs:enumeration value="Bret"/> 
    </xs:restriction> 
</xs:simpleType> 
</xs:schema> 

qui ne fonctionne pas vraiment pour moi. J'ai le sentiment que, comme je fais référence dans test="@type='NAME_WITH_A'" à l'attribut @type de l'élément ANOTHER, il est toujours faux. J'ai également essayé test="list/members/person/@type='NAME_WITH_A'" mais sans succès.

Répondre

1

Vous avez la bonne idée d'utiliser l'Affectation de type conditionnelle, mais vous l'appliquez au mauvais élément. Au lieu de l'appliquer à name, vous devez l'appliquer à person (l'élément dont le type variera en fonction de l'attribut type). De là, vous pouvez modifier le modèle de contenu de person pour avoir name éléments de types différents.

Voir également How to make type depend on attribute value using Conditional Type Assignment.