XSD 요소 대체
XML 스키마를 사용하면 한 요소가 다른 요소를 대체할 수 있습니다.
요소 대체
영국과 노르웨이라는 서로 다른 두 국가의 사용자가 있다고 가정해 보겠습니다. 우리는 사용자가 XML 문서에서 노르웨이어 요소 이름을 사용할지 영어 요소 이름을 사용할지 선택할 수 있는 기능을 원합니다.
이 문제를 해결하기 위해 XML 스키마에서 replacementGroup 을 정의할 수 있습니다. 먼저 head 요소를 선언한 다음 head 요소를 대체할 수 있음을 나타내는 다른 요소를 선언합니다.
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
위의 예에서 "name" 요소는 head 요소이고 "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>
대체 그룹 사용
대체 가능한 요소의 유형은 헤드 요소의 유형과 동일하거나 파생되어야 합니다. 대체 가능한 요소의 유형이 헤드 요소의 유형과 동일한 경우 대체 가능한 요소의 유형을 지정할 필요가 없습니다.
replacementGroup의 모든 요소(헤드 요소 및 대체 가능한 요소)는 전역 요소로 선언되어야 합니다. 그렇지 않으면 작동하지 않습니다!
전역 요소란 무엇입니까?
전역 요소는 "스키마" 요소의 직계 자식 요소입니다! 로컬 요소는 다른 요소 내에 중첩된 요소입니다.