การแทนที่องค์ประกอบ XSD (Element Substitution)

透過 XML Schema,一個要素可對另一個要素進行置換。

要素置換

ให้เราชี้แนะด้วยตัวอย่าง: ผู้ใช้ของเรามาจากสหราชอาณาจักรและนอร์เวย์ รายละเอียดของเราต้องการสามารถเลือกในการใช้ชื่อองค์ประกอบด้วยภาษานอร์เวย์หรือภาษาอังกฤษในเอกสาร XML

เพื่อแก้ปัญหานี้ เราสามารถประกาศใน XML schema ได้ substitutionGroupเบื้องต้น เราประกาศองค์ประกอบหลัก หลังจากนั้นเราจะประกาศองค์ประกอบรอง ซึ่งองค์ประกอบรองสามารถประกาศได้ว่าเราสามารถทดแทนองค์ประกอบหลักได้

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

ในตัวอย่างที่ข้างต้น "name" องค์ประกอบเป็นองค์ประกอบหลัก และองค์ประกอบ "navn" สามารถทดแทนองค์ประกอบ "name" ได้

ดูส่วนหนึ่งของ 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 ที่ถูกต้องมีลักษณะเช่นนี้ (ตาม schema ที่ข้างต้น):

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

หรือเช่นนี้ด้วย:

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

ป้องกันการทดแทนองค์ประกอบ

เพื่อป้องกันอื่นๆ จะทดแทนองค์ประกอบที่ระบุเป็นไปด้วย attribute ชื่อ 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 ที่ถูกต้องตามมาตราฐานดังนี้ (ตาม schema ที่ข้างต้น):

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

แต่เอกสารด้านล่างนี้ไม่ได้รับอนุญาตอีกต่อไป:

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

การใช้ substitutionGroup

ประเภทขององค์ประกอบที่สามารถแทนที่ต้องเหมือนกันกับประเภทขององค์ประกอบหลัก หรือมีต้นกำเนิดมาจากองค์ประกอบหลัก หากประเภทขององค์ประกอบที่สามารถแทนที่เหมือนกันกับประเภทขององค์ประกอบหลัก คุณจึงไม่จำเป็นต้องกำหนดประเภทขององค์ประกอบที่สามารถแทนที่

โปรดทราบว่า ทุกองค์ประกอบใน substitutionGroup ต้องถูกประกาศเป็นองค์ประกอบโลก ไม่เช่นนั้น จะไม่สามารถทำงานได้!

องค์ประกอบโลกหมายถึงอะไร?

องค์ประกอบโลกหมายถึงรายการที่เป็นลูกขององค์ประกอบ "schema" องค์ประกอบท้องถิ่น (Local elements) หมายถึงองค์ประกอบที่ฝังอยู่ในองค์ประกอบอื่น