仅从一个xsd导入到另一个xsd

时间:2012-09-26 17:28:34

标签: xml xsd schema

这里的问题是 - 是否可以从xsd?

导入类型的子集

考虑以下示例: A.xsd包含三种类型a,b,c 而B.xsd包含两种类型d,e。

当我在B.xsd中导入A.xsd时如下:

<xs:import namespace="http://www.abc.com/schema/aaa" schemaLocation="A.xsd"/>

我得到了所有三种类型-a,b和c。我只想在B.xsd中键入a。我想在xsd中排除类型b和c。有可能吗?如果是,有哪些选择?

由于 PC

2 个答案:

答案 0 :(得分:1)

不,你不能这样做。但你为什么要这样?剩余未使用的类型肯定没有害处吗?

答案 1 :(得分:1)

用@Michael来解释,No you can't do it.如果你对某些规范阅读感兴趣,this is where就会有所描述。

至于为什么有人想要这样做,我可以提供一个我经常看到的例子。我没有声称它适用于你的场景,但它应该帮助那些想知道原因。

这一切都始于大多数人对架构的期望:准确验证他们想要什么,而不是更多。然后,思维模式假设如果XML是模式有效的,那么在后面的代码中就没有或几乎没有验证。这可能是人们可以看到这么多问题的原因,即使是在SO上也是如此,这些问题涉及各种各样的验证方案,这些方案似乎推动了人们想要用XSD做些什么。

我经常遇到的是那些建立自己或参考(例如行业标准)这些精心设计的类型层次结构和替换组的人,以实现虽然在企业模型中将它们像那样有意义,但是关注结束在端到端视图中,企业中的各个系统仅支持该类型层次结构的子集。

当创建XSD以遵循开放内容的某些模式(通过抽象元素或抽象类型元素)时,包含这些额外类型或元素的模式需要通过对具有xsi:类型引用错误的类型或使用替换组的错误成员。

为了说明,考虑一个基本抽象类型Address;具体地址:加拿大,美国,墨西哥,英国。例如。使用英国地址而不是加拿大/美国/墨西哥对特定商业服务无效。

在您的情况下,假设类型ab和/或c没有依赖关系,唯一的方法是拆分 A.xsd 使用a A',其余为 A'',然后在 B中引用 A'的.xsd 即可。有一些方法可以自动执行此操作,因此从维护角度来看,开销可能非常低;当通过自动XML Schema Refactoring(XSR)完成时, A.xsd 的未来版本(我假设不属于您的版本)可以轻松地与您的解决方案的其余部分集成。