XSD- Elementersetzung
Bei XML-Schemas kann ein Element ein anderes Element ersetzen.
Elementsubstitution
Nehmen wir an, wir haben Benutzer aus zwei verschiedenen Ländern: England und Norwegen. Wir möchten, dass der Benutzer wählen kann, ob er oder sie die norwegischen Elementnamen oder die englischen Elementnamen im XML-Dokument verwenden möchte.
Um dieses Problem zu lösen, könnten wir eine substitutionGroup im XML-Schema definieren. Zuerst deklarieren wir ein head-Element und dann deklarieren wir die anderen Elemente, die angeben, dass sie das head-Element ersetzen können.
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
Im obigen Beispiel ist das Element „name“ das Head-Element und das Element „navn“ kann durch „name“ ersetzt werden.
Sehen Sie sich dieses Fragment eines XML-Schemas an:
<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"/>
Ein gültiges XML-Dokument (nach obigem Schema) könnte so aussehen:
<customer>
<name>John Smith</name>
</customer>
oder so:
<kunde>
<navn>John Smith</navn>
</kunde>
Blockierende Elementsubstitution
Um zu verhindern, dass andere Elemente ein bestimmtes Element ersetzen, verwenden Sie das block-Attribut:
<xs:element name="name" type="xs:string" block="substitution"/>
Sehen Sie sich dieses Fragment eines XML-Schemas an:
<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"/>
Ein gültiges XML-Dokument (nach obigem Schema) sieht so aus:
<customer>
<name>John Smith</name>
</customer>
ABER DAS GILT NICHT MEHR:
<kunde>
<navn>John Smith</navn>
</kunde>
Verwendung von substitutionGroup
Der Typ der substituierbaren Elemente muss derselbe sein wie der Typ des Kopfelements oder davon abgeleitet sein. Wenn der Typ des ersetzbaren Elements derselbe ist wie der Typ des Kopfelements, müssen Sie den Typ des ersetzbaren Elements nicht angeben.
Beachten Sie, dass alle Elemente in der substitutionGroup (das Head-Element und die substituierbaren Elemente) als globale Elemente deklariert werden müssen, sonst funktioniert es nicht!
Was sind globale Elemente?
Globale Elemente sind Elemente, die unmittelbare Kinder des "schema"-Elements sind! Lokale Elemente sind Elemente, die in anderen Elementen verschachtelt sind.