2013-10-29 4 views
1

유형이 참조되는 장소에서 유형의 카디널리티를 정의하는 방법이 있습니까? 만약 같은 (복잡한 유형의 벡터

<xs:complexType name="xyType"> 
    <xs:element name="xy" maxOccurs="1"> 
      <xs:choice maxOccurs="1" minOccurs="0"> 
       <xs:complexType> 
        <xs:choice maxOccurs="unbounded" minOccurs="0"> 
         ... 
        </xs:choice> 
       </xs:complexType> 
      </xs:element> 
     </xs:choice> 
    </xs:complexType> 

그래서 예를 들어 이런 종류 참조 요소를 갖는 두 종류의 A와 B가 있지만, 어느 경우 I는 하나 XY 있도록 (상기와 같은) 다른 I 여러 XY 허용하고자 위의 maxOccurs를 xy에 대해 "제한되지 않음"으로 변경).

실제로이 유형에 대한 정의가 매우 길고 복잡하기 때문에 xyType (단일) 및 xyType (제한되지 않음)에 대한 complexType 정의를 완전히 분리하지 않으려합니다.

가능한 한 너무 많은 유형을 정의하지 않으려합니다 (내부 complexType을 본문에서 분리하고 해당 유형을 참조하는 두 가지 유형이있는 것처럼). 이것은 또한 특정 시나리오에서 매우 복잡 할 것입니다 (스키마로 정의하려고하는 복잡한 클래스 계층 구조가 있으므로 모든 것이 이미 비대 해져 있습니다).

그래서 기본적으로 나는이 유형을 참조하는 유형이 그것이 의미가있는 경우 카디널리티를 돌보는 무언가를 찾고 있습니다.

답변

0

XSD 1.0에서는 작동하지 않습니다. XSD 1.0 위에 Schematron을 사용할 수 있습니다. 아무런 문제없이 작동 할 것입니다.

XSD 1.1에서 가능합니다. 적어도 내 이해를 바탕으로 약간의 작업이 필요할 것입니다. 해결 방법은 어설 션을 사용하는 것입니다. 그러나 이들은 복잡하고 단순한 유형에 대해서만 지원되는 것으로 보이므로 요소 A와 B에 특정한 두 가지 새로운 유형을 도입해야 할 수도 있습니다. 그러나 A와 B에 관련된 어설 션을 정의 할 수있는 장소를 제공하기 위해 단순히 xyType (100 % 재사용)을 확장해야합니다.

두 가지 방법 모두에 관심이 있으시면 질문에 적절하게 태그를 답니다.

1

난 당신이 두 가지 유형을 통해 공유 최선을 가능한 한 xyType의 부품을 모듈화하는 것이 좋습니다 것, 할 수 xyType_A 말을 하나 xyxy의의 억제 할 수 있습니다 xyType_B. (물론 의미 적으로 적절한 이름이 아니라이 독립 인을 선택합니다.)

예를 들어

, xyType_AxyType_Bxy의 기수 자신의 정의에 차이가있을 수 아직 commonType에 정의 된 복잡한 기계 공유 :

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="xyType_A"> 
    <xs:sequence> 
     <xs:element name="xy" type="commonType" maxOccurs="1"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="xyType_B"> 
    <xs:sequence> 
     <xs:element name="xy" type="commonType" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="commonType"> 
    <xs:choice maxOccurs="1" minOccurs="0"> 
     <xs:sequence> 
     <xs:choice maxOccurs="unbounded" minOccurs="0"> 
      <!-- further complicated structures continue here --> 
     </xs:choice> 
     <!-- and here or wherever --> 
    </xs:sequence> 
    </xs:choice> 
    </xs:complexType> 

</xs:schema> 

다양한 중요성의 요소가 정의 계층 구조에서 더 깊다면 원칙 (기회의 크기가 아닐 경우)은 동일합니다. 일반적인 정의 구성 요소를 최대한 많이 고려하고 명확하게 정의 된 유형의 요소를 다시 사용하십시오.

관련 문제