2010-02-15 3 views
5

das folgende Beispiel Gegeben:XSD: Wie können Sie Aufzählungswerte eines abgeleiteten komplexen Typs einschränken?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="Book" abstract="true"> 
     <xs:sequence> 
      <xs:element name="titel" type="xs:string"> 
      </xs:element> 
      <xs:element name="bookCode" type="BookEnum"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="Lyric"> 
     <xs:complexContent> 
      <xs:extension base="Book"> 
       <xs:sequence> 
        <xs:element name="author" type="xs:string"> 
        </xs:element> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:simpleType name="BookEnum"> 
     <xs:restriction base="xs:int"> 
      <xs:enumeration value="Paperback"/> 
      <xs:enumeration value="Hardcover"/> 
      <xs:enumeration value="Liporello"/> 
      <xs:enumeration value="None"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

Lyric leitet sich von Buch. Ich möchte die möglichen Werte von BookEnum für den ComplexType "Lyric" auf "Paperback" beschränken.

"Keine", "Liporello" und "Hardcover" sollten keine gültigen Werte für "Lyric" mehr sein. Kann das in xsd gemacht werden?

Antwort

8

Nein, das geht leider nicht. Es gibt keine Möglichkeit, eine Aufzählung auf diese Weise zu beschränken, und Sie hätten auch Schwierigkeiten, gleichzeitig einen komplexen Typ zu erweitern und einzuschränken. Es gibt einen guten Artikel, was Sie können tun mit Aufzählungen here.

Vielleicht in Betracht ziehen, stattdessen von unten nach oben zu arbeiten: Definieren Sie einen grundlegenden Buchtyp mit fast nichts; Definieren Sie dann einen LyricType, der eine Vereinigung des Basistyps und einiger weiterer Werte darstellt. Tragen Sie den bookCode in die Untertypen ein. Es ist nicht ideal, aber leider stimmt XSD nicht immer mit objektorientierten Sprachen überein.

+0

Danke für den Link zu der Website ibm. Schade, dass es mit "Einschränkungen" nicht richtig funktioniert. Wie auch immer, danke für deine Antwort. – tobsen

+1

Ich denke, dass Sie dies in XSD 1.1 mit Xpath tun können: http://stackoverflow.com/questions/6472264/can-an-xsdenumeration-tag-be-made-mandatory-required – RMorrisey

1

Letztlich .. Sie versuchen, einen Knoten mit Wert des anderen (Eltern oder Geschwister oder usw.) zu überprüfen .. was sicherlich nicht möglich ist ..