能否将XML Schema包压缩成一个XSD文件?

5

我有一个由两个XSD文件组成的XSD包:假设是A.xsd和B.xsd。模式A导入(不包含)B模式。它们具有不同的命名空间。

我需要在一个不太适用xsd:imports的系统中使用这些模式。

是否可能将XSD包压缩成一个且仅一个XSD文件,或者每个命名空间一个XSD文件是绝对最小的要求?

2个回答

2
每个xs:schema元素包含了一个目标命名空间的声明。但规范中并没有说xs:schema必须是XML文档的根元素。因此,理论上你可以将两个模式元素都包装在一个包装文件中;但实际上,并不是所有的XSD验证器都能接受这样的输入。
[后来补充:由于这似乎是一个有争议的问题,也许我应该明确地说一下,我假设“一个XSD文件”指的是一个XML文档,包含在一个单独的文件中,其中包含XSD。如果你指的是其他什么,请解释一下。]
你没有说你在导入方面遇到了什么问题,但值得尝试的一件事是从A.xsd的xs:import元素中删除模式位置信息(这样导入只命名所涉及的命名空间,而不是模式文档的位置),并将A.xsd和B.xsd作为运行时参数传递给处理器。(大多数但不是所有的XSD处理器允许你在调用时指定它们要读取的一些模式文档。参数的顺序可能很重要,所以如果第一次不起作用,请尝试颠倒顺序。)

请指向一个包含两个或更多xs:schema元素的XSD文件的单个实现,我将很高兴撤回我的反对票。我认为您想到了第3.15.2节底部的评论。但请记住,该问题涉及XSD文件。WSDL文件可以嵌入多个针对不同命名空间的模式文档。但是,那不是XSD文件。它是一种特定类型的文档,支持嵌入XML模式文档。 - Petru Gardea
你似乎混淆了符合软件和数据的可能性与供应商目前支持的内容;我认为将这两个事物区分开来更有帮助,正如我在我的回答中所做的那样。关于规范所说的内容的声明并不因处理器行为的观察而成真或成假。 - C. M. Sperberg-McQueen
这只是一个小问题,但既然你问了,XSV似乎支持在同一XML文档中使用多个xs:schema元素。 - C. M. Sperberg-McQueen
我认为问题不在于此,它指的是处理 XSD 文件系统。我明确说过,每个 XSD 只有一个根 xs:schema;我并没有说每个 WSDL 只有一个 xs:schema,这将是“不完全正确”的。你似乎不同意 XSD 文件 的定义...这很好,但与本题无关。 - Petru Gardea
继续上文,如果我传入一个没有根元素的XML片段(基本上只有兄弟节点)或纯文本,它会报告“一切正常”,而不是一个好的包装模式。听起来好像它现在没有起作用。无论如何,也许是我做错了什么…… - Petru Gardea
显示剩余5条评论

1
不,这是不可能的。每个XSD只能针对一个命名空间进行定位。如果有什么需要,每个XSD只能有一个根元素xs:schema,并且只能有一个名为targetNamespace的属性(该属性不是列表)。

确实...我重新阅读了一些XSD标准文档,意识到了这一点。感谢确认 :-) - Georges Martin
1
不完全正确。每个“模式文档”使用一个命名空间,但XSD规范将“模式文档”定义为xs:schema元素。它被称为文档,因为xs:schema通常是最外层的元素,但这实际上并不是规范的要求。 - C. M. Sperberg-McQueen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接