Substituição de Elementos do XSD

Através do XML Schema, um elemento pode substituir outro elemento.

Substituição de Elementos

Vamos exemplificar: nossos usuários vêm da Inglaterra e da Noruega. Desejamos ter a capacidade de permitir que os usuários escolham usar o nome do elemento em norueguês ou inglês no documento XML.

Para resolver esse problema, podemos definir um substitutionGroup.Primeiro, declaramos o elemento principal, e então declaramos os elementos secundários, que podem declarar que podem substituir o elemento principal.

<xs:element name="name" type="xs:string"/>
<xs:element name="navn"> substitutionGroup="name"/>

Neste exemplo, o elemento "name" é o elemento principal, enquanto o elemento "navn" pode substituir o elemento "name".

Veja um 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 deve ser semelhante a este (com base no esquema acima):

<customer>
  <name>John Smith</name>
</customer>

ou algo semelhante a isso:

<kunde>
  <navn>John Smith</navn>
</kunde>

Bloquear substituição de elementos

Para evitar que outros elementos substituam um elemento específico, use o atributo block:

<xs:element name="name" type="xs:string"> block="substitution"/>

Veja um 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 deve ser semelhante a este (com base no esquema acima):

<customer>
  <name>John Smith</name>
</customer>

Mas o documento a seguir não é mais válido:

<kunde>
  <navn>John Smith</navn>
</kunde>

Uso do substitutionGroup

O tipo do elemento substituível deve ser o mesmo que o do elemento principal ou derivado do elemento principal. Se o tipo do elemento substituível for o mesmo que o do elemento principal, você não precisará especificar o tipo do elemento substituível.

Atenção, todos os elementos (elementos principais e elementos substituíveis) dentro do substitutionGroup devem ser declarados como elementos globais, caso contrário, não funcionarão!

O que são Elementos Globais (Global Elements)?

Elementos Globais referem-se aos elementos diretamente subordinados ao elemento "schema"! Elementos Locais (Local elements) referem-se aos elementos aninhados em outros elementos.