鉴于进入第二级的顶级xsd又导入第三级,是否可以使用第一级中的第三级?或者第一个是否必须直接导入第三个?
答案 0 :(得分:3)
好问题! 从阅读规范,我不能说。它没有明确明确地解决传递导入的问题。
在Primer(第0部分)中,他们只讨论了一个级别的导入:http://www.w3.org/TR/xmlschema-0/#import
在结构(第1部分)中,它也只定义直接导入http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#composition-schemaImport因为它谈到“解决这种外来组件的方法”(我认为这意味着名称空间),也许有理由认为是明确的解决导入模式的方法是必要的 - 换句话说,每个都需要导入中的显式命名空间。
Google搜索显示其他人也对这个问题感到困惑:
这些帖子最令人担忧的是,不同的xsd处理器有不同的行为 - 这表明处理器的编写者也感到困惑。
虽然自那些帖子(2002年,2005年)以来可能已经发生了变化,但最明智的做法似乎是避免这个问题,并且只使用直接导入,因为这将适用于所有处理器。
正如我所说:好问题。
这是一个测试,检查一个xsd处理器(当然,这不能保证它对其他人使用其他xsd处理器...)。我发现我最喜欢的一个(xmllint)不允许传递导入。
测试是三个模式: a.xsd 导入 b.xsd ,然后导入 c.xsd ; c.xsd 中定义的类型是从 a.xsd 引用的:
<!-- 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
错误消息为:References from this schema to components in the namespace 'http://www.c.com' are not allowed, since not indicated by an import statement.
,表明xmllint的开发人员至少非常确定导入不是传递。
答案 1 :(得分:1)
如果您正在谈论type
,那么...... <xs:Include>
不是<xs:Import>
..
答案是: Parser负责将所有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>
对于上面的XML,我将设计一个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 XSDs2.xsd"/>
<xs:element name="root" type ="root"/>
<xs:complexType name="root">
<xs:sequence>
<xs:element name="child" type="xs:string" />
<xs:element name="child2" type="xs:string" />
<xs:element name="trunk" type="trunk"/>
<xs:element name="specialchild" type="specialchild"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
其中type trunk在import multiple XSDs2.xsd
文件中定义,并使用<xs:include>
..(位于同一文件夹中)进行链接..代码如下所示:
<?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>
和type branch是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: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并将它们全部视为一个! * 强>
希望这能解决你的问题!