在其他模式中使用外部XSD架构的一部分

时间:2012-11-23 13:26:32

标签: xsd

假设我有一些外部架构定义了一种Web服务信封:

<ext:envelope>
  <ext:message>
    <!-- anything else -->
  </ext:message>
</ext:envelope>

其中ext是外部名称空间
它将<ext:message>定义为

<xs:any namespace="##any" processContents="lax" minOccurs="0"
            maxOccurs="unbounded" />

这是我的问题:如果我想为我的服务编写WSDL模式,那必须符合这个信封,我该如何编写定义如下内容的模式:

<ext:envelope>
  <ext:message>
    <my:myElement />
  </ext:message>
</ext:envelope>

我应该以某种方式扩展ext:消息声明吗?这种“延伸”是否可行?

1 个答案:

答案 0 :(得分:0)

您还需要考虑更多限制因素。让我们首先假设XSD 1.0来对此进行语境化。在这种情况下,保持原始XSD与修改后的XSD之间分离的机制是使用 xsd:redefine 。这允许组合XSD,保持原始源和您的更改之间的分离。

但先决条件是拥有一个全局复杂类型声明或组,用于定义 ext:message 的内容模型。

xsd:redefine允许您使用您选择的内容模型替换通配符。它需要是类型或组的限制

重新定义会给你一个等效的XSD,从XSD规范的角度来看就好了。但是,从工具支持,我会惊讶地听到任何XSD代码绑定支持xsd:redefine。

如果在您的情况下,您使用的工具或目标使用xsd:redefine,那么您就完成了。否则,您可以选择应用自动XML Schema Refactoring,它能够创建没有xsd:redefine的XSD文件。实际上,自动转换会执行您可以手动执行的操作,但它是进行持续维护的更好选择。结果XSD(没有重新定义)几乎相同(因为它们代表PSVI模型),并且可以由不支持xsd:redefine的工具使用。