XSD Reemplazo de elementos (Element Substitution)
Mediante XML Schema, un elemento puede reemplazar a otro elemento.
Reemplazo de elementos
Pongamos un ejemplo: nuestros usuarios provienen del Reino Unido y Noruega. Queremos tener la capacidad de permitir que los usuarios elijan si usar nombres de elementos en noruego o en inglés en el documento XML.
Para resolver este problema, podemos definir unsubstitutionGroup. Primero, declaramos el elemento principal, y luego declaramos los elementos secundarios, que pueden declarar que pueden reemplazar al elemento principal.
<xs:element name="navn" substitutionGroup="name"/>
En el ejemplo anterior, el elemento "name" es el elemento principal, y el elemento "navn" puede sustituir al elemento "name".
Vea un fragmento de un XML schema:
<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 se vería así (según el schema anterior):
<name>John Smith</name>
</customer>
O así:
<navn>John Smith</navn>
</kunde>
Evitar el reemplazo de elementos
Para evitar que otros elementos reemplacen un elemento específico, use el atributo block:
Vea un fragmento de un XML schema:
<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 debería verse así (según el schema anterior):
<name>John Smith</name>
</customer>
Pero el siguiente documento ya no es válido:
<navn>John Smith</navn>
</kunde>
Uso de substitutionGroup
El tipo del elemento reemplazable debe ser el mismo que el del elemento principal, o derivar del elemento principal. Si el tipo del elemento reemplazable es el mismo que el del elemento principal, entonces no es necesario especificar el tipo del elemento reemplazable.
Tenga en cuenta que todos los elementos en substitutionGroup (el elemento principal y los elementos reemplazables) deben declararse como elementos globales; de lo contrario, ¡no funcionará!
¿Qué son los elementos globales (Global Elements)?
¡Los elementos globales son los elementos hijos directos del elemento "schema"! Los elementos locales (Local elements) son los elementos anidados en otros elementos.
Otras extensiones