Podstawianie elementu XSD
W przypadku schematów XML jeden element może zastąpić inny.
Podstawianie elementu
Załóżmy, że mamy użytkowników z dwóch różnych krajów: Anglii i Norwegii. Chcielibyśmy, aby użytkownik mógł wybrać, czy chce używać norweskich lub angielskich nazw elementów w dokumencie XML.
Aby rozwiązać ten problem, moglibyśmy zdefiniować substitutionGroup w schemacie XML. Najpierw deklarujemy element główny, a następnie deklarujemy inne elementy, które stwierdzają, że można je zastąpić elementem głównym.
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
W powyższym przykładzie element „name” jest elementem głównym, a element „navn” można zastąpić „name”.
Spójrz na ten fragment schematu 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"/>
Prawidłowy dokument XML (zgodnie z powyższym schematem) może wyglądać tak:
<customer>
<name>John Smith</name>
</customer>
lub tak:
<kunde>
<navn>John Smith</navn>
</kunde>
Podstawianie elementu blokującego
Aby zapobiec zastępowaniu innych elementów określonym elementem, użyj atrybutu bloku:
<xs:element name="name" type="xs:string" block="substitution"/>
Spójrz na ten fragment schematu 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"/>
Prawidłowy dokument XML (zgodnie z powyższym schematem) wygląda tak:
<customer>
<name>John Smith</name>
</customer>
ALE TO NIE JEST JUŻ WAŻNE:
<kunde>
<navn>John Smith</navn>
</kunde>
Korzystanie z grupy zastępczej
Typ elementów zastępowalnych musi być taki sam jak typ elementu głównego lub od niego pochodny. Jeśli typ elementu zamiennego jest taki sam, jak typ elementu głównego, nie trzeba określać typu elementu zamiennego.
Zwróć uwagę, że wszystkie elementy w substitutionGroup (element główny i elementy zastępowalne) muszą być zadeklarowane jako elementy globalne, w przeciwnym razie nie zadziała!
Czym są elementy globalne?
Elementy globalne to elementy, które są bezpośrednimi dziećmi elementu „schema”! Elementy lokalne to elementy zagnieżdżone w innych elementach.