0

以下模式定义了一个具有两个属性的“book”元素,即“DEPARTMENT”和“BOOK_NAME”。我想改进架构,以便在编写相应的 XML 文件时,首先出现“部门”属性,选择它的值(PHOTOGRAPHY/COMPUTER_SCIENCE/MEDICINE),然后根据“部门”属性的值选择“书名” ' 从相应的列表中选择。因此,如果 DEPARTMENT="PHOTOGRAPHY",则 XML 文件的作者不应该能够从 COMPUTER_SCIENCE 或 MEDICINE 部门选择一本书。

请不要建议拆分 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>
4

1 回答 1

2

XSD 1.0 并不是为表达这种约束而设计的。

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

于 2013-11-02T16:30:04.557 回答