Reemplazo de elemento (Element Substitution) de XSD

A través del esquema XML, un elemento puede reemplazar a otro.

Reemplazo de elementos

Vamos a dar un ejemplo: nuestros usuarios vienen de Reino Unido y Noruega. Deseamos tener la capacidad de permitir a los usuarios elegir si usar los nombres de los elementos en noruego o inglés en los documentos XML.

Para resolver este problema, podemos definir un substitutionGroupPrimero, declaramos el elemento principal, luego declaramos los elementos secundarios, que pueden declarar que pueden reemplazar al elemento principal.

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

En el ejemplo anterior, el elemento "name" es el elemento principal, mientras que el elemento "navn" puede reemplazar al elemento "name".

Vea un fragmento de un 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"/>

Un documento XML válido debe parecerse a esto (basado en el esquema anterior):

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

o algo así:

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

Bloquear la sustitución de elementos

Para evitar que otros elementos reemplacen a un elemento específico, utilice la propiedad block:

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

Vea un fragmento de un 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"/>

Un documento XML válido debe parecerse a esto (basado en el esquema anterior):

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

Pero el siguiente documento ya no es válido:

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

Usar substitutionGroup

El tipo del elemento reemplazable debe ser el mismo que el del elemento principal o derivado del elemento principal. Si el tipo del elemento reemplazable es el mismo que el del elemento principal, no es necesario especificar el tipo del elemento reemplazable.

Tenga en cuenta que todos los elementos en substitutionGroup (elemento principal y elementos reemplazables) deben declararse como elementos globales, de lo contrario no funcionará!

¿Qué son los elementos globales (Elementos globales)?

Los elementos globales se refieren a los elementos directos del elemento "schema"! Los elementos locales (elementos locales) se refieren a los elementos que se嵌套 en otros elementos.