Xml 从另一个XSD导入复杂类型

Xml 从另一个XSD导入复杂类型,xml,xsd,xsd-validation,xml-validation,Xml,Xsd,Xsd Validation,Xml Validation,我发现从一个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="

我发现从一个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>
<?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>

这里是另一个XSD,Teacher.XSD,我想在这里引用student.XSD中的复杂类型student

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: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>
<?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>

//TODO-参考student.xsd中的学员
我看到过其他关于实现这一点的语法的堆栈溢出帖子

<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"/>
    
    
    
  • 更好的方式是以不同的方式命名元素和属性

另请参见

  • (有关
    xsd:import
    在名称空间不同时使用的完整工作示例)

我还需要引用其他命名空间中的复杂类型。你能帮我看一下代码吗?我添加了一个链接,指向如何使用
xsd:import
的完整工作示例。我在尝试引用教师中的复杂类型student时遇到此错误元素“element”中“ref”的属性值无效。记录原因:未声明的prefix:无法将'student:student'解析为QName:前缀'student'未声明。您能检查一下吗?嗨,我问了另一个问题。您能调查一下吗?非常感谢