我有以下" 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;架构>元素中包含的元素信息项 信息项该模式文档的文档 [添加了强调]。
因此,间接导入不应工作。