2009-05-09 5 views
2

J'ai ce problème et je ne peux pas pour la vie de moi trouver une solution simple.Comment valider une liste de sélection avec un schéma XML

J'essaye de codifier une liste de systèmes d'exploitation, où le fichier XML contient une liste des systèmes d'exploitation qu'une personne donnée a. Il y a une liste fixe d'OS (XP, Vista, Win7, OSX et Ubuntu).
J'ai le morceau de XML

<operatingSystems> 
    <operatingSystem name="Windows XP" /> 
    <operatingSystem name="Windows Vista" /> 
    <operatingSystem name="Windows 7" /> 
    <operatingSystem name="OS X" /> 
    <operatingSystem name="Ubuntu Linux" /> 
</operatingSystems> 

L'élément suivant <operatingSystems> peut contenir 0 ou plusieurs des systèmes d'exploitation répertoriés.

Ainsi, des exemples valides seraient:

<operatingSystems> 
    <operatingSystem name="Windows XP" /> 
    <operatingSystem name="OS X" /> 
    <operatingSystem name="Ubuntu Linux" /> 
</operatingSystems> 

ou

<operatingSystems /> 

Je suis en train d'écrire un schéma XSD pour valider cette. Mes questions est de savoir quelle est la meilleure façon de procéder pour valider que l'élément <operatingSystems> ne contient que des éléments enfant <operatingSystem> dont le nom provient de l'ensemble donné et que chaque élément de nom n'apparaît pas plus d'une fois.

exemples non valides seraient:

<operatingSystems> 
    <operatingSystem name="OS X" /> 
    <operatingSystem name="OS X" /> 
    <operatingSystem name="Ubuntu Linux" /> 
</operatingSystems> 

ou

<operatingSystems> 
    <operatingSystem name="Sun Solaris" /> 
</operatingSystems> 

Ive a essayé ceci:

<element name="operatingSystems"> 
    <complexType> 
    <sequence> 
     <element name="operatingSystem" minOccurs="0" maxOccurs="1"> 
     <complexType> 
      <attribute name="name" fixed="Windows XP" /> 
     </complexType> 
     </element> 
     <element name="operatingSystem" minOccurs="0" maxOccurs="1"> 
     <complexType> 
      <attribute name="name" fixed="Windows Vista" /> 
     </complexType> 
     </element> 
     ....... 
    </sequence> 
    </complexType> 
</element> 

mais il ingores le fait que minOccurs est 0 et se plaindra si un élément système d'exploitation est manquant.

Toute aide serait appréciée.

Merci

Répondre

0

Vous pouvez utiliser l'élément xs:unique:

<xs:element name="operatingSystems"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="operatingSystem" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="oneOperatingSystem"> 
    <xs:selector xpath="operatingSystem"/> 
    <xs:field xpath="@name"/> 
    </xs:unique> 
</xs:element> 
<xs:element name="operatingSystem"> 
    <xs:complexType> 
    <xs:attribute name="name" use="required"> 
     <xs:simpleType> 
     <xs:restriction base="xs:token"> 
      <xs:enumeration value="Windows XP"/> 
      <xs:enumeration value="Windows Vista"/> 
      <xs:enumeration value="Windows 7"/> 
      <xs:enumeration value="OS X"/> 
      <xs:enumeration value="Ubuntu Linux"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    </xs:complexType> 
</xs:element> 
Questions connexes