XSD 요소 대체(Element Substitution)

XML 스키마를 통해, 하나의 요소는 다른 요소를 대체할 수 있습니다.

요소 대체

예를 들어 설명해 보겠습니다: 우리의 사용자는 영국과 노르웨이에서 옵니다. 우리는 사용자가 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)는 다른 요소 중에 들어 있는 요소를 의미합니다.