ApuntesMarcas-T6 XML Schemas VER 2.2
ApuntesMarcas-T6 XML Schemas VER 2.2
ApuntesMarcas-T6 XML Schemas VER 2.2
XML Schema
4. Tipos de datos........................................................................................ 6
4.1. Tipos de datos predefinidos. ............................................................................. 6
7. Grupos. ................................................................................................ 17
8. Documentacin. .................................................................................. 17
9. Modelos de diseo de esquemas. ........................................................ 18
9.1. Modelo de diseo plano. ................................................................................. 18
9.2. Modelo con tipos de nombres reutilizables. ................................................... 19
9.3. Modelo de diseo anidado. ............................................................................. 20
Usa sintaxis XML, por lo que no hay que aprender una sintaxis nueva para utilizarlo y adems
es analizable como cualquier documento XML.
Permite especificar tipos de datos, por ejemplo, podemos indicar si un elemento o un atributo es
un nmero entero, una fecha, una cadena de caracteres, etc.
Permite utilizar diferentes espacios de nombres (namespace), lo que implica que las reglas
para validar ciertos elementos estarn definidas en cierto sitio, mientras que otras reglas podrn
estar en otro.
Es extensible, es decir, el conjunto de etiquetas que lo constituye se puede ampliar segn las
necesidades que surjan.
2. XML Schema.
Los XML Schema estn basados en el lenguaje XML Schema Definition (XSD), desarrollado por el
World Wide Web Consortium (W3C), alcanzando el nivel de recomendacin en mayo de 2001.
Posteriormente, se cre una segunda edicin revisada, disponible desde octubre de 2004.
Esta ltima recomendacin (http://www.w3.org/XML/Schema), se expone en tres partes:
XML Schema Parte 0 Primer: es una introduccin no normativa al lenguaje, que proporciona
una gran cantidad de ejemplos y explicaciones detalladas para una primera aproximacin a XML
Schema.
XML Schema Parte 1 Structures: es una extensa descripcin de los componentes del lenguaje.
XML Schema Parte 2 Datatypes: complementa la parte 1 con la definicin de los tipos de datos
incorporados en XML Schema y sus restricciones.
Los documentos XML que se validan mediante un esquema se denominan instancias del esquema.
Se pueden indicar varios esquemas de validacin, por lo que habra que especificar a qu espacio se
aplica cada uno de ellos. A tal fin, el atributo schemaLocation permite contener una lista de espacios de
nombres y localizaciones de esquemas, separados stos por espacios en blanco.
Por otra parte, con el atributo noNamespaceSchemaLocation se permite indicar un esquema para el
documento sin que ste utilice espacio de nombres alguno. Esto, como veremos, no es aconsejable, pero
se usa bastante para hacer pruebas; de hecho, lo usaremos en los ejemplos de los apuntes.
Por ejemplo:
<raiz xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="esquema.xsd">
xs:schema,
Elementos, definidos con etiquetas xs:element, indican los elementos permitidos en los
documentos que sigan el esquema.
Atributos, con la etiqueta xs:attribute, permiten indicar los atributos de los elementos.
El mbito de aplicacin de cada uno de estos componentes dentro de un esquema queda determinado
por el lugar en el que se encuentra su definicin. De aqu que se distingan dos posibilidades a la hora de
declarar componentes:
De mbito global. Se trata de componentes del esquema situados dentro de la etiqueta raz
pero fuera de cualquier otra. Estos componentes se pueden utilizar en cualquier parte del
esquema.
De mbito local. Se trata de componentes definidos dentro de otros. En ese caso, se pueden
utilizar slo dentro del componente en el que estn incluidos pero no en otras partes del
documento. Por ejemplo, si dentro de la definicin de un elemento colocamos la definicin de un
tipo de datos, este tipo de datos slo se puede utilizar dentro del componente xs:element en el
que se encuentra dicha definicin.
schema
donde:
versin.
Ojo. xmlns y targetNamespace no sirven para lo mismo; el primero declara espacios de nombres y el
segundo sirve para indicar a qu espacio de nombres pertenecen los elementos definidos en el
esquema. Aunque en la prctica ciertamente el contenido de ambos atributos es el mismo.
ref="referencia a otro elemento el cual realiza la descripcin". No se usa si el elemento padre es <xs:schema>
form="qualified|unqualified" Fuerza a que el elemento sea o no clasificado dentro del espacio de nombres
mediante un prefijo.
minOccurs="nmero mnimo de ocurrencias que puede haber del elemento". Valores: 0, 1, 2 , unbounded
maxOccurs="nmero mximo de ocurrencias que puede haber del elemento". Valores: 0, 1, 2 , unbounded
default="valor por defecto para el elemento cuando en el documento XML no haya recibido ningn valor".
</xs:schema>
Aqu tenemos algunos elementos de XML que cumplen las restricciones anteriores:
<articulo>Tornillo</articulo>
<unidades>50</unidades>
<fecha>2012-02-14</fecha>
El atributo ref se usa para hacer referencia a otro elemento que puede llevar prefijo. Por ejemplo:
<xs:element ref="articulo" />
Los elementos simples pueden tener un valor por defecto o un valor prefijado. Un valor por defecto se
asigna automticamente al elemento cuando no especificamos ninguno. En este ejemplo, se asigna tuerca:
<xs:element name="articulo" type="xs:string" default="tuerca"/>
Un elemento con valor prefijado siempre tiene el mismo valor y no podemos asignarle otro distinto:
name="nombre del atributo". Este atributo no puede aparecer simultneamente con ref.
form="qualified|unqualified" Fuerza a que el atributo sea o no clasificado dentro del espacio de nombres
mediante un prefijo.
default="valor por defecto para el atributo cuando en el documento XML no haya recibido ningn valor".
fixed="indica el nico valor que puede tomar el atributo". No puede aparecer simultneamente con default.
Ejemplo: atributo de nombre divisa, tipo de dato texto y con valor por defecto Euros.
<xs:attribute name="divisa" type="xs:string" default="Euros"/>
4. Tipos de datos.
En los ejemplos anteriores declaramos elementos y atributos de ciertos tipos de datos. Los datos se
pueden clasificar de diferentes formas. Una de ellas es la siguiente:
Datos predefinidos. Son los que vienen integrados en la propia especificacin de XML Schema.
Datos construidos. Son definidos por el usuario basndose en algn tipo predefinido o en otro
construido previamente.
Se agrupan segn su tipo de contenido en numricos, fecha, texto, binarios y booleanos. La figura de
la pgina siguiente (http://www.w3.org/TR/xmlschema-2/) muestra la jerarqua de datos predefinidos
(primitivos, derivados y especiales).
Los tipos predefinidos que se usan ms habitualmente son:
xs:string,
para textos con cualquier contenido, excepto <, >, & y comillas (simples y
dobles), para los que se ha de utilizar la entidad correspondiente.
xs:normalizedString,
Algunos tipos de datos derivados de los primitivos definidos por XSD son:
xs:negativeInteger,
xs:language,
texto que contiene el nombre de un idioma (en, en-EN, en-US, es, es-ES, etc.)
Los equivalentes a los siguientes atributos DTD, para mantener la compatibilidad con ellos:
xs:ID, xs:IDREF, xs:IDREFS.
xs:ENTITY, xs:ENTITIES.
xs:NMTOKEN, xs:NMTOKENS.
xs:NOTATION.
Como veremos ms adelante, el usuario puede construir sus propios tipos de datos a partir de los
predefinidos mediante uniones de tipos de datos, restricciones a los tipos de datos y listas de datos. Para
ello se usar, como base, el elemento xs:simpleType.
Los tipos de datos predefinidos pueden ser asignados a elementos y a atributos, y pertenecen al
espacio de nombres http://www.w3.org/2001/XMLSchema.
En la web http://www.w3.org/TR/xmlschema-0 se puede encontrar la relacin completa de tipos de
datos definidos en XSD.
El atributo base indica el tipo de datos sobre el que se establecen las posibles restricciones.
Ejemplo:
<xs:simpleType name="T_Longitud">
<xs:restriction base="xs:float" />
</xs:simpleType>
A partir de este momento el tipo de dato T_Longitud se podr usar en todo el esquema y como, en
realidad, no se ha definido con ninguna restriccin, ser equivalente al tipo xs:float
<xs:element name="distancia" type="T_Longitud"/>
Se ha definido el tipo T_Clave restringiendo el rango de valores permitidos al tipo base xs:string.
Cuando definimos un tipo de datos, ste podr ser referenciado repetidas veces. Otra solucin pero
menos ventajosa podra ser la siguiente:
<xs:element name="password" >
<xs:simpleType>
<xs:restriction base="xs:string" />
<xs:minLength value="6"/>
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element >
En este caso, el elemento password queda perfectamente descrito, pero no hemos definido un tipo que,
posteriormente, pudiramos usarlo para definir otros elementos o atributos.
A continuacin, vemos los diferentes tipos de restricciones (facetas) que se pueden imponer. En
funcin del tipo base se podrn aplicar una u otras facetas.
FACETA
USO
xs:minInclusive
Numricos y fecha/hora
xs:maxInclusive
Numricos y fecha/hora
xs:minExclusive
Numricos y fecha/hora
xs:maxExclusive
Numricos y fecha/hora
xs:enumeration
Todos
xs:pattern
Texto
xs:whiteSpace
Indica cmo tratar los espacios en blanco. Los posibles valores son
preserve, replace y collapse
Texto
xs:length
Texto
xs:minLength
Texto
xs:maxLength
Texto
xs:fractionDigits
xs:totalDigits
Numricos
xs:length,
En el siguiente ejemplo se define el tipo T_nombre como un texto con un nmero de caracteres
comprendido entre 2 y 20.
<xs:simpleType name="T_nombre">
<xs:restriction base="xs:string">
<xs:minLength value=2/>
<xs:maxLength value=20/>
</xs:restriction>
</xs:simpleType>
xs:totalDigits,
xs:fractionDigits,
10
En el ejemplo siguiente se define el tipo T_nota como un nmero de, como mximo, cuatro cifras de
las que, como mucho, dos son decimales.
<xs:simpleType name="T_nota">
<xs:restriction base="xs:decimal">
<xs:totalDigits value="4"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
xs:minExclusive,
Para que el elemento edad sea un entero comprendido entre 18 y 65, escribiremos:
<xs:element name="edad">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="18"/>
<xs:maxInclusive value="65"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
preserve,
carro.
replace, para que cada doble espacio, tabulador, salto de lnea o retorno de carro se sustituya por
un espacio.
collapse, es similar al anterior pero, adems, elimina espacios a izquierda y derecha.
5.1.5. Enumeraciones.
Permiten indicar, uno a uno, todos los posibles valores que forman parte de un tipo.
En este ejemplo, se define el tipo T_EstadoCivil con todos sus posibles valores.
<xs:simpleType name="T_EstadoCivil">
<xs:restriction base="xs:string">
<xs:enumeration value="soltero"/>
<xs:enumeration value="casado"/>
<xs:enumeration value="separado"/>
<xs:enumeration value="divorciado"/>
<xs:enumeration value="viudo"/>
</xs:restriction>
</xs:simpleType>
5.1.6. Plantillas.
Permiten definir la secuencia exacta de caracteres que se admiten en un tipo de dato. Para ello, se
utiliza la etiqueta <xs:pattern value="expresion"/>, donde expresion es una expresin regular con
estas normas:
Patrn
.
Significado
Ejemplo
Cualquier carcter.
\w
Cualquier letra
\d
Un dgito
\D
\s
\S
(a|b)
texto
[xyz]
[^xyz]
[a-z]
[A-E-[C]]
+
Sucesin de 1 o ms ocurrencias.
Sucesin de 0 1 ocurrencias.
Sucesin de 0 o ms ocurrencias.
texto
{n}
{n,}
{n,m}
Inicio de lnea.
Final de lnea.
\carcter
11
Tambin podemos definir el tipo T_sexo con dos posibles valores, hombre o mujer, de la forma:
<xs:simpleType name="T_sexo">
<xs:restriction base="xs:string">
<xs:pattern value="hombre | mujer"/>
</xs:restriction>
</xs:simpleType>
Una definicin de tipo para los telfonos en formato de 9 dgitos separados por puntos cada tres, como
por ejemplo 958.225.431 sera
<xs:simpleType name="T_Telefono">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}\.\d{3}\.\d{3}"/>
</xs:restriction>
</xs:simpleType>
12
En el siguiente ejemplo, maximas sera de tipo lista, donde los valores de la lista seran nmeros reales,
y el tamao de la lista se fija a 8 valores. En el ejemplo, el elemento maximas contendr las temperaturas
mximas de un da de cada una de las provincias de Andaluca.
<xs:element name="maximas" type=listaOchoMaximas>
<xs:simpleType name="listaMaximas">
<xs:list itemType="xs:float"/>
</xs:simpleType>
<xs:simpleType name="listaOchoMaximas">
<xs:restriction base="listaMaximas">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
Por tanto, en el documento XML correspondiente podra aparecer un elemento semejante al siguiente
en la que los ocho valores estn separados por espacios en blanco:
<maximas>15.5 22.1 18.0 21.4 25.6 20.2 22.6 23.9</maximas>
Donde name es el nombre del tipo que ser obligatorio si el componente es hijo de xs:schema, de lo
contrario no est permitido. El atributo mixed indica si se intercala texto con los elementos descendientes.
El valor por defecto es false.
El contenido de un elemento XML, es decir, lo que hay entre las etiquetas de apertura y cierre puede
ser:
Ejemplo. El nombre de una persona <nombre> con los elementos descendientes <npila>, <ape1> y
<ape2>.
<xs:complexType name="T_Nombre">
<xs:sequence>
<xs:element name="npila" type="xs:string"/>
13
Alternativa
Se establece con el componente xs:choice y permite que se pueda escoger uno slo entre varios
elementos. La alternativa puede aparecer un nmero configurable de veces, establecindose con los
atributos minOccurs y maxOccurs cuyo valor por defecto, en ambos casos, es uno.
En este ejemplo una empresa puede ser cliente o proveedor.
<xs:element name="empresa">
<xs:complexType>
<xs:choice>
<xs:element name="cliente" type="xs:string"/>
<xs:element name="proveedor" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
Todos
Indica que los elementos hijos pueden aparecer en cualquier orden pero, tan slo, una vez. Se usa el
componente xs:all.
En el ejemplo, el nombre y cdigo deben aparecer los dos y en el orden que se quiera.
<xs:element name="identificador">
<xs:complexType>
<xs:all>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="codigo" type="xs:positiveInteger"/>
</xs:all>
</xs:complexType>
</xs:element>
Para indicar que estos elementos puedan no aparecer, es necesario utilizar el atributo minOccurs="0" en
la etiqueta <xs:all> de la siguiente forma:
<xs:all minOccurs="0">
En general, para los elementos descendientes de otros, cuando se desea establecer el nmero de veces
que aparecern, se hace uso de los indicadores minOccurs y maxOccurs. Por defecto, el valor de ambos es 1
pero podemos cambiarlo a cualquier nmero entero mayor o igual que cero. Adems, para expresar un
valor ilimitado se usa la palabra unbounded.
<xs:element name="persona">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="nombrehijo" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Adems, en todos los casos anteriores cabe la posibilidad de que los atributos tambin pueden estar
presentes.
14
<xs:attribute>,
15
Si adems de elementos descendientes se definen atributos, stos se indican siempre al final, justo
antes de la etiqueta de cierre </xs:complexType>.
- Ejemplo:
<xs:complexType name="T_Factura">
<xs:sequence>
<xs:element name="numero" type="xs:integer" />
<xs:element name="cliente" type="xs:string" />
<xs:element name="importe" type="xs:float" />
</xs:sequence>
<xs:attribute name="fecha" type="xs:date" />
</xs:complexType>
<xs:element name="facturacion" type="T_Factura" />
- Ejemplo:
<xs:element name="empresa">
<xs:complexType>
<xs:choice>
<xs:element name="cliente" type="xs:string"/>
<xs:element name="proveedor" type="xs:string"/>
</xs:choice>
<xs:attribute name="codigo" type="xs:integer" use="required" />
</xs:complexType>
</xs:element>
En caso de que el elemento tambin tuviera atributos, se indicaran al final, justo antes de la etiqueta
de cierre </xs:complexType>.
<carta referencia="145" autor="MariPili">
Estimado seor o seora <nombre>Luis de la Casa</nombre>:
16
Ahora queremos declarar un tipo complejo denominado T_Alumno que almacene, adems del nombre
y sus dos apellidos, tres elementos para almacenar domicilio, localidad y provincia; y un atributo
numrico entero para el nmero de matrcula del alumno.
Por lo tanto, se trata de definir un nuevo tipo complejo, cuyo contenido es de tipo complejo
(xs:complexContent) al que se le aade una extensin (xs:extension) a cuyo atributo base se le asigna el
tipo de datos que sirve de base (T_Nombre)
<xs:complexType name="T_Alumno">
<xs:complexContent>
<xs:extension base="T_Nombre">
<xs:sequence>
<xs:element name="domicilio" type="xs:string"/>
<xs:element name="localidad" type="xs:string"/>
<xs:element name="provincia" type="xs:string"/>
</xs:sequence>
<xs:attribute name="matricula" type="xs:integer" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
As, por ejemplo, la siguiente descripcin de elementos sera vlida segn el tipo anterior
<alumno matricula="7012">
<nombre>
<npila>Juan</npila>
<ape1>Ruiz</ape1>
<ape2>Morales</ape2>
</nombre>
<domicilio>Pablo Picasso,5</domicilio>
<localidad>La Palma del Condado</localidad>
<provincia>Huelva</provincia>
</alumno>
17
7. Grupos.
A menudo ocurre que un mismo grupo de elementos aparece repetidas veces a lo largo del cdigo de
un esquema. Con el fin de simplificar su escritura, podemos declararlo una sola vez, y referenciarlo
posteriormente desde otros elementos complejos tantas veces como sea necesario.
Los grupos no son tipos de datos, sino contenedores que incluyen un conjunto de elementos o
atributos que pueden ser usados en la definicin de tipos complejos. Para ello, se utilizan los componentes
xs:group y xs:attribteGroup.
Cuando un elemento desea incorporar un grupo, utiliza el componente xs:group y, con el atributo ref, se
indica el nombre del grupo definido anteriormente. He aqu un ejemplo de uso:
<xs:group name="infoPedido">
<xs:sequence>
<xs:element name="cliente" type="xs:string" />
<xs:element name="detallepedido" type="xs:string" />
<xs:element name="facturado_a" type="xs:string" />
<xs:element name="enviado_a" type="xs:string" />
</xs:sequence>
</xs:group>
<xs:element name="pedido">
<xs:complexType>
<xs:group ref="infoPedido" />
<xs:attribute name="estado" type="xs:string" />
</xs:complexType>
</xs:element>
Al igual que los elementos, los atributos tambin se pueden agrupar para ser referenciados en bloque
desde uno o varios elementos complejos.
En el siguiente ejemplo se define el grupo de atributos codigoIncidencia, que es usado a continuacin en
un elemento complejo:
<xs:attributeGroup name="codigoIncidencia">
<xs:attribute name="anno" type="xs:positiveInteger" />
<xs:attribute name="numero" type="xs:integer" />
</xs:attributeGroup>
<xs:complexType name="T_incidencia">
<xs:sequence>
<xs:element name="informa" type="xs:string" />
<xs:element name="centro" type="xs:string" />
<xs:element name="fecha" type="xs:date" />
<xs:element name="estado" type="xs:string" />
</xs:sequence>
<xs:attributeGroup ref="codigoIncidencia"/>
</xs:complexType>
8. Documentacin.
A un esquema se le pueden aadir componentes de tipo comentario que permitan, posteriormente, con
alguna aplicacin a medida, generar documentacin obtenida del propio esquema.
Estos comentarios se indican con el componente xs:annotation y sus subelementos xs:appinfo y/o
xs:documentation.
El componente xs:annotation puede incluirse dentro del elemento xs:schema o del resto de los
componentes de un esquema, pero siempre aparecer en primer lugar.
El componente xs:appinfo permite indicar informacin que ser utilizada por
xs:documentation asocia comentarios de texto sobre el esquema. Ambos componentes
atributo source para indicar una URI donde localizar informacin sobre la aplicacin.
la aplicacin; y
pueden llevar el
18
19
20
21