2013-10-03 3 views
1

나는 다음과 같이 로컬 복합 타입의 요소가 스키마를 가지고있다. XSD 제한은

<xs:complexType name="AddressType"> 
    <xs:sequence> 
     <xs:element name="Line1" type="xs:string" minOccurs="0"/> 
     <xs:element name="Line2" type="xs:string" minOccurs="0" maxOccurs="100"/> 
     <xs:element name="Location" minOccurs="0" maxOccurs="100"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="XCoordinate" type="xs:decimal" minOccurs="0"/> 
        <xs:element name="YCoordinate" type="xs:decimal" minOccurs="0"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType> 

이 나는 ​​사람이 제가 worng 뭐하는 거지 이해하는 데 도움시겠습니까 다음과 같은 오류

**Error for type 'InternalAddressType'. The particle of the type is not a valid restriction of the particle of the base. 

을 얻고있다

<xs:complexType name="InternalAddressType"> 
    <xs:complexContent> 
     <xs:restriction base="AddressType"> 
      <xs:sequence> 
       <xs:element name="Location" > 
       </xs:element> 
      </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
</xs:complexType> 

을 다음과 같이 복합 타입을 확장하려합니다. 문제는 위치가 로컬 컴플렉스 유형이라는 것입니다. 하지만 클라이언트에서 xsd를 가져오고 Loaction 만 확장해야하므로 변경할 수 없습니다. 이 상황을 어떻게 해결할 수 있습니까? 다른 제안 사항은 환영합니다.

답변

0

당신이 옳아 요 :이 지역 complexType에 의해 정의되어 있기 때문에 당신은 Location을 제한 할 수 없습니다.

에도 restriction 동일한 구성 요소가 유사 실패 포함하는 AddressType의 :

<xs:complexType name="InternalAddressType"> 
    <xs:complexContent> 
     <xs:restriction base="AddressType"> 
      <xs:sequence> 
      <xs:element name="Line1" type="xs:string" minOccurs="0"/> 
      <xs:element name="Line2" type="xs:string" minOccurs="0" maxOccurs="100"/> 
      <xs:element name="Location" minOccurs="0" maxOccurs="100"> 
       <xs:complexType> 
       <xs:sequence> 
        <xs:element name="XCoordinate" type="xs:decimal" minOccurs="0"/> 
        <xs:element name="YCoordinate" type="xs:decimal" minOccurs="0"/> 
       </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
      </xs:sequence> 
     </xs:restriction> 
    </xs:complexContent> 
    </xs:complexType> 

Location을 무시하려는 시도없이를, 위의 정의는 잘 될 것입니다.

AddressType을 로컬 complexType에서 꺼내려면 변경할 수 없다는 점을 감안할 때 무엇을 할 수 있습니까? 귀하의 요구 사항에 따라, 아마 당신은 xs:extension를 사용 AddressType를 확장하고 당신이 원하는대로 당신의 자신의 MyLocation 요소, 원래 Location 요소를 무시하지 정의 할 수 있습니다 (그것을 만들거나 결코를 - 그것은 선택 사항입니다). 또는 InternalAddressType의 완전히 분리 된 정의가 효과적 일 수 있습니다. 이러한 가능성 중 어느 것도 귀하의 목적을 충족시키지 못한다면 의견에 최종 목표의 요구 사항을 기술하십시오. 아마도 우리는 적절하게 가까운 것을 찾을 수 있습니다.

+0

안녕 @kjhughes, 당신의 답장을 보내 주셔서 감사합니다. 내가 뭘 하려는지 위의 스키마 ("InternalAddressType") 위의 하나와 같은 구조지만 더 많은 요소가있는 다른 스키마 ("InternalAddressType_1")를 만들고 싶습니다 주어진 것입니다. 확장 기능을 사용할 수 있었지만 문제는 "위치"에서 변경을 허용하지 않는다는 것입니다. Location_1이라는 새로운 유형을 만들어 거기에 요소를 추가해야합니다. 따라서 필자는 부분 데이터가있는 위치의 두 가지 구조를 유지해야합니다. 위치 인스턴스가 여러 개있는 경우 어떤 문제가 발생합니까? – Rush

+0

'InternalAddressType'을'InternalAddressType_1'으로 추가/확장하는 것을 계획하는 것은'Location'이 (여러분의 통제를 벗어난)'AddressType'에서 정의 된 방식으로 덮어 쓸 수 없다는 원래의 문제를 악화시킵니다.실질적으로 말하자면, 이러한 제한 조건 하에서'AddressType'의'Location' 정의를 공유 할 수 없다는 것을 받아 들여야 할 것 같습니다. – kjhughes

0

XSD 1.1을 사용할 수있는 경우 (슬프게도 많은 사람이 아님) 어제의 형태로 제한을 정의 할 수 있습니다. 즉, 추가 조건을 정확히 적용하기를 원하기 때문입니다. 제 생각에 원본과 긴밀한 일치를 유지해야하는 대체 콘텐츠 모델을 제공하는 것보다 훨씬 유용한 메커니즘입니다.

XSD 1.1은 현재 색슨과 Xerces에 구현된다.

다른 해결책은 두 단계의 확인이다. 클라이언트의 스키마를 사용하여 문서가 클라이언트가 정의한 제약 조건을 준수하는지 확인한 다음 자체 스키마 (또는 다른 기술)를 사용하여 사용자가 정의한 추가 제약 조건을 준수하는지 확인합니다. 어쨌든 그것은 구조적으로 더 깨끗한 접근 일 수 있습니다.