Náhrada prvků XSD
Pomocí schémat XML může jeden prvek nahradit jiný prvek.
Substituce prvku
Řekněme, že máme uživatele ze dvou různých zemí: Anglie a Norska. Rádi bychom nechali uživatele, aby si vybral, zda chce v XML dokumentu používat norské názvy prvků nebo anglické názvy prvků.
Abychom tento problém vyřešili, mohli bychom definovat substitutionGroup ve schématu XML. Nejprve deklarujeme element head a poté deklarujeme ostatní elementy, které uvádějí, že jsou nahraditelné elementem head.
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
Ve výše uvedeném příkladu je prvek "name" prvkem head a prvek "navn" je nahraditelný prvkem "name".
Podívejte se na tento fragment schématu 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"/>
Platný dokument XML (podle schématu výše) může vypadat takto:
<customer>
<name>John Smith</name>
</customer>
nebo takhle:
<kunde>
<navn>John Smith</navn>
</kunde>
Náhrada blokujícího prvku
Chcete-li zabránit nahrazení jiných prvků zadaným prvkem, použijte atribut block:
<xs:element name="name" type="xs:string" block="substitution"/>
Podívejte se na tento fragment schématu 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"/>
Platný dokument XML (podle schématu výše) vypadá takto:
<customer>
<name>John Smith</name>
</customer>
ALE TOTO JIŽ NEPLATÍ:
<kunde>
<navn>John Smith</navn>
</kunde>
Pomocí substituční skupiny
Typ zastupitelných prvků musí být stejný nebo odvozený od typu hlavového prvku. Pokud je typ zastupitelného prvku stejný jako typ prvku head, nebudete muset specifikovat typ zastupitelného prvku.
Pamatujte, že všechny prvky v substitutionGroup (prvek head a nahraditelné prvky) musí být deklarovány jako globální prvky, jinak to nebude fungovat!
Co jsou globální prvky?
Globální prvky jsou prvky, které jsou bezprostředními potomky prvku "schéma"! Lokální prvky jsou prvky vnořené do jiných prvků.