以下架构定义了具有两个属性的'book'元素,即'DEPARTMENT'和'BOOK_NAME'。我想改进模式,以便在编写相应的XML文件时,首先显示'DEPARTMENT'属性,选择它的值(PHOTOGRAPHY / COMPUTER_SCIENCE / MEDICINE),然后根据'DEPARTMENT'属性的值,'BOOK_NAME' '从相应的列表中选择。因此,如果DEPARTMENT =“PHOTOGRAPHY”,则XML文件的作者不能从COMPUTER_SCIENCE或MEDIC部门选择一本书。
请不要建议拆分book元素并将这些属性作为子元素,我正在寻找一种解决方案,根据为另一个属性选择的类型来限制一个属性的类型。
谢谢
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="books">
<xs:complexType>
<xs:sequence>
<xs:element ref="book"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="book">
<xs:complexType>
<xs:attribute name="DEPARTMENT" type="departmentName" use="required"/>
<xs:attribute name="BOOK_NAME" type="should be photographyBooks or computerScienceBooks or medicineBooks depending on the selected department" use="required"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="departmentName">
<xs:restriction base="xs:string">
<xs:enumeration value="PHOTOGRAPHY"/>
<xs:enumeration value="COMPUTER_SCIENCE"/>
<xs:enumeration value="MEDICINE"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="photographyBooks">
<xs:restriction base="xs:string">
<xs:enumeration value="Adobe PhotoShop in a nutshell"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="computerScienceBooks">
<xs:restriction base="xs:string">
<xs:enumeration value="An Intruduction to Computer Programming using C"/>
<xs:enumeration value="Best Practices in Java"/>
<xs:enumeration value="Guide to Perl Scripting"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="medicineBooks">
<xs:restriction base="xs:string">
<xs:enumeration value="Principles an Practices of Medicine"/>
<xs:enumeration value="Mortality in relation to Smoking"/>
<xs:enumeration value="Heart Protection Study"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
答案 0 :(得分:2)
XSD 1.0并非旨在表达此类限制。
如果您想使用XSD 1.0,那么您不希望这种设计适用于您的XML。如果您想要这种XML结构,那么您不想使用XSD 1.0。替代方案包括XSD 1.1(使用断言或条件类型分配)或Relax NG或Schematron。