You are on page 1of 7

Esquemas XML (Parte 2)

FORMA CUALIFICADA DE UN ELEMENTO


El atributo "form" permite sobreescribir la cualificacin por defecto de un elemento. Como se mostr anteriormente, si un elemento est cualificado, entonces debe tener un espacio de nombres asociado cuando se usa en un documento instancia. Se puede especificar si el elemento debe estar cualificado asignando un valor al atributo "form". Este valor puede ser "qualified" o "unqualified". Si no se incluye el valor, el validador utiliza el valor del atributo "elementFormDefault" declarado en <schema>. NOTA: Los elementos declarados globalmente siempre tienen que estar cualificados, independientemente del valor de "elementFormDefault" o "form".

CARDINALIDAD
Tal y como se haca en los DTD, es posible definir la cardinalidad de un elemento, es decir, cuantas veces puede o debe aparecer. En los esquemas XML, se puede moficiar la cardinalidad XML mediante los atributos "minOccurs" y "maxOccurs". Por ejemplo: <element name="nombre" type="string" minOccurs="2" maxOccurs="2"/> <element ref="target:nombre" maxOccurs="10"/> <element name="direccin" minOccurs="0" maxOccurs="unbounded"/> En el primer caso, se declara que el elemento nombre puede aparecer en la instancia exactamente 2 veces. En el segundo, se indica que el elemento est usando una referencia a la declaracin global de "nombre". Incluso si se ha declarado usando "ref", se puede definir la cardinalidad. En este caso, como mnimo aparecer 1 vez (no declarar minOccurs es igual a decir minOccurs="1") y como mximo 10. El ltimo ejemplo especifica la direccin puede o no aparecer, y que si aparece, puede hacerlo tantas veces como quiera (unbounded). NOTA: Los atributos minOccurs y maxOccurs no estn permitidos dentro de declaraciones de elementos globales. En vez de esto, se pueden usar estos atributos en elementos que referencian a los primeros. Es el caso del segundo ejemplo anterior.

VALORES POR DEFECTO

Cuando disebamos DTDs para nuestra lista de contactos de alumnos,hicimos uso del atributo "default". Pues lo mismo es para los esquemas. Se puede declarar un valor por defecto (o un valor fijo) para elementos y atributos. Cuando se declaran valores por defecto para un elemento, solo se pueden especificar un valor de texto. No se pueden especificar valores por defecto para un elemento cuyo modelo de contenido contenga otros elementos, a no ser que se trate de un modelo de contenido mixto. Especificando un valor por defecto para nuestro elemento, nos aseguramos de que el validador tratar este valor como si estuviese incluido en el docuemnto XML (aunque se haya omitido). Para especificar un valor por defecto, utilizamos el atributo "default": <element name="nombre" type="string" default="Juan"/>

Con la declaracin anterior, sera lo mismo escribir <nombre/>, que<nombre>Juan</nombre>.

VALORES FIJOS
Se pueden declarar valores fijos tanto para atributos como para elementos. Si se declara un elemento o un atributo fijo siempre tendrn el mismo valor. Y si no se incluye este valor, el analizador sintctico aadir el valor automticamente. Poner un valor diferente devolver un error. El siguiente ejemplo muestra como definir un valor fijo para un elemento (para un atributo sera igual): <element name="version" type="string" fixed="1.0"/> El la instancia de documento, seran legales las siguientes lneas: <version>1.0</version> <version></version> <version/>

En las dos ltimas se aadira el valor 1.0. Pero escribir <version>1.2</version> devolvera un error.

ZONA LIBRE (COMODN DE ELEMENTOS)


A veces puede quererse incluir elementos en el esquema sin declarar explcitamente qu elementos deberan permitirse. Supongamos que queremos especificar que nuestro elemento puede contener cualquiera de los elementos declarados en nuestro espacio de nombres, o cualquier elemento de otro espacio de nombres. Esto es normal cuando se disean esquemas. Las delcaraciones que permiten incluir cualquier elemento de un espacio de nombres son llamados "element wildcards" (que yo me atrevo a traducir como "comodn de elementos"). Para declarar un comodn de elementos, se usa la declaracin <any>. <any> puede incluir los atributos "minOccurs", "maxOccurs", "namespace" y "processContents". La declaracin <any> solo puede aparecer dentro de un modelo de contenido. No se puede crear un comodn global. Con "minOccurs" y "maxOccurs" podemos controlar la cardinalidad. Con namespace podemos controlar el espacio de nombres del que provienen los elementos. El atributo processContents regula la forma en que el analizador procesa el contenido. El atributo namespace puede tener diferentes valores:

