Indicadores en XSD (XML Schema)
Los indicadores permiten establecer cómo se van a escribir –o utilizar– los elementos en un documento XML. Hay siete tipos de indicadores que se pueden clasificar en:
- Indicadores de orden: secuencia (sequence), todo (all) y elección (choice).
- Indicadores de ocurrencia: maxOccurs y minOccurs.
- Indicadores de grupo: de elementos (group) y de atributos (attributeGroup).
Indicadores de orden (xs:sequence, xs:all, xs:choice)
Mientras que xs:sequence sirve para especificar el orden en el que obligatoriamente deben aparecer los elementos hijo de un elemento, xs:all sirve para indicar que dichos elementos pueden aparecer en cualquier orden.
EJEMPLO El siguiente archivo "lugar.xsd":
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="lugar">
<xs:complexType>
<xs:sequence>
<xs:element name="ciudad">
<xs:complexType>
<xs:all>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="pais" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Permite validar el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<lugar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="lugar.xsd">
<ciudad>
<pais>Italia</pais>
<nombre>Florencia</nombre>
</ciudad>
</lugar>
Por otra parte, xs:choice sirve para especificar que solamente se permite escribir uno de los elementos hijo. Por ejemplo, en este caso, se podría utilizar para indicar que habría que elegir entre escribir el "nombre" o escribir el "país" de la "ciudad", pero no ambos.
Indicadores de ocurrencia (maxOccurs, minOccurs)
maxOccurs y minOccurs permiten establecer, respectivamente, el número máximo y mínimo de veces que puede aparecer un determinado elemento. El valor por defecto para maxOccurs y minOccurs es 1.
EJEMPLO Dado el siguiente documento XML "paises.xml":
<?xml version="1.0" encoding="UTF-8"?>
<paises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="paises.xsd">
<pais>
<nombre>Argentina</nombre>
<ciudad>Buenos Aires</ciudad>
<ciudad>Rosario</ciudad>
</pais>
<pais>
<nombre>México</nombre>
<ciudad>Guadalajara</ciudad>
<ciudad>Monterrey</ciudad>
<ciudad>Cancún</ciudad>
<ciudad>Mérida</ciudad>
<ciudad>Ciudad de México</ciudad>
</pais>
<pais>
<nombre>Colombia</nombre>
</pais>
</paises>
Considerando que se quiere especificar que:
- "país" pueda aparecer una o ilimitadas veces.
- "nombre" tenga que escribirse obligatoriamente, y solo una vez, dentro de "país".
- De cada "país" puedan escribirse de cero a cinco "ciudades".
El código del archivo "paises.xsd" que permita validar "paises.xml", podría ser:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="paises">
<xs:complexType>
<xs:sequence>
<xs:element name="pais" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="ciudad" type="xs:string"
minOccurs="0" maxOccurs="5"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Indicadores de grupo (xs:group, xs:attributeGroup)
xs:group sirve para agrupar un conjunto de declaraciones de elementos relacionados.
EJEMPLO Dado el siguiente documento XML "personas.xml":
<?xml version="1.0" encoding="UTF-8"?>
<personas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="personas.xsd">
<persona>
<nombre>Eva</nombre>
<edad>25</edad>
<pais>Francia</pais>
<telefono>999888777</telefono>
</persona>
<persona>
<nombre>Giovanni</nombre>
<edad>26</edad>
<pais>Italia</pais>
<telefono>111222333</telefono>
</persona>
</personas>
Y el archivo "personas.xsd" que permite validarlo:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="personas">
<xs:complexType>
<xs:sequence>
<xs:element name="persona" type="datosDePersona"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="datosDePersona">
<xs:sequence>
<xs:group ref="datosBasicos"/>
<xs:element name="telefono" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:group name="datosBasicos">
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="edad" type="xs:positiveInteger"/>
<xs:element name="pais" type="xs:string"/>
</xs:sequence>
</xs:group>
</xs:schema>
- Obsérvese que, se ha definido el grupo datosBasicos, el cual ha sido incorporado a la definición del tipo complejo datosDePersona.
Del mismo modo, attributeGroup sirve para definir un grupo de atributos. Por ejemplo, para validar el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<personas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="personas.xsd">
<persona nombre="Eva" edad="25" pais="Francia"/>
<persona nombre="Giovanni" edad="26" pais="Italia"/>
</personas>
Se puede escribir el siguiente código en el archivo "personas.xsd":
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="personas">
<xs:complexType>
<xs:sequence>
<xs:element name="persona" maxOccurs="unbounded">
<xs:complexType>
<xs:attributeGroup ref="datosDePersona"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="datosDePersona">
<xs:attribute name="nombre" type="xs:string"/>
<xs:attribute name="edad" type="xs:positiveInteger"/>
<xs:attribute name="pais" type="xs:string"/>
</xs:attributeGroup>
</xs:schema>
- En este caso, se ha definido el grupo de atributos datosDePersona, el cual ha sido incorporado a la definición del elemento persona.
Ejercicios resueltos |
---|