我有以下“ 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))进行验证时,出现以下错误:
元素“ {{http://www.w3.org/2001/XMLSchema}元素”,属性“ ref”: 从此架构到名称空间中组件的引用 不允许使用“ http://imported”,因为导入没有指示 声明。 WXS模式main.xsd编译失败
但是,另一个(IBM)解析器毫无保留地接受了该XSD。
据我了解xsd:include,它的行为应该好像将整个包含的XSD内联到主文档中一样。因此,我认为“ main.xsd”应该有效。是吗?
编辑:我正在尝试xmllint
,并在添加行时进行了
<xsd:import namespace="http://imported" schemaLocation="file:///C:/.../imp.xsd"/>
进入“ main.xsd”,xmllint接受该模式。但是,当我在省略file:///
的同时添加同一行时,会收到以下警告:
元素“ {{http://www.w3.org/2001/XMLSchema}导入”:跳过导入 位于命名空间“ C:/.../ imported.xsd”的模式 'http://imported',因为此名称空间已与 模式位于“文件:/// V:/.../imported.xsd”。
因此,我推断原始的“ main.xsd”有效,并且这是xmllint
中的错误。
答案 0 :(得分:1)
请参阅xmlschema-dev@w3.org邮件列表上的this thread。亨利·汤普森(Henry S. Thompson)在回答中引用了the spec的以下部分:
要使QName解析为架构组件,... QName的名称空间名称与以下之一相同:
[...]
- 某些
的名称空间[attribute]的“实际值” 元素中包含的元素信息项 该架构文档的信息项 [添加了重点]。
因此间接导入不起作用。