sintaxis de los xml schemas · xsd:gmonthday un día de ningún año concreto, o de cada año...

31
SINTAXIS DE LOS “XML SCHEMA”

Upload: hoangque

Post on 16-May-2018

217 views

Category:

Documents


2 download

TRANSCRIPT

SINTAXIS DE LOS “XML SCHEMA”

Introducción

� Qué es XML Schema:– es un conjunto de reglas que sirve para forzar la estructura y las restricciones de los contenidos de

los documentos XML de una forma muy precisa– es un documento XML con un vocabulario especializado

� Ventajas con respecto a los documentos DTD :

– se basa en XML y no en una sintaxis especializada – puede ser analizado sintácticamente y manipulado como cualquier otro documento XML – se pueden combinar distintos esquemas fácilmente– soporta más tipos de datos que tienen una analogía directa con lenguajes de programación y

Bases de Datos (string, int, float, boolean, date, ...) – en los DTD no se puede forzar el orden y la cantidad de elementos hijos– soporta integración con los espacios de nombres (Name Space)

– ESPACIOS DE NOMBRES : permiten escribir esquemas y validar documentos que usan elementos y atributos de múltiples vocabularios XML. Se utilizan los espacios de nombres para evitar conflictos entre nombres de elementos o nombres de atributos con igual nombre, pero significado distinto.

ESTRUCTURA DE UN ESQUEMA (1)

titulo.xsd

<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema“ elementFormDefault="qualified">

<xsd:element name=“TITULO” type=“xsd:String”/></xsd:schema>

****************************************************� <xsd:schema>

– este elemento se utiliza como elemento raíz del documento y actúa como contenedor del resto del contenido del esquema

� xmlns:xsd– todos los elementos en el esquema tienen el prefijo “xsd:”, el cual está asociado al espacio de nombre del

XML Schema a través de la declaración “xmlns:xsd”– Atributo elementFormDefaut:

� “qualified”: los elementos de un documento XML instancia de un esquema deberán ir todos precedidos de un prefijo del namespace (a menos que haya namespace por defecto)

� “unqualified”: sólo llevará prefijo el elemento raíz, y los elementos hijo lo herederán (salvo que se les indique expresamente otro prefijo)

– Atributo attributeFormDefault:

� “unqualified”: en los atributos no hace falta indicar un prefijo (salvo que difiera del del elemento en el que se encuadran), ya que su namespace será el mismo del elemento.

� “qualified”: en los atributos se debe incluir siempre el prefijo del namespace.

� los prefijos xsd: o xs: son usados por convención para denotar el espacio de nombre del XML Schema, aunque cualquier otro prefijo podría ser usado

ESTRUCTURA DE UN ESQUEMA (2)

� Definir un namespace por defecto para un elemento nos evita tener que usar prefijos en todos loselementos hijo. La sintaxis es: <xmlns="namespaceURI">.

� Hay dos formas distintas de declarar espacios de nombres:

– declaración explícita � se declara con un prefijo, y todos los nombres de elementos y atributos que estén

asociados con el espacio de nombre deberán utilizar el prefijo como parte de sus nombres cualificados

� resultan útiles cuando se quiere crear un documento que se apoya en múltiples espacios de nombre

– declaración predeterminada (namespace por defecto)� se declara sin un prefijo, y se hace referencia a todos los nombres de atributos y

elementos que haya en su ámbito con nombres no cualificados, y se presupone que estos se encuentran en el espacio de nombre

� Los prefijos no tienen que coincidir en el Schema en y los documentos instancia, sólo tienen que coincidir los espacios de nombres a los que se refieren. De hecho, uno podría usar prefijos y el otro podría usar el espacio de nombres por defecto.

� Sólo los elementos del nivel más alto de un esquema pueden ser los elementos raíz de los documentos instancia de un esquema, aunque en general no tienen por qué ser el elemento raíz.

DECLARACION DE UN ESQUEMA

