การทดแทนองค์ประกอบ XSD
ด้วย XML Schema องค์ประกอบหนึ่งสามารถแทนที่องค์ประกอบอื่นได้
การทดแทนองค์ประกอบ
สมมติว่าเรามีผู้ใช้จากสองประเทศที่แตกต่างกัน ได้แก่ อังกฤษและนอร์เวย์ เราต้องการให้ผู้ใช้สามารถเลือกได้ว่าต้องการใช้ชื่อองค์ประกอบภาษานอร์เวย์หรือชื่อองค์ประกอบภาษาอังกฤษในเอกสาร XML
เพื่อแก้ปัญหานี้ เราสามารถกำหนดsubstitutionGroupใน XML schema อันดับแรก เราประกาศองค์ประกอบหลัก จากนั้นเราประกาศองค์ประกอบอื่นๆ ซึ่งระบุว่าใช้แทนองค์ประกอบหลักได้
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
ในตัวอย่างข้างต้น องค์ประกอบ "ชื่อ" คือองค์ประกอบหลัก และองค์ประกอบ "navn" สามารถใช้แทน "ชื่อ" ได้
ดูส่วนของ XML schema นี้:
<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 schema นี้:
<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 คืออะไร?
องค์ประกอบสากลคือองค์ประกอบที่เป็นลูกขององค์ประกอบ "สคีมา" ทันที! องค์ประกอบภายในคือองค์ประกอบที่ซ้อนอยู่ภายในองค์ประกอบอื่นๆ