使用从导入导入的xsd中的类型

使用从导入导入的xsd中的类型,xsd,Xsd,如果一个顶级xsd导入了第二个级别,而第二个级别又导入了第三个级别,那么在第一个级别中是否可以使用第三个级别的类型?或者第一个必须直接导入第三个吗?如果你说的是类型。。它是而不是 答案是:解析器负责将所有XSD链接在一起 请参见下面的示例: <?xml version="1.0" encoding="utf-8"?> <root> <child>trial</child> <child2>trial2</child2>

如果一个顶级xsd导入了第二个级别,而第二个级别又导入了第三个级别,那么在第一个级别中是否可以使用第三个级别的类型?或者第一个必须直接导入第三个吗?

如果你说的是
类型
。。它是
而不是

答案是:解析器负责将所有XSD链接在一起

请参见下面的示例:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <child>trial</child>
  <child2>trial2</child2>
  <trunk>
    <branch>1</branch>
    <branch>2</branch>
  </trunk>
  <specialchild>test</specialchild>
</root>
类型分支是在
include multiple XSDs3.xsd
文件中定义的简单类型,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:include schemaLocation="include multiple XSDs3.xsd"/>
  <xs:complexType name="trunk">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" name="branch" type="branch" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="branch">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:simpleType name="specialchild">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
</xs:schema>

*现在棘手的部分是:
specialchild
XSD_1
中声明,如
XSD_3
中所定义,这两个XSD通过
XSD_2
链接。。 您可以看到,默认情况下,解析器负责链接所有XSD并将它们视为一个*

希望这能解决你的问题

好问题! 从说明书上看,我真的说不出来。它没有明确地解决可传递导入的问题

在入门(第0部分)中,他们只讨论了导入的一个级别:

在Structure(第1部分)中,它也只定义了直接导入,因为它谈到了“寻址此类外部组件的方法”(我认为这意味着名称空间),也许可以合理地假设,寻址导入模式的显式方法是必要的——换句话说,每个模式都需要导入中的显式名称空间

谷歌搜索显示,其他人也对这个问题感到困惑:

这些帖子最让人担心的是,不同的xsd处理器有不同的行为——这表明处理器的编写者也感到困惑

尽管这一点自那些帖子(2002年、2005年)以来已经发生了变化,但最明智的做法似乎是避免这个问题,只使用直接进口,因为这将适用于所有处理器

正如我所说:好问题


这里有一个测试,用来检查xsd处理器(当然,这不能保证它能为其他使用其他xsd处理器的人工作…)。我发现我最喜欢的一个(xmllint)不允许传递性导入

测试有三种模式:a.xsd导入b.xsd,b.xsd又导入c.xsd;c.xsd中定义的类型引用自a.xsd:


你好,世界
$xmllint--schema a.xsd a.xml--noout
a、 xsd:6:element元素:模式解析器错误:element
'{http://www.w3.org/2001/XMLSchema}元素',属性'type':来自的引用
此架构将指向命名空间中的组件http://www.c.com"不允许,,
因为未通过导入语句指示。
WXS架构a.xsd未能编译
错误消息是:
从此架构引用命名空间中的组件http://www.c.com'是不允许的,因为它不是由导入语句指示的。
,这表明xmllint的开发人员至少非常确定导入是不可传递的

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="branch">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:simpleType name="specialchild">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
</xs:schema>
<!-- a.xsd -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:c="http://www.c.com" targetNamespace="http://www.a.com">
  <xsd:import namespace="http://www.b.com" schemaLocation="b.xsd"/>
<!--  UNCOMMENT FOR DIRECT IMPORT
  <xsd:import namespace="http://www.c.com" schemaLocation="c.xsd"/>
-->
  <xsd:element name="eg" type="c:TypeC"/>
</xsd:schema>

<!-- b.xsd -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:import namespace="http://www.c.com" schemaLocation="c.xsd"/>
</xsd:schema>

<!-- c.xsd -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.c.com">
  <xsd:simpleType name="TypeC">
      <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>
</xsd:schema>


<!-- a.xml -->
<eg xmlns="http://www.a.com">hello world</eg>

$ xmllint --schema a.xsd a.xml  --noout
a.xsd:6: element element: Schemas parser error : Element
'{http://www.w3.org/2001/XMLSchema}element', attribute 'type': References from
this schema to components in the namespace 'http://www.c.com' are not allowed,
since not indicated by an import statement.
WXS schema a.xsd failed to compile