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 ที่ถูกต้องควรเหมือนนี้ (ตามโครงสร้างด้านบน):

<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)?

全局元素指 "schema" 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。