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

bet*_*oys 18 xsd

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

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

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

tom*_*ern 28

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

<xs:import namespace="http://CommonTypesNamespace/CommonTypes" 
           schemaLocation="CommonTypes.xsd"/>
Run Code Online (Sandbox Code Playgroud)

这基本上是说存在一个名为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">
Run Code Online (Sandbox Code Playgroud)

这就是说我想使用名称空间前缀"common"在我的主模式中使用我的公共模式中的类型.

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

<xs:element name="DeliveryAddress" type="common:AddressType" />
Run Code Online (Sandbox Code Playgroud)

这表示我的传递地址类型实际上与公共类型模式中定义的AddressType相同.

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

  • 更新了我的回答以反映.请随时进一步编辑. (2认同)