�Hay dos maneras de declarar un esquema en un documento XML instancia de un esquema:

A) Si se quiere que los elementos del documentos instancia referencien a un único esquema<?xml version="1.0"?><TITULO xsi:noNamespaceSchemaLocation=“http://igae.pap.meh.es/xml/titulo.xsd"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">CURSO XML</TITULO>

B) Si se quiere que los elementos del documento instancia puedan referenciar a uno o varios espacios de nombres<?xml version="1.0"?><TITULO xmlns=“http://igae.pap.meh.es/xml/titulo "

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance“xsi:schemaLocation=“http://igae.pap.meh.es/xml/titulo http://igae.pap.meh.es/xml/titulo.xsd”

>CURSO XML</TITULO>

El elemento raíz sólo puede tener un atributo “xsi:schemaLocation”, y por tanto si hubiera varios espacios de nombres en el esquema, en ese atributo se recogerían todas las parejas URI_del espacio_de_nombre / URL (los dos componentes de la pareja se separan con un espacio en blanco, al igual que las parejas).

En el caso B, es necesario que el fichero .xsd del esquema defina un espacio de nombre destino mediante targetnamespace<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema“

xmlns= “http://igae.pap.meh.es/xml/titulo “targetNamespace= “http://igae.pap.meh.es/xml/titulo”

elementFormDefault="qualified">

• El atributo targetNamespace (que es una URI) permite especificar el espacio de nombres para el cual un esquema define componentes.

• Hay que declarar en el esquema un espacio de nombres igual que el valor del atributo targetNamespace del esquema, con o sin prefijo, según se quiera o no anteponer éste a los tag de xml.

COMPOSICION DE ESQUEMAS

� Si la mayoría de la información que se necesita en un esquema ya está contenida en otro fichero XSD, no tiene sentido duplicarla en el resto de ficheros que la usen, ya que además se producirían problemas cuando haya que modificar una parte de un esquema que se repita en otros.

� Para importar un fichero de esquema XSD en otro fichero se utiliza el elemento <include>, si ambos ficheros tienen el mismo espacio de nombres de destino :

<include schemaLocation=“ficheroejemplo.xsd“/>

� Para importar un fichero de esquema XSD, con un espacio de nombres de destino diferente, en otro fichero XSD, se usa el elemento <import>:

<import namespace=“espacio_de_nombres" schemaLocation=“URI_del_esquema_XSD"/>

� El atributo namespace es opcional. Indica que el documento de esquema contenedor puede contener referencias completas a los componentes del esquema en el espacio de nombres (a través de uno o varios prefijos declarados con atributos xmlns).

� Si falta este atributo, el esquema en el que está contenido puede incluir referencias sin cualificar a componentes del espacio de nombres importado.

TIPOS DE ELEMENTOS

DECLARACION DE UN ELEMENTO :<xsd:element name="nombreElemento"

type="tipoSimple/tipoCompuesto" minOccurs="valor" maxOccurs="valor"/>

El valor por defecto de minOccurs y maxOccurs es “1”

� Tipos simples y tipos complejos– tipos complejos :

� pueden contener elementos, atributos y texto – los elementos se declaran utilizando el elemento <xsd:element>– los atributos se declaran utilizando el elemento <xsd:attribute>

� se definen utilizando el elemento <xsd:complexType>– este elemento puede tener los siguientes subelementos

� <xsd:sequence>, <xsd:choice>, <xsd:all>– tipos simples :

� no contienen elementos ni atributos– sólo contienen texto

� estos son algunos de los tipos simples más comunes– xsd:string, xsd:integer, xsd:positiveInteger, xsd:int, xsd:long, xsd:short,

xsd:decimal, xsd:float, xsd:double, xsd:boolean, xsd:time, xsd:date, ...

ELEMENTOS GLOBALES (1)

� Para facilitar la legibilidad de los XML Schemas y reutilizar definiciones de otros esquemas, nos puede ser útil crear un elemento global, y hacer referencias al mismo.

