从另一个 XSD 导入复杂类型

Import complex types from another XSD

我发现很难将复杂类型从一个 XSD 文件导入和引用到另一个文件。让我用一个例子来说明我的场景

Student.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="xyz"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:common="xyz"
    xmlns="xyz"
    elementFormDefault="qualified">

    <xsd:element name="student" type="student" />

    <xsd:complexType name="student">
        <xsd:sequence>
            <xsd:element name="id" type="xsd:string" />
            <xsd:element name="birth-date" type="xsd:date" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

这是另一个XSD,Teacher.xsd,我想引用student.xsd

中的复杂类型学生

Teacher.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="xyz"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:common="xyz"
    xmlns="xyz"
    elementFormDefault="qualified">

    <xsd:import schemaLocation="student.xsd"
        namespace="xyzzz" />

    <xsd:element name="teacher" type="teacher" />

    <xsd:complexType name="teacher">
        <xsd:sequence>
            <xsd:element name="id" type="xsd:string" />
            <xsd:element name="name" type="xsd:string" />

            // TODO - Refer to student from student.xsd

        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>

我看过其他 Stack Overflow 帖子关于实现这一点的语法

<xs:element name="teacher" type="teacher:teacher"/>

连同导入:

<xsd:import schemaLocation="xyz" namespace="xyz"/>

但似乎没有任何效果。

有人可以帮我实现这个吗?

使用 xsd:include 而不是 xsd:import,因为 XSD 在同一个命名空间中。

备注

  • 您需要包括 Student.xsd,而不是 common.xsd。
  • 由于引用的类型在同一个命名空间中,所以不需要指定命名空间前缀:

    <xsd:element name="student" type="student"/>
    
  • 最好以不同的方式命名您的元素和属性。

另见

  • What's the difference between xsd:include and xsd:import?
  • xsd:import 的完整工作示例用于名称空间不同时)