XSD -elementvervanging
Met XML Schema's kan het ene element een ander element vervangen.
Elementvervanging
Laten we zeggen dat we gebruikers hebben uit twee verschillende landen: Engeland en Noorwegen. We zouden graag de mogelijkheid willen hebben om de gebruiker te laten kiezen of hij of zij de Noorse elementnamen of de Engelse elementnamen in het XML-document wil gebruiken.
Om dit probleem op te lossen, zouden we een substitutionGroup in het XML-schema kunnen definiëren. Eerst declareren we een head-element en vervolgens declareren we de andere elementen die aangeven dat ze vervangbaar zijn voor het head-element.
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
In het bovenstaande voorbeeld is het "name"-element het head-element en kan het "navn"-element vervangen worden door "name".
Bekijk dit fragment van een 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"/>
Een geldig XML-document (volgens het bovenstaande schema) kan er als volgt uitzien:
<customer>
<name>John Smith</name>
</customer>
of zo:
<kunde>
<navn>John Smith</navn>
</kunde>
Vervanging van blokkeringselementen
Gebruik het block attribuut om te voorkomen dat andere elementen worden vervangen door een opgegeven element:
<xs:element name="name" type="xs:string" block="substitution"/>
Bekijk dit fragment van een 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"/>
Een geldig XML-document (volgens bovenstaand schema) ziet er als volgt uit:
<customer>
<name>John Smith</name>
</customer>
MAAR DIT IS NIET MEER GELDIG:
<kunde>
<navn>John Smith</navn>
</kunde>
SubstitutionGroup gebruiken
Het type van de vervangbare elementen moet hetzelfde zijn als, of afgeleid zijn van, het type van het kopelement. Als het type van het vervangbare element hetzelfde is als het type van het head-element, hoeft u het type van het vervangbare element niet op te geven.
Merk op dat alle elementen in de substitutionGroup (het head-element en de vervangbare elementen) moeten worden gedeclareerd als globale elementen, anders werkt het niet!
Wat zijn globale elementen?
Globale elementen zijn elementen die directe kinderen zijn van het "schema"-element! Lokale elementen zijn elementen die in andere elementen zijn genest.