我有一个用于多种服务的XSD。 在XSD中,我有和“Order”复杂类型。 另一个系统调用我的服务,并发送“订单”信息,我的服务使用发送到我服务的“订单”信息做一些事情。
在“Order”中,我有一些元素,例如:“foo”和“bar”。 我的目标是将此XSD用于多种服务,例如serviceA和serviceB。
两种服务都使用“Order”,但对于serviceA,我想要“foo”,但对于serviceB,我不需要“foo”。
我可以在XSD中控制它,或者是使“foo”可选的唯一方法,并且如果服务呼叫来自serviceA,则检查代码(在服务调用之后)它是否为空?
答案 0 :(得分:0)
您可以通过派生获得。假设您的类型Order
包含可选的foo
和bar
:
<xs:complexType name="Order">
<xs:sequence>
<xs:element ref="foo" minOccurs="0"/>
<xs:element ref="bar" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
我假设你有一个支持不同服务的根元素:
<xs:element name="services">
<xs:complexType>
<xs:choice>
<xs:element name="serviceA" type="ServiceAType" />
<xs:element name="serviceB" type="ServiceBType" />
</xs:choice>
</xs:complexType>
</xs:element>
如果serviceB
允许选择foo
和bar
,您只需将serviceB
的类型声明为Order
,或创建ServiceBType
它扩展了Order
:
<xs:complexType name="ServiceBType">
<xs:complexContent>
<xs:extension base="Order"/>
</xs:complexContent>
</xs:complexType>
如果您希望ServiceAType
限制Order
的内容以便foo
是必需的,那么您可以将其作为订单限制来实现:
<xs:complexType name="ServiceAType">
<xs:complexContent>
<xs:restriction base="Order">
<xs:sequence>
<xs:element ref="foo" minOccurs="1"/>
<xs:element ref="bar" minOccurs="0"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
现在,您可以让<serviceB>
不包含任何元素,其中包含<foo>
,<bar>
或<foo>
,后跟<bar>
。 <serviceA>
允许<foo>
后跟<bar>
或<foo>
,但不允许其他内容。