Sostituzione dell'elemento XSD
Con gli schemi XML, un elemento può sostituire un altro elemento.
Sostituzione degli elementi
Diciamo che abbiamo utenti di due paesi diversi: Inghilterra e Norvegia. Vorremmo la possibilità di consentire all'utente di scegliere se desidera utilizzare i nomi degli elementi norvegesi oi nomi degli elementi inglesi nel documento XML.
Per risolvere questo problema, potremmo definire un gruppo di sostituzione nello schema XML. Per prima cosa dichiariamo un elemento head e poi dichiariamo gli altri elementi che affermano di essere sostituibili all'elemento head.
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
Nell'esempio sopra, l'elemento "name" è l'elemento head e l'elemento "navn" è sostituibile con "name".
Guarda questo frammento di uno schema 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"/>
Un documento XML valido (secondo lo schema sopra) potrebbe assomigliare a questo:
<customer>
<name>John Smith</name>
</customer>
o così:
<kunde>
<navn>John Smith</navn>
</kunde>
Sostituzione degli elementi bloccanti
Per evitare che altri elementi si sostituiscano con un elemento specificato, utilizzare l'attributo block:
<xs:element name="name" type="xs:string" block="substitution"/>
Guarda questo frammento di uno schema 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"/>
Un documento XML valido (secondo lo schema sopra) ha il seguente aspetto:
<customer>
<name>John Smith</name>
</customer>
MA QUESTO NON È PIÙ VALIDO:
<kunde>
<navn>John Smith</navn>
</kunde>
Utilizzo del gruppo di sostituzione
Il tipo degli elementi sostituibili deve essere uguale o derivato dal tipo dell'elemento di testa. Se il tipo dell'elemento sostituibile è uguale al tipo dell'elemento di testa non sarà necessario specificare il tipo dell'elemento sostituibile.
Nota che tutti gli elementi nel substitutionGroup (l'elemento head e gli elementi sostituibili) devono essere dichiarati come elementi globali, altrimenti non funzionerà!
Cosa sono gli elementi globali?
Gli elementi globali sono elementi che sono figli immediati dell'elemento "schema"! Gli elementi locali sono elementi nidificati all'interno di altri elementi.