Xml Schema:根据另一个属性的类型限制属性的值类型

时间:2013-11-01 20:18:15

标签: xml xsd schema

以下架构定义了具有两个属性的'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>

1 个答案:

答案 0 :(得分:2)

XSD 1.0并非旨在表达此类限制。

如果您想使用XSD 1.0,那么您不希望这种设计适用于您的XML。如果您想要这种XML结构,那么您不想使用XSD 1.0。替代方案包括XSD 1.1(使用断言或条件类型分配)或Relax NG或Schematron。

相关问题