2009-05-09 14 views
2

Ich habe dieses Problem und ich kann nicht für das Leben von mir eine einfache Lösung finden.So validieren Sie eine Auswahlliste mit einem XML-Schema

Ich versuche, eine Liste von Betriebssystemen zu kodieren, wo die XML-Datei eine Liste der Betriebssysteme enthält, die eine bestimmte Person hat. Es gibt eine feste Liste von Betriebssystemen (XP, Vista, Win7, OSX und Ubuntu).
Ich habe das folgende Stück von XML

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

Das <operatingSystems> Element aufgeführt 0 oder mehrere der Betriebssysteme enthalten.

So gültige Beispiele wären:

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

oder

<operatingSystems /> 

Ich versuche, ein XSD-Schema zu schreiben, dies zu bestätigen. Meine Fragen ist, was der beste Weg ist zu überprüfen, dass das <operatingSystems> Element nur untergeordnete <operatingSystem> Elemente enthält, wobei der Name aus der gegebenen Menge stammt und dass jedes Namenselement nicht mehr als einmal erscheint.

Ungültige Beispiele wären:

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

oder

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

Ive versucht, dies:

<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> 

aber es ingores die Tatsache, dass minOccurs 0 ist und wenn jedes Element klagen Betriebssystem fehlt.

Jede Hilfe wäre willkommen.

Dank

Antwort

0

Sie xs:unique Element verwenden:

<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> 
Verwandte Themen