Con los esquemas XML, un elemento puede sustituir por otro elemento.
Cambio en el elemento
Digamos que tenemos los usuarios de dos países diferentes: Inglaterra y Noruega. Nos gustaría tener la capacidad de permitir al usuario elegir si él o ella le gustaría usar los nombres de los elementos de Noruega o los nombres de los elementos en inglés en el documento XML.
Para resolver este problema, podríamos definir un substitutionGroup en el esquema XML. En primer lugar, declaramos un elemento de cabeza y luego se declaran los otros elementos que establecen que son sustituibles para el elemento de cabeza.
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
En el ejemplo anterior, el "name" elemento es el elemento de la cabeza y el "navn" elemento es sustituible por "name" .
Mira este 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 (according to the schema above) podría tener este aspecto:
<customer>
<name>John Smith</name>
</customer>
o como esto:
<kunde>
<navn>John Smith</navn>
</kunde>
El bloqueo del elemento Sustitución
Para evitar que otros elementos de la sustitución de un elemento especificado, utilice el block atributo:
<xs:element name="name" type="xs:string" block="substitution"/>
Mira este 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 (according to the schema above) se ve así:
<customer>
<name>John Smith</name>
</customer>
Pero esto no deja de ser válida:
<kunde>
<navn>John Smith</navn>
</kunde>
usando substitutionGroup
El tipo de los elementos sustituibles debe ser el mismo que, o derivado de, el tipo del elemento de cabeza. Si el tipo de elemento sustituible es el mismo que el tipo de elemento de cabeza que no se tiene que especificar el tipo de elemento sustituible.
Tenga en cuenta que todos los elementos de la substitutionGroup (el elemento de cabeza y los elementos sustituibles) deben ser declarados como elementos globales, de lo contrario no va a funcionar!
¿Cuáles son los elementos globales?
Elementos globales son elementos que son hijos inmediatos del "schema" elemento! elementos locales son elementos anidados dentro de otros elementos.