جایگزینی عناصر XSD (Element Substitution)

از طریق شمای XML، یک عنصر می‌تواند جایگزین یک عنصر دیگر شود.

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

بیایید مثالی بیاوریم: کاربران ما از بریتانیا و نروژ هستند. ما می‌خواهیم بتوانیم کاربران را قادر کنیم که انتخاب کنند در مستند XML از نام‌های عناصر نروژی یا انگلیسی استفاده کنند.

برای حل این مشکل، می‌توانیم یک تعریف در شمای 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) به عناصری که در داخل عناصر دیگر جاسازی شده‌اند، اطلاق می‌شود.