##any

-> Permite incluir en el comodn a alementos de cualquier espacio de nombres.

##other -> Permite incluir en el comodn a elementos de espacios de nombres diferentes al "targetNamespace". ##targetNamespace -> Permite incluir en el comodn a elementos que pertenezcan al "targetNamespace". ##local -> Permite cualquier elemento bien formado que no est cualificado por un espacio de nombres. <Lista de espacios de nombres separados por espacio> -> Permite elementos de cualquiera de los espacios de nombres listados. Entre los espacios de nombres se puede incluir ##targetNamespace y ##local.

Por ejemplo, supongamos que queremos permitir dentro del elemento "persona" cualquier contenido xml bien formado de cualquier espacio de nombres: <complexType name="TipoNombre"> <sequence> <element ref="target:nombre"/> <element ref="target:apellido1"/> <element ref="target:apellido2"/> <!-- Ahora permito cualquier elemento de cualquier espacio de nombres --> <any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="ttulo" type="string"/> </complexType> En este ejemplo hemos especificado que un elemento de tipo "TipoNombre" puede contener elementos de cualquier espacio de nombres, cualquier nmero de veces. Es decir, que el modelo de contenido debe incluir <nombre>, <apellido1> y <apellido2>, seguido de cualquier nmero de elementos de cualquier espacio de nombres. Cuando el analizador con validacin est procesando una declaracin que contiene un comodn, valida el documento instancia de tres formas, en base al valor del atributo processContents: - Si processContents vale "skip", entonces el analizador se salta cualquier elemento comodn. - Si processContents vale "lax", entonces el analizador intenta validar el comodn, suponiendo que tiene acceso a un esquema importado que lo define. - Si processContents vale "strict" (el valor por defecto), el analizador intenta validar el comodn, pero a diferencia de "lax", el analizador genera un error si no encuentra un esquema importado para el comodn (lo veremos ms adelante). NOTA: Aun no hemos visto como importar esquemas, pero es algo que se puede hacer. Se trata de poder acceder a las declaraciones de otro esquema, sencillamente importndolo.

DECLARACIONES <COMPLEXTYPE>
En los ejemplos anteriores, hemos visto de pasada la declaracin de elementos. En estas declaraciones, aparecan las definiciones<complexType>. Dentro de <complexType> se pueden especificar los elementos permitidos en el contenido de un elemento. <complexType> permite los atributos "mixed" y "name". El atributo "mixed" puede valer "true" o "false". En un momento entramos en ello. Por ejemplo: <?xml version=1.0?> <schema xmlns=http://www.w3.org/2001/XMLSchema xmlns:target=http://www.example.com/persona targetNamespace=http://www.example.com/persona elementFormDefault=qualified> <element name=persona> <complexType> <sequence> <element name=nombre type=string/> <element name=apellido1 type=string/> <element name=apellido2 type=string/> </sequence> <attribute name=ttulo type=string/> </complexType> </element> </schema> Como esta es una declaracin local, no hemos incluido el atributo nombre en "complexType". Las definiciones locales nunca tienen nombre, y son llamadas "tipos complejos annimos". En cambio, las declaraciones "complexType" globales siempre utilizan el atributo nmbre. Observa el siguiente ejemplo: <?xml version=1.0?> <schema xmlns=http://www.w3.org/2001/XMLSchema xmlns:target=http://www.example.com/persona targetNamespace=http://www.example.com/persona elementFormDefault=qualified> <element name=nombre type=string/> <element name=apellido1 type=string/> <element name=apellido2 type=string/> <complexType name=TipoNombre> <sequence> <!-- Aqu hacemos referencia a los elementos globales anteriormente definidos, nombre, apellido1 y apellido2 --> <element ref=target:nombre/> <element ref=target:apellido1/> <element ref=target:apellido2/> </sequence> <attribute name=ttulo type=string/> </complexType> <element name=persona type=target:TipoNombre/>

