0

假设我有一些外部模式,它为 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:message 声明吗?这种“延伸”到底有没有可能?

4

1 回答 1

0

您必须考虑更多的限制。让我们首先假设 XSD 1.0 来说明这一点。在这种情况下,保持原始 XSD 和修改后的 XSD 之间分离的机制是使用xsd:redefine。这允许组合 XSD,保持原始源和您的更改之间的分离。

但前提是要有一个全局复杂类型声明或组,它定义了ext:message的内容模型。

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

从 XSD 规范的角度来看,重新定义将为您提供等效的 XSD。但是,从工具支持来看,如果听到任何支持 xsd:redefine 的 XSD 到代码绑定,我会感到惊讶。

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

于 2012-11-23T18:09:17.683 回答