� Los elementos globales son elementos que son hijos inmediatos del elemento “schema”. Los elementos locales son elementos anidados dentro de otros elementos.

� Un elemento global :– tiene que estar declarado como un subelemento del elemento <xsd:schema>, pero nunca como

parte de un elemento de tipo complejo – no puede contener referencias

� es decir no pueden albergar el atributo ref

– no pude indicar el número de ocurrencias que tiene que aparecer un elemento

� Esta es la sintaxis de una declaración local que hace referencia a un elemento global <xsd:element ref="nombreElementoGlobalYaExistente" minOccurs="valor">

� el atributo ref hace referencia a un elemento global (que puede estar definido en otro fichero xsd, al que se referencia mediante un espacio de nombres)

� en la declaración local, si queremos podemos indicar la cardinalidad del elemento global con los atributos minOccurs y maxOccurs

ELEMENTOS GLOBALES (2)

�EJEMPLO SIN REFERENCIAS A ELEMENTOS GLOBALES:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema“

targetNamespace=“http://igae.meh.es/cancion”elementFormDefault="qualified">

<xsd:element name=“CANCION” type=“Tipocancion”/> <xsd:complexType name=“Tipocancion”>

<xsd:sequence><xsd:element name=“NOMBRE” type=“xsd:string”>

<xsd:element name=“AUTOR” type=“xsd:string”></xsd:sequence>

</xsd:complexType></xsd:schema>

� Ahora vamos a definir otro esquema que agregará a sus elementos y atributos locales otros procedentes del esquema “http://igae.meh.es/cancion”. Esto se hace mediante un elemento xsd:import

�EJEMPLO CON REFERENCIAS A ELEMENTOS GLOBALES:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema“

xmlns:cc=“http://igae.meh.es/cancion” elementFormDefault="qualified"><xsd:import namespace=“http://igae.meh.es/cancion” schemaLocation=" http://igae.meh.es/cancion.xsd" /> <xsd:element name=“DISCO"><xsd:complexType>

<xsd:sequence><xsd:element ref=“cc:CANCION” maxoccurs=“unbounded”/><element name=“EDITORIAL” type=“xsd:string”/>

</xsd:sequence></xsd:complexType></xsd:element></xsd:schema>

TIPOS DE DATOS SIMPLES

� NUMERICOS

Entero estrictamente mayor que ceroxsd:positiveInteger

Entero sin signo de ocho bytesxsd:unsignedLong

Entero mayor o igual que ceroxsd:nonNegativeInteger

Entero de 1 byte en complemento a dosxsd:byte

Entero sin signo de cuatro bytesxsd:unsignedInt

Entero sin signo de dos bytesxsd:unsignedShort

Entero sin signo de un bytexsd:unsignedByte

Entero de 2 bytes en complemento a dosxsd:short

Entero de 4 bytes en complemento a dosxsd:int

Entero de 8 bytes en complemento a dosxsd:long

Entero estrictamente menor que ceroxsd:negativeInteger

Entero menor o igual que ceroxsd:nonPositiveInteger

Entero arbitrariamente grande o pequeñoxsd:integer

Números decimales de precisión arbitrariaxsd:decimal

Número en coma flotante de 64 bitsxsd:double

Número en coma flotante de 32 bitsxsd:float

TIPOS DE DATOS SIMPLES (2)

� TEMPORALES

Duración de un intervalo de tiempo sin extremos fijos, hasta una fracción arbitraria de un segundo

xsd:duration

Un día de ningún año concreto, o de cada añoXsd:gMonthDay

Un mes concreto de un año específicoxsd:gYearMonth

Un año concretoxsd:gYear

Un mes en ningún año concretoxsd:gMonth

Un día de cada mes, o de ningún mes concreto

xsd:gDay

Un momento específico del día que se repite cada día

xsd:time

