Substituição do Elemento XSD
Com XML Schemas, um elemento pode substituir outro elemento.
Substituição de elemento
Digamos que temos usuários de dois países diferentes: Inglaterra e Noruega. Gostaríamos de permitir que o usuário escolha se deseja usar os nomes dos elementos noruegueses ou os nomes dos elementos em inglês no documento XML.
Para resolver esse problema, poderíamos definir um replaceGroup no esquema XML. Primeiro, declaramos um elemento head e depois declaramos os outros elementos que declaram que são substituíveis pelo elemento head.
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
No exemplo acima, o elemento "name" é o elemento head e o elemento "navn" é substituível por "name".
Veja este fragmento de um esquema 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"/>
Um documento XML válido (de acordo com o esquema acima) pode ter esta aparência:
<customer>
<name>John Smith</name>
</customer>
ou assim:
<kunde>
<navn>John Smith</navn>
</kunde>
Substituição do Elemento de Bloqueio
Para evitar que outros elementos sejam substituídos por um elemento especificado, use o atributo block:
<xs:element name="name" type="xs:string" block="substitution"/>
Veja este fragmento de um esquema 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"/>
Um documento XML válido (de acordo com o esquema acima) se parece com isso:
<customer>
<name>John Smith</name>
</customer>
MAS ISSO NÃO É MAIS VÁLIDO:
<kunde>
<navn>John Smith</navn>
</kunde>
Usando replaceGroup
O tipo dos elementos substituíveis deve ser igual ou derivado do tipo do elemento principal. Se o tipo do elemento substituível for igual ao tipo do elemento principal, não será necessário especificar o tipo do elemento substituível.
Observe que todos os elementos no replaceGroup (o elemento head e os elementos substituíveis) devem ser declarados como elementos globais, caso contrário não funcionará!
O que são Elementos Globais?
Elementos globais são elementos que são filhos imediatos do elemento "esquema"! Elementos locais são elementos aninhados dentro de outros elementos.