Está en la página 1de 4

XML Schema

XML Schema es un lenguaje basado en XML, que se puede utilizar como alternativa a las DTD
para definir tipos de documento.

Convenios
Llamaremos "documento XSD" al documento escrito en lenguaje XML Schema. Este documento es
el que contiene declaraciones como <xs:element>, <xs:attribute>, etc., y cumple la misma
función que una DTD. El nombre de XSD viene de "XML Schema Definition", y habitualmente
este tipo de documentos utilizan la extensión .xsd.
Llamaremos "documento XML" al documento que pretendemos validar, es decir, el que cumple con
las restricciones descritas en el documento XSD. Técnicamente, ambos documentos (el XML y el
XSD) son "documentos XML" (en el sentido de que ambos contienen XML bien formado). A pesar
de ello y para evitar confusiones, aquí llamaremos "documento XML" sólo al documento que está
siendo validado, y no al documento XSD.
Supondremos que el prefijo xs: está siempre asociado con el espacio de nombres
http://www.w3.org/2001/XMLSchema, es decir, siempre que utilicemos nombres de elemento
como <xs:element> o <xs:attribute>, supondremos que hay una definición
xmlns:xs="http://www.w3.org/2001/XMLSchema". Asimismo, supondremos siempre que el
prefijo xsi: está asociado con el espacio de nombres
http://www.w3.org/2001/XMLSchema-instance, es decir, siempre que utilicemos atributos como
xsi:schemaLocation o xsi:noNamespaceSchemaLocation supondremos que hay una definición
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance". Estos prefijos (xs: y xsi:) son
los que se utilizan habitualmente para estos fines, pero en la práctica se puede utilizar cualquier
prefijo siempre que esté asociado con el espacio de nombres correcto.

Asociando el documento XML con el documento XSD


Partiremos del siguiente documento XML de ejemplo:
<?xml version="1.0"?>
<a>
<b />
</a>

Para asociar este documento con una DTD, añadiríamos la declaración <!DOCTYPE>
correspondiente. En el caso de XML Schema, añadimos un atributo
xsi:noNamespaceSchemaLocation (y la declaración correspondiente del espacio de nombres) al
elemento raíz:
<?xml version="1.0"?>
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Ejemplo.xsd">
<b />
</a>

Aquí estamos indicando que el documento XSD se llama Ejemplo.xsd. El valor del atributo
xsi:noNamespaceSchemaLocation es una URL, se puede utilizar cualquier URL absoluta o
relativa para indicar dónde encontrar el documento XSD.
Si nuestro documento XML utilizase su propio espacio de nombres, utilizaríamos el atributo
xsi:schemaLocation. Por ejemplo, si partimos de este otro documento XML de ejemplo:
<?xml version="1.0"?>
<ex:a xmlns:ex="http://www.example.com/namespace">
<ex:b />
</ex:a>

Lo asociaríamos con el documento XSD de la siguiente forma:


<?xml version="1.0"?>
<ex:a xmlns:ex="http://www.example.com/namespace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/namespace Ejemplo.xsd">
<ex:b />
</ex:a>

El valor de xsi:schemaLocation está formado por parejas de URLs. En cada pareja, la primera
URL indica un espacio de nombres y la segunda el documento XSD que valida los elementos y
atributos que pertenecen a ese espacio de nombres.

Estructura general del documento XSD


El elemento raíz del documento XSD es siempre <xs:schema>, y llevará siempre un atributo
xmlns:xs, de la siguiente forma:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
(declaraciones)
</xs:schema>

Las declaraciones indican qué restricciones tienen que cumplir los elementos del documento XML
para que se considere válido. Cada documento XSD sirve para validar elementos y atributos en un
espacio de nombres concreto, de forma que si un documento XML utilizase elementos en varios
espacios de nombres distintos, para validarlo harían falta varios documentos XSD, uno por cada
espacio de nombres (y habría varias parejas de URLs en el atributo xs:schemaLocation del
elemento raíz del documento XML).
El espacio de nombres cuyos elementos valida un documento XSD se especifica en el atributo
targetNamespace del elemento <xs:schema>. Si este atributo no aparece, el documento XSD se
refiere a elementos y atributos sin espacio de nombres.
Entre las declaraciones que pueden aparecer dentro de un documento XSD, veremos las seis
siguientes:
• Declaraciones de elementos (<xs:element>)
• Declaraciones de atributos (<xs:attribute>)
• Declaraciones de grupos de atributos (<xs:attributeGroup>)
• Declaraciones de tipos complejos (<xs:complexType>)
• Declaraciones de modelos de contenido (<xs:group>)
• Declaraciones de tipos simples (<xs:simpleType>)
Estas declaraciones pueden aparecer unas dentro de otras, por ejemplo una declaración
<xs:element> puede contener un <xs:complexType>, y un <xs:complexType> puede contener un
<xs:attribute>. Llamaremos "declaraciones de primer nivel" a las que aparecen directamente
dentro del elemento <xs:schema>, sin estar dentro de ninguna otra declaración. Por ejemplo:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a"> <!-- xs:element de primer nivel -->
<xs:complexType /> <!-- xs:complexType NO de primer nivel -->
</xs:element>

<xs:complexType name="b"> <!-- xs:complexType de primer nivel -->


