2010-02-15 81 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

最后..你想验证一个节点使用值的其他(父母或兄弟姐妹或等)..这当然是不可能的..