Substituição de Elemento (Element Substitution) XSD

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

Substituição de Elementos

Vamos dar um exemplo: 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 no esquema XML. substitutionGroupPrimeiro, 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"/>

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

Veja um fragmento de algum 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 a propriedade block:

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

Veja um fragmento de algum 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 seguinte documento não é mais válido:

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

Use 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 precisa especificar o tipo do elemento substituível.

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

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

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