【问题标题】:How to self reference in XSD如何在 XSD 中自引用
【发布时间】:2014-01-31 19:24:41
【问题描述】:

我正在尝试为以下架构创建 XSD,但我不确定如何自引用相同类型的元素。我尝试使用 ref 属性,但是当我创建 xml 文件时,Visual Studio 不断引发错误。在 pre-req 元素中创建 XML 时,希望我为其提供完整的 Course 元素,其中包含描述/部门/学分

谁能帮最后生成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>

【问题讨论】:

    标签: xml visual-studio-2010 xsd


    【解决方案1】:

    需要一个完整的课程元素是合乎逻辑的:这就是你在 XSD 中定义的,当你说 &lt;xs:element ref="Course" 时 - 你递归地引用了你的完整课程元素。

    您可以为具有不同类型的元素 &lt;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,并且作为奖励,当您在 &lt;Prerequisite&gt; 中使用的课程 ID 在您的 XML 中不存在时,它现在会引发验证错误。

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      相关资源
      最近更新 更多