جایگزینی عناصر XSD

با استفاده از XML Schema، یک عنصر می‌تواند جایگزین یک عنصر دیگر شود.

جایگزینی عناصر

بیایید با یک مثال توضیح دهیم: کاربران ما از بریتانیا و نروژ می‌آیند. ما می‌خواهیم بتوانیم به کاربران اجازه دهیم که در اسناد 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) عناصری هستند که در درون عناصر دیگر قرار دارند.