2014-03-27 58 views
1

我有一个用于多个服务的XSD。 在XSD中,我有“Order”复杂类型。 另一个系统调用我的服务,并发送“订单”信息,我的服务通过发送给我的服务的“订单”信息做一些事情。验证XSD并重用元素

在“订单”,我有几个元素,例如:“foo”和“酒吧”。 我的目标是将这个XSD用于多种服务,例如serviceA和serviceB。

两个服务中使用“订单”,但对于serviceA我想让要求的“富”,但对于serviceB我不想“foo”的要求。

我可以在XSD中控制它吗,或者是使“foo”为可选项的唯一方法,并且在服务调用来自serviceA时检入代码(服务调用后)它不是空的?

回答

0

您可以获得与推导。假设你有一个类型Order包含可选foobar

<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允许可选foobar,你可以简单地声明的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>将允许之后<bar><foo>,但没有别的<foo>