Un día específico en la historiaxsd:date

Un momento específico en CoordinatedUniversal Time hasta una fracción arbitrariamente pequeña de segundo

xsd:DateTime

TIPOS DE DATOS SIMPLES (3)

� TIPOS DE DATOS XML (1)

Atributo Cadena de caracteres. Mismos caracteres que NMTOKEN más espacio en blanco.

xsd:NMTOKENS

Atributo Cadena de caracteres. Sólo puede contener letras, dígitos, punto [ . ], guión [ - ], subrayado [ _ ] y dos puntos [ : ]

xsd:NMTOKEN

Tipo atributo. Lista de nombres tipo ENTITY separados por comas

xsd:ENTITIES

Tipo atributo. Lista de nombres separados por comas que se usan como valores de un atributo o elemento de tipo ID situado en cualquier otro lugar del documento

xsd:IDREFS

Tipo atributo. definición de una notación para describir el formato de datos no XML dentro de un documento XML (ef: GIF, jpeg, pdf, etc)

xsd:NOTATION

Atributo con una entidad no parseada. Permiten incluir contenido no-XML en un documento XML. Las ENTIDADES resultan muy útiles para repetir información o bloques grandes de texto que pueden estar guardados en archivos separados.

xsd:ENTITY

Tipo atributo. Cualquier nombre XML que se usa como valor de un atributo o elemento de tipo ID situado en cualquier otro lugar del documento

xsd:IDREF

atributo que es único entre los atributos de tipo ID y elementos

xsd:ID

TIPOS DE DATOS SIMPLES (4)

� TIPOS DE DATOS XML (2)

Un nombre local sin ningún carácter “:”xsd:NCName

Un nombre con prefijo. Ej: song:titlexsd:QName

Un nombre XML, que puede contener “:” (pero no se le da a este carácter ningún significado). Se puede usar como un nombre de tipo de elemento o nombre de atributo. El tipo de caracteres que permite coincide con NMTOKEN.

xsd:Name

Nombre válidos de idiomas según xml_lang (en, en-GB, en-US, fr, sp, etc)xsd:language

TIPOS DE DATOS SIMPLES (5)

� CADENA

� BINARIO

Una cadena sin espacios en blanco iniciales ni finales, sin tabuladores, sin saltos de línea, y sin más de un espacio en blanco consecutivo

xsd:token

Una cadena que no contiene tabuladores, ni retornos de carro, ni saltos de línea

xsd:normalizedString

Una secuencia de cero o más caracteres Unicodepermitidos en documentos XMLNOTA -> no se permiten en XML los caracteres:",',&,<,>, á,é, í,ó,ú,ñ,Á,É,Í,Ó,Ú,Ñ

xsd:string

Utiliza un conjunto de caracteres más amplio (65 caracteres ASCII), que pasan a través de todos los gateways, relays de correo y servidores de terminales. Base64 codifica cada 3 bytes en 4 caracteres.

xsd:base64Binary

Codifica cada byte de la entrada como dos dígitos hexadecimales (usa sólo los dígitos 0-9 y las letras A-F)

xsd:hexBinary

TIPOS DE DATOS SIMPLES (6)

� URI

Representa una referencia URI(Uniform Resource Identifier). Las URIs se usan para identificar recursos, y pueden ser absolutas o relativas. Las URIs Relativas se especifican como la diferencia respecto a una URI de base, tal como : ../prod.html. También es posible especificar un identificador de fragmento, usando el carácter #, tal como : ../prod.html#shirt.

xsd:anyURI

ELEMENTOS COMPLEJOS

�El elemento <xsd:sequence>Utilizamos este elemento para indicar que la secuencia de elementos anidados tienen que aparecer en el documento XML y con el mismo orden.

Este es un ejemplo :<xsd:element name="camiseta"><xsd:complexType><xsd:sequence><xsd:element name="color" type="xsd:string"/> <xsd:element name="talla" type="xsd:string"/> </xsd:sequence></xsd:complexType></xsd:element name="camiseta">

