2014-03-27 55 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>