给出以下示例:
<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的可能值限制为“平装”。
“无”,“Liporello”和“精装”不再是“Lyric”的有效值。可以在xsd中完成吗?
答案 0 :(得分:9)
不,不幸的是你不能这样做。没有办法限制这样的枚举,并且同时扩展和限制复杂类型也会遇到麻烦。有一篇很好的文章,你可以使用枚举here做什么。
也许考虑自下而上的工作:定义几乎没有任何内容的基本书籍类型;然后定义一个LyricType,它是基本类型和更多值的并集;在子类型中携带bookCode。它并不理想,但唉,XSD并不总是与面向对象的语言保持一致。
答案 1 :(得分:1)
最终..你正在尝试使用另一个(父或兄弟等)的值来验证节点..这肯定是不可能的..