�El elemento <xsd:choice>Este elemento es muy útil cuando tenemos una lista de elementos y queremos que en el documento XML aparezca solamente uno de ellos

Este es un ejemplo :<xsd:element name="vehiculoMotor"><xsd:complexType><xsd:choice><xsd:element name="coche" type="xsd:string"/> <xsd:element name="moto" type="xsd:string"/> <xsd:element name="fugoneta" type="xsd:string"/> <xsd:element name="camion" type="xsd:string"/> </xsd:choice></xsd:complexType></xsd:element name=“vehiculoMotor">

ELEMENTOS COMPLEJOS (2)

� El elemento <xsd:all>

Se comporta igual que el elemento <xsd:sequence>, pero no es obligado que la secuencia de elementos anidadosaparezcan en el documento XML con el mismo orden.

Este es un ejemplo :

<xsd:element name="camiseta"><xsd:complexType>

<xsd:all><xsd:element name="color" type="xsd:string"/> <xsd:element name="talla" type="xsd:string"/>

</xsd:all></xsd:complexType>

</xsd:element name="camiseta">

ELEMENTOS COMPLEJOS (3)

ATRIBUTOS (I)

� Esta es la declaración de un atributo<xsd:attribute name="nombreAtributo"

type="tipoSimple"use="valor" default="valor" fixed="valor"/>

� type– los atributos sólo pueden contener tipos simples

� use (Opcional) – conjunto de valores de use

� required– el atributo debe aparecer en el documento XML

� optional (valor por defecto)– el atributo puede aparecer o no aparecer en el documento XML

� prohibited– el atributo no debe aparecer en el documento XML

� default (Opcional) – si el atributo no aparece en el documento instanciado, el parser del esquema se encarga de ofrecer el valor contenido en

el atributo default– los valores por defecto sólo se permiten si el atributo es opcional

� fixed (Opcional) – si el valor del atributo está presente en la instancia del documento XML, el valor debe ser el mismo que el que indica el

atributo fixed– si el atributo no está presente en el documento XML, el parser del esquema ofrecerá el valor contenido en el atributo

fixed– los valores de los atributos default y fixed son mutuamente exclusivos

� por lo tanto habrá un error si una declaración contiene ambos

ELEMENTOS COMPLEJOS (4)

ATRIBUTOS (II)

� Un elemento con atributos tiene por definición un tipo complejo. Los elementos xsd:attribute deben venir después del grupo xsd:sequence, xsd:choice o xsd:all que forma el cuerpo de un elemento.

<xsd:complextype name=“Tipopersona"><xsd:sequence>

<xsd:element name=“Nombre"><xsd:complexType>

<xsd:all><xsd:element name=“Nombre de pila" type="xsd:string"/><xsd:element name=“Apellido" type="xsd:string"/>

</xsd:all></xsd:complexType>

</xsd:element></xsd:sequence><xsd:attribute name="ID" type="xsd:ID"/>

</xsd:complexType>

ELEMENTOS COMPLEJOS (5)

ATRIBUTOS (III)

� Para añadir atributos a elementos que contienen sólo texto, se genera un nuevo tipo complejo a partir de uno simple, dándole al elemento xsd:complexType un elemento hijo xsd:simpleContenten vez de un elemento xsd:sequence, xsd:choice o xsd:all.

� El elemento xsd:simpleContent tiene un elemento hijo xsd:extension, cuyo atributo base identifica el tipo simple a extender (como xsd:string). Los atributos xsd:attribute se sitúan dentro del elemento xsd:extension.

<xsd:complexType name=“CadenaConID"><xsd:simpleContent>

<xsd:extension base="xsd:string"><xsd:attribute name="ID" type="xsd:ID"/>

</xsd:extension></xsd:simpleContent>

</xsd:complexType>

ELEMENTOS COMPLEJOS (6)