</schema> Las definiciones tambin pueden usarse para crear modelos de contenido mixto y vaco. El contenido mixto nos permite incluir tanto texto como elementos. Para crear un modelo de contenido mixto, hay que incluir el atributo mixed="true". Por ejemplo: <element name="descripcin"> <complexType mixed="true"> <choice minOccurs="0" maxOccurs="unbounded"> <element name="em" type="string"/> <element name="strong" type="string"/> <element name="br" type="string"/> </choice> </complexType> </element> En este ejemplo declarado como "descripcin", el elemento puede contener un infinito nmero de <em>, <strong> y <br>. Adems, puede haber texto intercalado gracias al atributo mixed="true". Es decir, un elemento descripcin vlido podra ser: <description> Juan es el <em> director </em> de la sucursal del banco <strong> Bananero </strong> </description> El analizador con validacin ignorar el contenido textual. Para declarar un modelo de contenido vaco en una definicin <complexType>, sencillamente hay que dejarla vaca. Por ejemplo: <element name="conocidos"> <complexType/> </element>

En este caso, el elemento "conocidos" nunca contendr texto o elementos hijo.

DECLARACIONES <GROUP>
Adems de <complexType>, los esquemas permiten definir grupos de elementos reutilizableas. Creando una declaracin global <group>, se puede reusar y combinar modelos de contenido. El elemento <group> solo permite el atributo "name". Como ya comentamos antes, las declaraciones globales tienen que tener un nombre, as que los <group> no son menos. Veamos este ejemplo: <?xml version="1.0"?> <schema xmlns=http://www.w3.org/2001/XMLSchema xmlns:target=http://www.example.com/persona targetNamespace=http://www.example.com/persona elementFormDefault=qualified> <group name=GrupoNombre> <sequence> <element name=nombre type=string/> <element name=apellido1 type=string/> <element name=apellido2 type=string/> </sequence> </group> <complexType name="TipoNombre"> <group ref="target:GrupoNombre"/> <attribute name="title" type="string"/> </complexType> <element name="persona" type="target:TipoNombre"/>

</schema>

Si observamos bien este ejemplo, veremos que primero se define un <group>, que es reutilizado por un <complexType> que finalmente es reutilizado por un <element>.

MODELOS DE CONTENIDO
Ya hemos visto que podemos usar <complexType> y <group> para especificar el contenido vlido de un elemento. Ahora vamos a ver como crearmodelos de contenido ms avanzados que los que permitan los DTD. Para ello podemos usar los siguientes tipos de declaraciones: <sequence> <choice> <group> <all>

Empecemos con <sequence>

DECLARACIONES <SEQUENCE>
Como vimos con los DTD, especificar un modelo de contenido usando unasecuencia de elementos es muy simple. De hecho, esta etiqueta ha ido apareciendo por los diferentes esquemas que hemos visto. <sequence> soporta los atributos "minOccurs" y "maxOccurs", y creo que no tengo que decir para qu, No? <sequence> puede contener: declaraciones <element>, comodines de elementos, declaraciones <choice>, referencas a <group> y otras declaraciones <sequence> Se pueden tener secuencias dentro de secuencias que estn dentro de secuencias, o se puede tener varias <choices> dentro de secuencias que estn dentro de grupos (casi cualquier combinacin que se nos ocurra). Un ejemplo puede ser el siguiente: <sequence> <element name="nombre" type="string" minOccurs="1" maxOccurs="unbounded"/> <element name="apellido1" type="string" minOccurs="1" maxOccurs="1"/> <element name="apellido2" type="string" minOccurs="1" maxOccurs="1"/> </sequence> Segn la declaracin anterior, la siguiente instancia sera correcta: <nombre> Juan </nombre> <apellido1> Garca </apellido1> <apellido2> Rodrguez </apellido2>

Sin embargo la siguiente instancia sera incorrecta:

<apellido1> Garca </apellido1> <nombre> Juan </nombre> <apellido2> Rodrguez </apellido2> por el hecho de que aparecen en distinto orden. Actividad 1. Crea un esquema para la siguiente instancia: <Personas> <Persona> <nombre> Linux </nombre> <apellido> Torvalds </apellido> <descripcin> Creador del kernel de GNU/Linux </descripcin> </Persona> <Persona> <nombre> Alan </nombre> <apellido> Cox </apellido> <descripcin> Programador implicado en el kernel de GNU/Linux </descripcin> </Persona> <Persona> <nombre> Richard </nombre> <apellido> Stallman </apellido> <descripcin> Iniciador del proyecto GNU </descripcin> </Persona> </Personas> Actividad 2.Reestructura el ejercicio anterior, para que el tipo de "Persona" est definido globalmente. Actividad 3. Reestructura el ejercicio anterior, de modo que ahora definas globalmente los elementos "nombre", "apellido" y "descripcin".

You might also like