XSD-elementers ersättning (Element Substitution)

Genom XML Schema kan ett element ersätta ett annat element.

Elementersättning

Låt oss ta 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 om de vill använda norska elementnamn eller engelska elementnamn i XML-dokument.

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 det ovanstående exemplet ä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 ovanstående schema):

<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 ovanstående schema):

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

Men följande dokument är inte längre giltigt:

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

Använd substitutionGroup

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

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

Vad är globala element (Global Elements)?

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