2014-03-27 2 views
1

여러 서비스에 사용되는 XSD가 있습니다. XSD에서 복잡한 유형의 "주문"이 있습니다. 다른 시스템에서 내 서비스를 호출하고 "주문"정보를 보내고 내 서비스는 내 서비스로 전송되는 "주문"정보를 일부 처리합니다.XSD 유효성 검사 및 요소 재사용

"주문"에는 몇 가지 요소가 있습니다 (예 : "foo"및 "bar"). 제 목표는 serviceA와 serviceB와 같이 여러 서비스에이 XSD를 사용하는 것입니다.

두 서비스 모두 "주문"을 사용하지만 serviceA에 대해서는 "foo"가 필요하지만 serviceB에 대해서는 "foo"가 필요하지 않습니다.

XSD에서이를 제어하거나 "foo"옵션으로 지정할 수있는 유일한 방법은 서비스 호출이 serviceA에서 오는 경우 비어 있지 않은지 (서비스 호출 후) 체크 인 할 수 있습니까?

답변

0

파생으로 얻을 수 있습니다. 당신은 유형이 가정 포함 Orderfoo 옵션 및 bar : 당신이 serviceB은 선택 foobar 허용하는 경우

<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> 

:

<xs:complexType name="Order"> 
    <xs:sequence> 
     <xs:element ref="foo" minOccurs="0"/> 
     <xs:element ref="bar" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 

난 당신이 다른 서비스를 지원하는 루트 요소가 있으리라 믿고있어 serviceB 유형을 Order으로 간단하게 선언하거나 을 생성하여 Order :

를 포함

이제
<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>을 가질 수 : 3,516,

<xs:complexType name="ServiceBType"> 
    <xs:complexContent> 
     <xs:extension base="Order"/> 
    </xs:complexContent> 
</xs:complexType> 

당신이 foo이 필요하다는 것을, 당신은 주문의 제한으로 구현할 수 있도록 Order의 내용을 제한 할 ServiceAType를 원하는 경우 <bar> 또는 <foo> 다음에 <bar>이옵니다. <serviceA><foo>, 그 다음은 <bar> 또는 <foo>이지만 다른 것은 허용하지 않습니다.