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

时间:2011-11-19 12:39:34

标签: xsd

我们正在编写一个新的xsd架构,它将基于并引用另一个架构(这是一个行业事实上的GPS数据标准,称为GPX)。我们的架构将用于验证客户生成的文档以及测试。我需要更好地理解如何从我们的新模式引用基础模式,特别是考虑到我们的系统不能期望具有Internet连接。

我的理解是,在某些其他服务器上引用xsd文档通常是存在的,这样开发人员可以在开发期间检索文档,但在系统运行时验证期间,有一个模式的本地副本是明智的,因为它会因为远程服务器无法访问而暂停生产是不谨慎的。这是对的吗?

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

1 个答案:

答案 0 :(得分:28)

要引用另一个模式,将该模式作为您引用它的“主”模式的本地模式是一种惯例。例如,要导入定义一些可重用类型的模式:

<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”在我的主模式中使用我的公共模式中的类型。

然后,例如,引用“地址”常见类型:

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

这表示我的传递地址类型实际上与公共类型架构中定义的 AddressType 类型相同。

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