2

这里的问题是——是否可以从 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。有可能这样做吗?如果是,有哪些选择?

谢谢电脑

4

2 回答 2

1

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

于 2012-09-26T19:49:07.777 回答
1

套用@Michael,No you can't do it.如果您对某些规范阅读感兴趣,就是描述的地方。

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

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

我经常遇到的是那些建立自己或参考(例如行业标准)这些精心设计的类型层次结构和替代组的人,他们意识到虽然在企业模型中使用它们是有意义的,但它关注端到端-最终,企业内的各个系统仅支持该类型层次结构的子集。

当 XSD 被编写为遵循开放内容的某些模式(通过抽象元素或抽象类型元素)时,包含这些额外类型或元素的模式将通过对 xsi:type 引用错误类型或使用替换组的错误成员。

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

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

于 2012-09-27T14:14:26.213 回答