从另一个模式引用xsd模式的基础知识



我们正在编写一个新的xsd模式,它将基于并引用另一个模式(即GPS数据的行业事实标准GPX)。我们的模式将用于验证客户端生成的文档和测试。我需要更好地理解如何从我们的新模式中引用基本模式,特别是考虑到我们的系统不可能有Internet连接。

我的理解是,对其他服务器上xsd文档的引用通常在那里,以便开发人员可以在开发期间检索文档,但是在系统运行时验证期间,拥有模式的本地副本是明智的,因为仅仅因为远程服务器不可达而挂起生产是不明智的。这是正确的吗?

那么,如果是这样的话,xsd是否希望我既引用远程基本xsd模式,又引用模式的一些本地副本的名称和位置?或者在我的新模式文件中不需要这样的引用?希望这能说得通。谢谢。

要引用另一个模式,惯例是将该模式置于引用它的"主"模式的本地。例如,要导入一个定义了一些可重用类型的模式:

<xs:import namespace="http://CommonTypesNamespace/CommonTypes" 
           schemaLocation="CommonTypes.xsd"/>

这基本上是说存在一个称为CommonTypes的模式。XSD,它将在与主模式相同的目录中找到。schemaLocation属性被用作从我的引用模式到实际模式文件的相对路径(注意:它也是完全可选的-请参阅本回答底部的注释)。

使用CommonTypes中的类型。在xsd中,我首先在主模式声明中添加公共类型名称空间:

<xs:schema targetNamespace="http://MyNamespace/MyTypes" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified" 
           xmlns:common="http://CommonTypesNamespace/CommonTypes">

这是说我想让我的公共模式的类型在我的主模式中可用,使用命名空间前缀"common"。

然后,例如,引用一个"Address"通用类型:

<xs:element name="DeliveryAddress" type="common:AddressType" />

这表示我的交付地址类型实际上与公共类型模式中定义的AddressType类型相同。

注意:schemaLocation也可以与URI、绝对路径或UNC路径一起使用,或者根本不使用,因为它是一个完全可选的属性。如果不使用schemaLocation,解析器很可能会扫描本地目录,寻找定义了正确名称空间的模式,但这取决于实现。

最新更新