【发布时间】:2012-09-20 14:04:53
【问题描述】:
我有一个由两个 XSD 文件组成的 XSD 包:假设是 A.xsd 和 B.xsd。模式 A 导入(不包括)B 模式。它们有不同的命名空间。
我需要在不能很好地与xsd:imports 配合使用的系统中使用这些架构。
是否可以将一个 XSD 包扁平化为一个且只有一个 XSD 文件,或者每个命名空间一个 XSD 文件是绝对最小值?
【问题讨论】:
我有一个由两个 XSD 文件组成的 XSD 包:假设是 A.xsd 和 B.xsd。模式 A 导入(不包括)B 模式。它们有不同的命名空间。
我需要在不能很好地与xsd:imports 配合使用的系统中使用这些架构。
是否可以将一个 XSD 包扁平化为一个且只有一个 XSD 文件,或者每个命名空间一个 XSD 文件是绝对最小值?
【问题讨论】:
每个xs:schema 元素只包含一个目标命名空间的声明。但是规范中没有说xs:schema 必须是XML 文档的根元素。因此,理论上,您可以将两个模式元素都包装在一个包装文件中;在实践中,并非所有 XSD 验证器都会对它作为输入感到满意。
[稍后补充:因为这似乎是一个有争议的观点,也许我应该明确地说,我假设“一个 XSD 文件”是指一个 XML 文档,包含在一个包含 XSD 的单个文件中。如果你的意思是别的,请解释一下。]
您没有说导入时遇到了什么样的问题,但可能值得尝试的一件事是从 A.xsd 中的 xs:import 元素中删除架构位置信息(因此导入只是名称涉及的命名空间,而不是模式文档的位置),并将 A.xsd 和 B.xsd 作为运行时参数传递给处理器。 (虽然不是所有的 XSD 处理器都允许您在调用时指定一些架构文档供它们读取。参数的顺序可能很重要,所以如果第一次不起作用,请尝试颠倒顺序。)
【讨论】:
a system。我清楚地说,there's only one root xs:schema per XSD;我没有说,there's only one xs:schema per WSDL 这将是“不完全正确”。您似乎不同意 XSD files... 的定义,这很酷,但与此无关。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="root" type="Troot"/></xs:schema> 并得到<xsv xmlns="http://www.w3.org/2000/05/xsv" docElt="{http://www.w3.org/2001/XMLSchema}schema" instanceAssessed="true" instanceErrors="0" realName="Document1.xsd" rootType="[Anonymous]" schemaErrors="0" target="file:/usr/local/XSV/xsvlog/tmpytDZhKuploaded" validation="strict" version="XSV 3.1-1 of 2007/12/11 16:20:05"/> - 我预计会出错。尝试了一个用假人包裹的好架构......
不,这是不可能的。每个 XSD 只能定位一个命名空间。如果有的话,每个 XSD 只有一个根 xs:schema,只有一个名为 targetNamespace 的属性(不是列表)。
【讨论】:
xs:schema 元素。之所以称为文档,是因为 xs:schema 通常是最外层的元素,但这实际上并不是规范的要求。