CONTENIDO MIXTO

Permite introducir en un elemento compuesto texto extra que no pertenezca a sus elementos hijo.Se configura mediante atributo Mixed=“true” en los elementos complexType del esquemaEj:<xsd:element name=“COMPOSITOR">

<xsd:complexType mixed=“true”><xsd:all>

<xsd:element name=“NOMBRE" type="xsd:string"/> <xsd:element name=“APELLIDO" type="xsd:string"/>

</xsd:all></xsd:complexType>

</xsd:element name=“COMPOSITOR">

En este caso, en un documento instancia del esquema podría figurar (el texto extra es “Sr”) :…<COMPOSITOR> Sr.

<NOMBRE> Antonio </NOMBRE><APELLIDO> Vivaldi </APELLIDO>

</COMPOSITOR>…

ELEMENTOS GRUPO

� El elemento grupo se usa para definir un grupo de elementos que pueden reutilizarse en varias definiciones de tipos complejos.

<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:group name="custGroup"><xs:sequence>

<xs:element name="customer" type="xs:string"/><xs:element name="orderdetails" type="xs:string"/><xs:element name="billto" type="xs:string"/><xs:element name="shipto" type="xs:string"/>

</xs:sequence></xs:group>

<xs:element name="order" type="ordertype"/>

<xs:complexType name="ordertype"><xs:group ref="custGroup"/><xs:attribute name="status" type="xs:string"/>

</xs:complexType>

</xs:schema>

� En un documento XML instancia de un esquema, no se pueden definir elementos que sean de un tipo correspondiente al group del esquema, sino que tienen que ser de un tipo elemento complejo que incluya en su interior al grupo en cuestión.

� También existen grupos de atributos, que se definirían mediante xs:attributegroup, de manera análoga

RESTRICCIONES EN TIPOS SIMPLES

<xsd:restriction base="tipoSimple">propiedades

</xsd:restricion>

PROPIEDADES – para limitar valores numéricos :

<xsd:minExclusive>, <xsd:minInclusive>, <xsd:maxExclusive>, <xsd:maxInclusive>– para limitar la longitud de una string :

<xsd:length>, <xsd:minLength>, <xsd:maxLength>– para limitar un tipo simple a un conjunto acotado de valores

<xsd:enumeration>– para aplicar expresiones regulares :

<xsd:pattern> Ejemplo : <xsd:pattern value=“\p{Sc}\p{Nd}+(\.\p{Nd}\p{Nd})?”>Símbolo monetario + uno o más digitos + parte opcional compuesta de : punto y dos decimales

Ejemplo propiedades <xsd:minInclusive> y <xsd:maxInclusive> De esta forma por ejemplo se puede restringir un tipo simple que se basará en un integer que queremos que tenga un

rango entre 28 y 210

<xsd:simpleType name="miInteger"><xsd:restriction base="xsd:integer">

<xsd:minInclusive value=“28"/><xsd:maxInclusive value=“210"/>

</xsd:restriction></xsd:simpleType>

RESTRICCIONES TIPOS SIMPLES (2)

La propiedad <xsd:enumeration> se utiliza para restringir el valor de casi todos los tipos simples. Esta propiedad limita un tipo simple a un conjunto acotado de valores. En este ejemplo el elemento diasDeLaSemana está restringido a los 7 días de la semana :

<xsd:element name="diasDeLaSemana"><xsd:simpleType><xsd:restriction base="xsd:string"><xsd:enumeration value="lunes"/><xsd:enumeration value="martes"/><xsd:enumeration value="miércoles"/><!-- y así sucesivamente ... --></xsd:restriction><xsd:simpleType></xsd:simpleType>

�Definiciones de tipos anónimos� Un tipo anónimo es útil cuando se quiere usar un tipo solamente una vez, y no se quieren crear muchos elementos diferentes con el mismo tipo. Se evita la sobrecarga de tener que nombrarlo y referenciarlo explícitamente.

