XSD 요소 대체(Element Substitution)

XML Schema를 통해 하나의 요소가 다른 요소를 대체할 수 있습니다.

요소 대체

예제를 들어 설명해 보겠습니다: 우리의 사용자는 영국과 노르웨이에서 옵니다. XML 문서에서 노르웨이어의 요소 이름을 사용하거나 영어의 요소 이름을 사용할 수 있는 능력을 가지고 싶습니다.

이 문제를 해결하기 위해 XML 스키마에서 정의할 수 있습니다 substitutionGroup먼저, 주요 요소를 선언한 후, 이러한 서브 요소가 주요 요소를 대체할 수 있도록 선언합니다.

<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>

위의 예제에서 "name" 요소는 주요 요소이고, "navn" 요소는 "name" 요소를 대체할 수 있습니다.

다음과 같은 XML 스키마의 부분을 보세요:

<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="customer" type="custinfo"/>
<xs:element name="kunde" substitutionGroup="customer"/>

유효한 XML 문서는 위의 스키마에 따라 이렇게 될 것입니다:

<customer>
  <name>John Smith</name>
</customer>

또는 다음과 같이:

<kunde>
  <navn>John Smith</navn>
</kunde>

요소 대체 방지

특정 요소가 다른 요소에 의해 대체되지 않도록 하려면 block 속성을 사용하세요:

<xs:element name="name" type="xs:string" block="substitution"/>

다음과 같은 XML 스키마의 부분을 보세요:

<xs:element name="name" type="xs:string" block="substitution"/>
<xs:element name="navn" substitutionGroup="name"/>
<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="customer" type="custinfo" block="substitution"/>
<xs:element name="kunde" substitutionGroup="customer"/>

유효한 XML 문서는 위의 스키마에 따라 이렇게 될 것입니다:

<customer>
  <name>John Smith</name>
</customer>

하지만 아래의 문서는 더 이상 유효하지 않습니다:

<kunde>
  <navn>John Smith</navn>
</kunde>

substitutionGroup 사용

대체 가능 요소의 타입은 주요 요소와 동일해야하거나 주요 요소에서 파생되어야 합니다. 대체 가능 요소의 타입이 주요 요소의 타입과 동일하다면, 대체 가능 요소의 타입을 지정할 필요가 없습니다.

substitutionGroup에 포함된 모든 요소(주요 요소와 대체 가능 요소)는 전역 요소로 선언되어야 하며, 그렇지 않으면 작동하지 않습니다!

전역 요소(Global Elements)는 무엇인가요?

전역 요소는 "schema" 요소의 직접 자식 요소입니다! 로컬 요소(LOCAL elements)는 다른 요소에 포함된 요소입니다.