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 los elementos 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 xsd:float Número en coma flotante de 32 bits xsd:double Número en coma flotante de 64 bits xsd:decimal Números decimales de precisión arbitraria xsd:integer Entero arbitrariamente grande o pequeño xsd:nonPositiveInteger Entero menor o igual que cero xsd:negativeInteger Entero estrictamente menor que cero xsd:long Entero de 8 bytes en complemento a dos xsd:int Entero de 4 bytes en complemento a dos xsd:short Entero de 2 bytes en complemento a dos xsd:byte Entero de 1 byte en complemento a dos xsd:nonNegativeInteger Entero mayor o igual que cero xsd:positiveInteger Entero estrictamente mayor que cero xsd:unsignedLong Entero sin signo de ocho bytes xsd:unsignedInt Entero sin signo de cuatro bytes xsd:unsignedShort Entero sin signo de dos bytes xsd:unsignedByte Entero sin signo de un byte TIPOS DE DATOS SIMPLES (2) TEMPORALES xsd:DateTime Un momento específico en Coordinated Universal Time hasta una fracción arbitrariamente pequeña de segundo xsd:date Un día específico en la historia xsd:time Un momento específico del día que se repite cada día xsd:gDay Un día de cada mes, o de ningún mes concreto xsd:gMonth Un mes en ningún año concreto xsd:gYear Un año concreto xsd:gYearMonth Un mes concreto de un año específico Xsd:gMonthDay Un día de ningún año concreto, o de cada año xsd:duration Duración de un intervalo de tiempo sin extremos fijos, hasta una fracción arbitraria de un segundo TIPOS DE DATOS SIMPLES (3) TIPOS DE DATOS XML (1) xsd:ID atributo que es único entre los atributos de tipo ID y elementos xsd:IDREF 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:ENTITY 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:NOTATION 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:IDREFS 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:ENTITIES Tipo atributo. Lista de nombres tipo ENTITY separados por comas xsd:NMTOKEN Atributo Cadena de caracteres. Sólo puede contener letras, dígitos, punto [ . ], guión [ - ], subrayado [ _ ] y dos puntos [ : ] xsd:NMTOKENS Atributo Cadena de caracteres. Mismos caracteres que NMTOKEN más espacio en blanco. TIPOS DE DATOS SIMPLES (4) TIPOS DE DATOS XML (2) xsd:language Nombre válidos de idiomas según xml_lang (en, en-GB, en-US, fr, sp, etc) xsd:Name 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:QName Un nombre con prefijo. Ej: song:title xsd:NCName Un nombre local sin ningún carácter “:” TIPOS DE DATOS SIMPLES (5) CADENA xsd:string Una secuencia de cero o más caracteres Unicode permitidos en documentos XML NOTA -> no se permiten en XML los caracteres: ",',&,<,>, á,é, í,ó,ú,ñ,Á,É,Í,Ó,Ú,Ñ xsd:normalizedString Una cadena que no contiene tabuladores, ni retornos de carro, ni saltos de línea xsd:token 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 BINARIO xsd:hexBinary 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:base64Binary 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. TIPOS DE DATOS SIMPLES (6) URI xsd:anyURI 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. 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 anidados aparezcan 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:simpleContent en 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 esquema Ej: <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 Schema tambié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 Schema Copyright 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