我正在尝试为遗留服务编写WSDL 1.1定义,其文档指定XML模式,该模式使不同消息的不同定义的根(和其他)元素重载。
一个简单的例子涉及一条消息的以下模式:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:example:namespace">
<element name="message" type="boolean"/>
</schema>
以及另一个:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:example:namespace">
<element name="message" type="date"/>
</schema>
因此,不能直接导入WSDL中给出的每个消息的模式,因为它引入了对{urn:example:namespace}message
定义的歧义。
也不能重写模式,以便这些重载元素验证两种消息类型,因为这会错误地暗示任何一种类型对任一消息都有效:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:example:namespace">
<element name="message">
<simpleType>
<union memberTypes="boolean date"/>
</simpleType>
</element>
</schema>
让我觉得每个消息应该在它自己的命名空间中定义,或者在同一个命名空间中使用明确的元素名称。但是,这些变化会破坏传统的服务合同,因此可能不是一种选择。
感谢您对如何解决这一难题的想法和建议!
答案 0 :(得分:0)
也许您不应该使用名为“message”的全局元素。如果'message'在anoither元素中,那么你可以使用这样的东西:
<xs:element name="m1">
<xs:complexType>
<xs:sequence>
<xs:element name="message" type="data"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="m2">
<xs:complexType>
<xs:sequence>
<xs:element name="message" type="boolean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
答案 1 :(得分:0)
Richard Schneider的answer促使我意识到我可以通过以下方式克服原始问题:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:example:namespace">
<complexType name="booleanMessageType">
<xs:sequence>
<element name="message" type="boolean"/>
</xs:sequence>
</complexType>
<complexType name="dateMessageType">
<xs:sequence>
<element name="message" type="date"/>
</xs:sequence>
</complexType>
</schema>
然后是WSDL:
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:ns="urn:example:namespace"
targetNamespace="urn:example:wsdl">
<import namespace="urn:example:namespace" location="schema.xsd"/>
<message name="BooleanMessage">
<part name="body" type="ns:booleanMessageType"/>
</message>
<message name="DateMessage">
<part name="body" type="ns:dateMessageType"/>
</message>
<!-- remainder of WSDL omitted for brevity -->
</definitions>
这引发了一个次要问题,我将在发布后将其作为评论链接。