37장. 요소 하위 항목
초록
XML 스키마 대체 그룹을 사용하면 최상위 수준 또는 헤드 요소를 교체할 수 있는 요소 그룹을 정의할 수 있습니다. 이 기능은 공통 기본 유형 또는 상호 교환이 필요한 요소를 공유하는 여러 요소가 있는 경우에 유용합니다.
37.1. XML 스키마의 대체 그룹
37.1.1. 개요
대체 그룹은 해당 스키마에서 생성된 문서의 다른 요소를 교체할 수 있는 요소를 지정할 수 있는 XML 스키마의 기능입니다. 교체 가능 요소는 head 요소라고 하며 스키마의 전역 범위에 정의되어 있어야 합니다. 대체 그룹의 요소는 head 요소와 동일한 유형 또는 헤드 요소의 유형에서 파생되어야 합니다.
본질적으로 대체 그룹을 사용하면 일반 요소를 사용하여 지정할 수 있는 요소 컬렉션을 빌드할 수 있습니다. 예를 들어 세 가지 유형의 위젯을 판매한 회사의 주문 시스템을 구축하는 경우 세 가지 위젯 유형에 대한 공통 데이터 세트가 포함된 일반 위젯 요소를 정의할 수 있습니다. 그런 다음 각 위젯 유형에 대해 보다 구체적인 데이터 세트를 포함하는 대체 그룹을 정의할 수 있습니다. 계약에서 각 위젯 유형에 대한 특정 순서 작업을 정의하는 대신 일반 위젯 요소를 메시지 부분으로 지정할 수 있습니다. 실제 메시지가 작성되면 메시지에 대체 그룹의 요소가 포함될 수 있습니다.
37.1.2. 구문
대체 그룹은 XML 스키마 요소
요소의 substitutionGroup
특성을 사용하여 정의됩니다. substitutionGroup
특성의 값은 정의 중인 요소가 대체되는 요소의 이름입니다. 예를 들어 head 요소가 위젯
인 경우, tree Widget
이라는 요소에 substitutionGroup="widget"을 추가하면 위젯
요소가 사용되는 모든 위치에서 이 요소를 대체할 수 있습니다. 이는 예 37.1. “하위 그룹 사용” 에 표시됩니다.
예 37.1. 하위 그룹 사용
<element name="widget" type="xsd:string" />
<element name="woodWidget" type="xsd:string"
substitutionGroup="widget" />
37.1.3. 유형 제한 사항
대체 그룹의 요소는 head 요소와 동일한 유형 또는 헤드 요소의 유형에서 파생되어야 합니다. 예를 들어 head 요소가
유형의 경우 대체 그룹의 모든 멤버가 xsd:int
xsd:int
또는 xsd:int에서 파생된 유형이어야 합니다. 대체 그룹의 요소는 헤드 요소의 유형에서 파생되는 유형인 예 37.2. “복잡한 유형이 있는 대체 그룹” 에 표시된 대체 그룹을 정의할 수도 있습니다.
예 37.2. 복잡한 유형이 있는 대체 그룹
<complexType name="widgetType"> <sequence> <element name="shape" type="xsd:string" /> <element name="color" type="xsd:string" /> </sequence> </complexType> <complexType name="woodWidgetType"> <complexContent> <extension base="widgetType"> <sequence> <element name="woodType" type="xsd:string" /> </sequence> </extension> </complexContent> </complexType> <complexType name="plasticWidgetType"> <complexContent> <extension base="widgetType"> <sequence> <element name="moldProcess" type="xsd:string" /> </sequence> </extension> </complexContent> </complexType> <element name="widget" type="widgetType" /> <element name="woodWidget" type="woodWidgetType" substitutionGroup="widget" /> <element name="plasticWidget" type="plasticWidgetType" substitutionGroup="widget" /> <complexType name="partType"> <sequence> <element ref="widget" /> </sequence> </complexType> <element name="part" type="partType" />
대체 그룹인 위젯
의 head 요소는 widgetType
유형으로 정의됩니다. 대체 그룹의 각 요소는 widgetType
을 확장하여 해당 유형의 위젯을 정렬하는 데 고유한 데이터를 포함합니다.
예 37.2. “복잡한 유형이 있는 대체 그룹” 의 스키마에 따라 예 37.3. “하위 그룹을 사용하는 XML 문서” 의 파트
요소가 유효합니다.
예 37.3. 하위 그룹을 사용하는 XML 문서
<part> <widget> <shape>round</shape> <color>blue</color> </widget> </part> <part> <plasticWidget> <shape>round</shape> <color>blue</color> <moldProcess>sandCast</moldProcess> </plasticWidget> </part> <part> <woodWidget> <shape>round</shape> <color>blue</color> <woodType>elm</woodType> </woodWidget> </part>
37.1.4. 추상 헤드 요소
스키마를 사용하여 생성된 문서에 표시되지 않는 추상 헤드 요소를 정의할 수 있습니다. 추상 헤드 요소는 일반 클래스의 보다 구체적인 구현을 정의하는 기반으로 사용되므로 Java의 추상 클래스와 유사합니다. 추상 헤드는 최종 제품의 일반 요소 사용을 방지합니다.
예 37.4. “추상 헤드 정의” 와 같이 요소 요소의 abstract
특성을 true
로 설정하여 추상 헤드 요소를
선언합니다. 이 스키마를 사용하여 유효한 검토
요소는 positiveComment
요소 또는 negativeComment
요소를 포함할 수 있지만 주석
요소를 포함할 수 없습니다.
예 37.4. 추상 헤드 정의
<element name="comment" type="xsd:string" abstract="true" />
<element name="positiveComment" type="xsd:string"
substitutionGroup="comment" />
<element name="negtiveComment" type="xsd:string"
substitutionGroup="comment" />
<element name="review">
<complexContent>
<all>
<element name="custName" type="xsd:string" />
<element name="impression" ref="comment" />
</all>
</complexContent>
</element>