如何在XSD中自我引用

时间:2014-01-30 21:25:40

标签: xml visual-studio-2010 xsd

我正在尝试为后续架构创建一个XSD,我不确定如何自引用相同的类型元素。我尝试使用ref属性,但是当我创建xml文件时,visual studio继续引发错误。在pre-req元素中创建XML时,我希望我提供一个带有description / department / credits的完整课程元素

有人可以帮助在最后为xml生成xsd

<xs:element name="Course">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Description" />
        <xs:element name="Department" />
        <xs:element name="Credits" type="xs:decimal" />
        <xs:element name="Prerequisite" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element ref="Course" minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="CourseCode" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="Courses">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Course" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

这是XML

<Courses>
  <Course CourseCode="ABC123">
    <Description>This is Math Level 2</Description>
    <Department>Maths</Department>
    <Credits>7.5</Credits>
    <Prerequisite>
      <Course CourseCode="MTH001"></Course>
    </Prerequisite>
  </Course>
  <Course CourseCode="MTH001">
    <Description>This is Math Level 1</Description>
    <Department>Maths</Department>
    <Credits>5.0</Credits>
  </Course>
</Courses>

1 个答案:

答案 0 :(得分:2)

符合预期的完整课程元素是合乎逻辑的:当您说<xs:element ref="Course"时,您在XSD中定义的内容 - 您递归地引用了您的完整课程元素。

您可以为具有不同类型的元素<Course创建本地元素定义,然后它可以具有不同的验证规则。

这是第一步。

第二步是xml架构内置支持您可以引用的标识符。在定义标识符的属性中,应使用类型xs:ID而不是xs:string。在引用标识符的属性中,您应该使用类型xs:IDREF而不是xs:string。

结合这两者,你得到:

<xs:element name="Course">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Description" />
            <xs:element name="Department" />
            <xs:element name="Credits" type="xs:decimal" />
            <xs:element name="Prerequisite" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Course" minOccurs="1" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:attribute name="CourseCode" type="xs:IDREF" use="required" />
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="CourseCode" type="xs:ID" use="required" />
    </xs:complexType>
</xs:element>

这应该验证您的输入XML,并且作为奖励,当您在<Prerequisite>中使用的课程ID在您的XML中不存在时,它现在会引发验证错误。