2010-02-15 80 views
5

考慮下面的例子:XSD:如何限制派生複雜類型的枚舉值?

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

抒情的書派生。我想限制complexType「Lyric」的BookEnum的可能值爲「Paperback」。

「無」,「Liporello」和「精裝」不再是「Lyric」的有效值。這可以在xsd中完成嗎?

回答

8

不幸的是,不幸的是,你不能這樣做。沒有辦法限制這樣的枚舉,並且在同時擴展和限制複雜類型時也會遇到麻煩。有一篇很好的文章,你可以用與枚舉here做什麼。

也許可以考慮自下而上:定義幾乎沒有任何內容的基本書籍類型;然後定義一個LyricType,它是基本類型和一些更多值的聯合;在子類型中攜帶bookCode。這並不理想,但是,XSD並不總是與面向對象的語言一致。

+0

感謝您的鏈接到IBM網站。太糟糕了,它不適用於「限制」。無論如何,謝謝你的回答。 – tobsen 2010-02-17 13:20:56

+1

我認爲你可以在XSD 1.1中使用xpath來實現這個功能:http://stackoverflow.com/questions/6472264/can-an-x-sql-example-tag-be-made-mandatory-required – RMorrisey 2013-05-06 17:31:31

1

最後..你想驗證一個節點使用值的其他(父母或兄弟姐妹或等)..這當然是不可能的..