2013-11-01 37 views
0

以下架构定义了具有两个属性(即'DEPARTMENT'和'BOOK_NAME')的'book'元素。我想改进模式,以便在写入相应的XML文件时,首先出现'DEPARTMENT'属性,选择值(PHOTOGRAPHY/COMPUTER_SCIENCE/MEDICINE),然后根据'DEPARTMENT'属性的值'BOOK_NAME '是从相应的列表中选择的。因此,如果DEPARTMENT =“PHOTOGRAPHY”,则XML文件的作者应该无法从COMPUTER_SCIENCE或MEDICINE部门选择书籍。Xml架构:根据另一个属性的类型限制属性的值类型

请不要建议拆分书籍元素,并将这些属性作为子元素,我正在寻找一种解决方案,根据为其他属性选择的类型限制一种属性的类型。

谢谢

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

回答

2

XSD 1.0不是设计来表达这种约束。

如果您想使用XSD 1.0,则不需要此设计用于您的XML。如果你想要这个XML结构,你不想使用XSD 1.0。其他选择包括XSD 1.1(使用断言或条件类型赋值)或Relax NG或Schematron。