假设我有一些外部架构定义了一种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:消息声明吗?这种“延伸”是否可行?
答案 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的工具使用。