xsd import from xsd include



我有以下" imp.xsd":

<xsd:schema targetNamespace="http://imported"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="Imported" type="xsd:string"/>
</xsd:schema>

从" incl.xsd"导入

<xsd:schema targetNamespace="http://main"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:import namespace="http://imported" schemaLocation="file:///C:/.../imp.xsd"/>
    <xsd:element name="Included" type="xsd:string"/>
</xsd:schema>

又包含 来自" main.xsd":

<xsd:schema targetNamespace="http://main"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="file:///C:/.../incl.xsd"/>
    <xsd:complexType name="dummy">
        <xsd:sequence xmlns:impt="http://imported" xmlns:incl="http://main">
            <xsd:element ref="incl:Included"/>
            <xsd:element ref="impt:Imported"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

问题:是" main.xsd"有效XML模式文档?

使用xmllint解析器验证(或来自Python lxml库,又使用XMLLINT(,我会收到以下错误:

element'{http://www.w3.org/2001/xmlschema} lement',属性'ref': 该模式的参考文献到名称空间中的组件 不允许'http://导入' 陈述。wxs schema main.xsd无法编译

但是,另一个(IBM(解析器接受此XSD而无需任何投诉。

据我了解XSD:包括,它的行为应该像整个包含的XSD一样,将其置于主文档中。因此,我认为" main.xsd"应该有效。是吗?

编辑:我正在尝试xmllint,当我添加行

<xsd:import namespace="http://imported" schemaLocation="file:///C:/.../imp.xsd"/>

进入" main.xsd",xmllint接受该模式。但是,当我在省略file:///时添加相同的行时,我会收到以下警告:

element'{http://www.w3.org/2001/xmlschema} import':跳过导入 位于名称空间的架构 'http://导入',因为此命名空间已经导入 架构位于'file:///v:/.../imported.xsd'。

因此,我推断出原始的" main.xsd"是有效的,这是xmllint中的错误。

请参阅xmlschema-dev@w3.org邮件列表上的此线程。亨利·汤普森(Henry S.

a·qname·解析到架构组件[...] ·qname的名称名称·与以下一个相同:

[...]

  • 某些&lt; import>的名称空间[属性]的实际值· &lt;架构>元素中包含的元素信息项 信息项该模式文档的文档 [添加了强调]。

因此,间接导入不应工作。

最新更新