从xsd包括的xsd导入

时间:2019-06-23 11:07:09

标签: xsd lxml libxml2 xmllint xsd-1.1

我有以下“ 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中的错误。

1 个答案:

答案 0 :(得分:1)

请参阅xmlschema-dev@w3.org邮件列表上的this thread。亨利·汤普森(Henry S. Thompson)在回答中引用了the spec的以下部分:

  

要使QName解析为架构组件,...   QName的名称空间名称与以下之一相同:

     

[...]

     
      
  • 某些的名称空间[attribute]的“实际值”    元素中包含的元素信息项    该架构文档的信息项 [添加了重点]。
  •   

因此间接导入不起作用。