<xs:sequence>
<xs:element name="a" /> <!-- xs:element NO de primer nivel -->
</xs:sequence>
</xs:complexType>
</xs:schema>
Todas las declaraciones de primer nivel llevarán un atributo name. Además, las declaraciones
<xs:element> y <xs:attribute> llevarán también el atributo name incluso aunque no sean de
primer nivel. Este atributo cumple varias funciones:
• En las declaraciones de primer nivel, el valor del atributo name se puede utilizar para hacer
referencia a la declaración desde otras partes del documento XSD.
• En las declaraciones <xs:element> (sean de primer nivel o no), el atributo name se refiere a
un elemento del documento XML. Por ejemplo, si el documento XSD contiene una
declaración <xs:element name="abc">, esta declaración afectará a (algunos de) los
elementos <abc> que haya en el documento XML.
• Asimismo, en las declaraciones <xs:attribute> (sean de primer nivel o no), el atributo
name se refiere a un atributo del documento XML. Por ejemplo, si el documento XSD
contiene una declaración <xs:attribute name="abc">, esta declaración afectará a
(algunos de) los atributos abc="loquesea" que haya en el documento XML.
En las siguientes secciones veremos exactamente cómo se establecen estas referencias y cómo
afectan las declaraciones del documento XSD al documento XML.

Elementos
Cada declaración <xs:element> tendrá asociado un tipo. El tipo de un elemento determina qué
contenido y qué atributos puede llevar el elemento correspondiente en el documento XML. Dicho
de otra forma, el tipo de un elemento nos da la misma información que los <!ELEMENT> y
<!ATTLIST> de una DTD.

En XSD los tipos pueden ser simples o complejos. Un tipo simple sólo tiene un texto; no puede
tener elementos ni atributos. Por lo tanto, si asignamos un tipo simple a un elemento, este elemento
no podrá tener atributos, y sólo podrá contener lo que en una DTD se llamaría (#PCDATA). Un tipo
complejo permite toda la flexibilidad de elementos y atributos de las DTD, y de hecho permite
expresar más detalles que las DTD sobre lo que se considera "válido".
Para asignar un tipo a un elemento, se puede hacer directamente o mediante una referencia. La
forma directa, con un tipo simple, sería:
<xs:element name="nombreElemento">
<xs:simpleType>
...
</xs:simpleType>
</xs:element>

La forma directa, con un tipo complejo, sería:


<xs:element name="nombreElemento">
<xs:complexType>
...
</xs:complexType>
</xs:element>

y la forma mediante referencia sería:


<xs:element name="nombreElemento" type="nombreTipo" />

Si se utiliza la forma por referencia, es obligatorio que el nombreTipo sea un tipo predefinido, o que
haya una declaración de tipo (simple o complejo) de primer nivel con name="nombreTipo".
Si no se utiliza ninguna de las dos formas, el elemento toma por defecto el tipo predefinido
xs:anyType, lo que significa que ese elemento se considerará válido independientemente de los
atributos o contenido que tenga.
Atributos
Cada declaración <xs:attribute> tendrá asociado un tipo simple (los atributos no pueden tener
tipos complejos). El tipo de un atributo determina qué valores puede contener ese atributo en el
documento XML. Dicho de otra forma, el tipo es comparable a los tipos de atributo de las DTD
(CDATA, NMTOKEN, ID, etc.).
Al igual que con los elementos, se puede hacer directamente o mediante una referencia. La forma
directa sería:
<xs:attribute name="nombreAtributo" use="required">
<xs:simpleType>
....
</xs:simpleType>
</xs:attribute>

y con referencia sería:


<xs:attribute name="nombreAtributo" type="nombreTipo" use="required" />

Si se utiliza la forma por referencia, es obligatorio que el nombreTipo sea un tipo predefinido, o que
haya una declaración de primer nivel <xs:simpleType name="nombreTipo">. Si no se utiliza
ninguna de las dos formas, el atributo toma por defecto el tipo xs:anySimpleType, lo que permite
que el atributo tome cualquier valor en el documento XML.
El atributo use (utilizado en el elemento xs:attribute que aparece en el documento XSD) indica
la obligatoriedad o no de utilizar el atributo llamado nombreAtributo en el documento XML. Si se
utiliza use="required", es obligatorio utilizar el atributo en el documento XML; si se utiliza
use="optional", el atributo es opcional; y si se utiliza use="prohibited", el atributo no puede
aparecer en el documento XML. Si no se especifica el atributo use, por defecto se supone
use="optional". El caso use="prohibited" sólo es necesario en algunos casos en que unos tipos
se definen en función de otros y "heredan" sus atributos.
El elemento <xs:attribute> también puede llevar uno de los atributos default o fixed, que
sirven para dar un valor por defecto o un valor fijo al atributo. Esto es equivalente al valor por
defecto y al valor #FIXED en una DTD. Por ejemplo:
<xs:attribute name="a1" default="v1" />
<xs:attribute name="a2" fixed="v2" />

Con estas declaraciones, si el atributo a1 no aparece en el documento XML, tomará por defecto el
valor v1. En el caso del atributo a2, si aparece en el documento XML con cualquier valor que no sea
v2, el documento XML no se considerará válido. Sería equivalente a la siguiente declaración en una
DTD:
<!ATTLIST elemento a1 CDATA "v1" a2 CDATA #FIXED "v2">

Grupos de atributos
Un grupo de atributos es una declaración como la siguiente:
<xs:attributeGroup name="x">
<xs:attribute name="a" type="b" />
<xs:attribute name="c" type="d" />
<!-- etc.... -->
</xs:attributeGroup>

Si tenemos un conjunto de atributos que se repite con frecuencia, podemos hacer un grupo.
Después, en lugar de copiar y pegar los nombres de todos los atributos varias veces, bastará con
poner una referencia al grupo de atributos.

También podría gustarte