�Para crear una definición de tipo anónimo, simplemente se incrusta un elemento <xsd:simpleType> o <xsd:complexType> dentro de una declaración de elemento <xsd:element>. No hay que nombrar el tipo ni asignar un valor explícito al atributo type de <xsd:element>.

� Además, permite dar a elementos con el mismo nombre diferentes tipos cuando se usan en diferentes elementos. Por ejemplo, puedes decir que el NOMBRE de una PERSONA contiene elementos hijos NOMBRE DE PILA y FAMILIA, mientras que el NOMBRE de una PELICULA contiene un xsd:string, y el NOMBRE de una VARIABLE contiene una cadena que posee sólo caracteres alfanuméricos del conjunto de caracteres ASCII.

�También permiten evitar que determinados tipos de elementos puedan ser hijos de cualquier otro elemento, sino únicamente de aquellos dentro de los cuales se definan.

EJEMPLO CON TIPOS ANONIMOS

<?xml version="1.0“ encoding='ISO-8859-1' ?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name=“CANCION" type=“TipoCancion"/><xsd:complexType name="TipoPersona">

<xsd:sequence><xsd:element name="NOMBRE">

<xsd:complexType><xsd:sequence>

<xsd:element name="NOMBRE DE PILA" type="xsd:string"/><xsd:element name="FAMILIA" type="xsd:string"/>

</xsd:sequence></xsd:complexType>

</xsd:element></xsd:sequence>

</xsd:complexType><xsd:complexType name="TipoCancion">

<xsd:sequence><xsd:element name="TITULO" type="xsd:string"/><xsd:element name="COMPOSITOR" type="TipoPersona"

maxOccurs="unbounded"/><xsd:element name="PRODUCTOR" type="TipoPersona"

minOccurs="0" maxOccurs="unbounded"/><xsd:element name="EDITORIAL" type="xsd:string"

minOccurs="0"/><xsd:element name="DURACION" type="xsd:string"/><xsd:element name="ARTISTA" type="xsd:string"

maxOccurs="unbounded"/></xsd:sequence>

</xsd:complexType></xsd:schema>

HERENCIA: EXTENSION DE ELEMENTOS

� Un elemento de tipo complejo se puede extender, ya sea añadiéndole atributos (como vimos anteriormente), o bien incluyendo nuevos elementos dentro del tipo extendido :

<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="employee" type=“infopersonacompleta"/>

<xs:complexType name="infopersona"><xs:sequence>

<xs:element name="nombre" type="xs:string"/><xs:element name=“apellido" type="xs:string"/>

</xs:sequence></xs:complexType>

<xs:complexType name="infopersonacompleta"><xs:complexContent>

<xs:extension base="infopersona"><xs:sequence>

<xs:element name=“direccion" type="xs:string"/><xs:element name="ciudad" type="xs:string"/><xs:element name=“provincia" type="xs:string"/>

</xs:sequence></xs:extension>

</xs:complexContent></xs:complexType>

</xs:schema>

FACETAS

� Además de las restricciones anteriores de los tipos simples, existen otras “facetas” o propiedades :

– xsd:totalDigits : el número máximo de dígitos permitidos en un elemento numérico

– xsd:fractionDigits : el número máximo de dígitos permitidos en la parte decimal

– xsd:whitespace : especifica el tratamiento de los espacios en blanco. Se aplica a elementos de tipo xsd:string, xsd:normalizedString y xsd:token. Esta faceta tiene tres posibles valores :

� preserve : los espacios en blanco del documento se mantienen� replace : cada tabulador, retorno de carro y salto de línea se reemplaza con un solo espacio.� collapse: cada tabulador, retorno de carro y salto de línea se reemplaza con un solo espacio. Una vez hecho

esto, todas las series de múltiples espacios se condensan en uno solo. Se borran los espacios en blanco iniciales y finales.

LISTAS

