XSD elementers ersättning (Element Substitution)

通過 XML Schema,一個元素可對另一個元素進行替換。

元素替換

Låt oss ge ett exempel: Våra användare kommer från Storbritannien och Norge. Vi vill ha förmågan att låta användare välja att använda norska elementnamn eller engelska elementnamn i XML-dokumentet.

För att lösa detta problem kan vi definiera en substitutionGroupFörst deklareras huvudelementet, sedan deklareras sekundära element som kan deklarera att de kan ersätta huvudelementet.

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

I detta exempel är "name"-elementet huvudelementet, medan "navn"-elementet kan ersätta "name"-elementet.

Se en del av ett 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"/>

En giltig XML-dokument bör se ut så här (enligt det ovanstående schemat):

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

eller liknande:

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

Förhindra elementersättning

För att förhindra att andra element ersätter ett specifikt element, använd egenskapen block:

<xs:element name="name" type="xs:string" block="substitution"/>

Se en del av ett 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"/>

En giltig XML-dokument bör se ut så här (enligt det ovanstående schemat):

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

Men den efterföljande dokumentet är inte längre giltigt:

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

Använd substitutionGroup

Typen för ersättningsbara element måste vara samma som huvudelementet eller härledas från huvudelementet. Om typen för ersättningsbara element är samma som huvudelementets typ, behöver du inte specificera typen för ersättningsbara element.

Observera att alla element i substitutionGroup (huvudelement och ersättningsbara element) måste deklareras som globala element, annars fungerar det inte!

Vad är globala element (Global Elements)?

Globala element är "schema"-elementets direkta underelement! Lokala element (Local elements) är element som är inbäddade i andra element.