� El elemento <xsd:list> define un elemento de tipo simple como una lista de valores de un tipo especificado.

� El siguiente ejemplo muestra un tipo simple que es una lista de enteros :

<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name=“valoresenteros" type="listavalores“/>

<xs:simpleType name=“listavalores"><xs:list itemType="xs:integer"/>

</xs:simpleType></xs:schema>

El elemento "valoresenteros" en un documento podría tener este aspecto (observar que la lista tendrá 5 items):<valoresenteros>100 34 56 -23 1567</valoresenteros>

NOTA: el espacio en blanco se trata como separador de los elementos de la lista.

COMENTARIOS A LOS ESQUEMAS

� Además de los comentarios XML, que comienzan por la cadena "<!--" y terminan con "-->“, XML Schematambién proporciona un mecanismo más formal para comentar esquemas.

� Todos los elementos de un esquema pueden contener elementos hijo xsd:annotation que describan esa parte del esquema para lectores humanos o programas de ordenador. Este elemento tiene dos tipos de hijos :

– El elemento hijo <xsd:documentation> describe el esquema para lectores humanos. – El elemento hijo <xsd:appInfo source=cualquierURL> describe información sobre el esquema para

ser usada por programas de ordenador. Por ejemplo, puede contener instrucciones sobre qué hojas de estilo aplicar al esquema.

Por ejemplo, el siguiente comentario podría añadirse al esquema de canción visto anteriormente :<xsd:annotation>

<xsd:documentation>Esquema de Cancion para el Curso de XML SchemaCopyright 2011 Blancanieves

</xsd:documentation></xsd:annotation>

REFERENCIAS CRUZADAS

� Se puede utilizar el lenguaje de vínculos XML XLink para crear enlaces entre elementos y archivos (por ejemplo imágenes) situados en Internet u otras redes.

� Por ejemplo, se podría definir dentro de un esquema el tipo de dato “TipoFoto” que emplea XLink:

<xsd:element name=“FOTO” type=“TipoFoto”>

<xsd:complexType name=“TipoFoto">

<xsd:attribute name=“ANCHURA" type="xsd:positiveInteger"

use="required" />

<xsd:attribute name=“ALTURA" type="xsd:positiveInteger"

use="required" />

<xsd:attribute name="ALT" type="xsd:string"

use="required" />

<xsd:attribute ref="xlink:type"/>

<xsd:attribute ref="xlink:href" use="required"/>

<xsd:attribute ref="xlink:actuate"/>

<xsd:attribute ref="xlink:show"/>

</xsd:complexType>

(Habiendo incluido en el elemento xsd:schema la definición del espacio de nombres xmlns:xlink=“http://www.w3.org/1999/xlink”)

REFERENCIAS CRUZADAS (2)

� En el documento instancia del esquema XML en el que se ha definido el tipo de dato “TipoFoto” puede figurar el siguiente elemento :

<FOTO xlink:type=“simple” xlink:href=“disfrazpolicia.jpg” xlink:show=“embed” xlink:actuate=“onLoad”ALT=“Jose Garcia en disfraz de policia verano 2008”ANCHURA=“100” ALTURA=“200”/>

� xlink:type="simple" crea un enlace simple unidireccional entre dos puntos (“de aquí a allí”)� xlink:href define la URL a la que se enlaza.� xlink:show -> Con este atributo podemos describir cómo se verá el resultado del hecho de seguir el enlace

– new: se abre una nueva ventana y se muestra la URI enlazada– replace: muestra el recurso en la ventana actual, sustituyendo el documento– embed: incrusta el recurso enlazado en el documento actual, en la ubicación del elemento enlace.– none: no se proporcionan detalles

� xlink:actuate -> define cuándo se lee y se muestra el recurso enlazado– onLoad: se debería seguir el enlace en cuanto lo ve la aplicación– onRequest: se debería seguir el enlace cuando lo pide el usuario– none: no se proporcionan detalles