A continuación de describen otros elementos de la especificación del W3C que pueden ser empleados en la definición de un Schema.
<xsd:annotation>
Representa un elemento opcional de nivel raíz ("top level") empleado para colocar comentarios generales sobre un Schema, el término nivel raíz ("top level") se refiere a que éste debe ser colocado inmediatamente después del elemento <xsd:schema>
.
Anidado dentro de <xsd:annotation>
deben estar los elementos <xsd:appInfo>
y <xsd:documentation>
que definen los comentarios en sí, el uso de estos elementos es descrito en la siguiente tabla :
Sintaxis | Funcionamiento | Atributo(s) más comun(es) |
---|---|---|
<xsd:appInfo atributos > | Empleado para definir comentarios en forma de texto para acerca de la aplicación que utilizará el Schema. |
|
<xsd:documentation atributos> | Empleado para definir comentarios en forma de texto para el Schema. |
|
El siguiente fragmento ilustra el uso de los elementos antes mencionados :
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsd:annotation> <xsd:appInfo> Agenda Personal </xsd:appInfo> <xsd:documentation> Permite solo valores únicos de Agenda Verifica la validez del números telefónicos Restringe edades menores a 18 y mayores a 65 </xsd:documentation> </xsd:annotation> ... ... ... ... </xsd:schema> |
<xsd:element>
El elemento <xsd:element>
es uno de los más utilizados dentro de un Schema ya que define las sintaxis que debe cumplir cada elemento de un documento XML, sin embargo, además de los elementos mencionados en el ejemplo anterior posee otra serie de elementos que pueden ser anidados en su estructura para definir restricciones más complejas.
<xsd:any>
<xsd:element name="persona"> <xsd:complexType> <xsd:sequence> <xsd:element name="nombrecompleto"/> <xsd:any/> </xsd:sequence> </xsd:complexType> </xsd:element> |
A través de <xsd:any>
se puede indicar la presencia de cualquier tipo de elemento; el fragmento anterior indica que dentro del elemento persona
una vez que se encuentre el elemento nombrecompleto
puede existir cualquier elemento adicional.
<xsd:anyAttribute>
<xsd:element name="persona"> <xsd:complexType> <xsd:sequence> <xsd:element name="nombrecompleto"/> </xsd:sequence> <xsd:anyAttribute/> </xsd:complexType> </xsd:element> |
Através de <xsd:anyAttribute>
se puede indicar la presencia de cualquier atributo dentro de un elemento; el fragmento anterior indica que dentro del elemento persona
puede existir cualquier tipo de atributo.
<xsd:choice>
<xsd:element name="ubicacion"> <xsd:complexType> <xsd:choice> <xsd:element ref="ciudad"/> <xsd:element ref="municipio"/> </xsd:choice> </xsd:complexType> </xsd:element> |
Mediante <xsd:choice>
se puede especificar una lista de elementos alternativos para incluirse en determinado elemento ; el fragmento anterior indica que dentro del elemento ubicacion
debe existir un elemento llamado ciudad
o municipio
.
Al nivel de caracteres /contenido que es el nivel más refinado que puede restringir un Schema, también existen otra serie de estructuras pre-definidas adicionales al elemento <xsd:string>
mencionado en el ejemplo anterior :
La siguiente tabla describe las diversas declaraciones disponibles para restringir elementos de fechas, así como un ejemplo de cada uno.
<!-- Define una fecha con format YYYY-MM-DD donde : YYYY - año MM - mes DD - día --> <xsd:element name="envio" type="xsd:date"/> <envio>2004-02-24</envio> <!-- Define una hora con format HH:MM:SS donde : HH - hora (00-24) MM - minuto DD - segundo --> <xsd:element name="hora" type="xsd:time"/> <hora>11:35:00</hora> <!-- Define una fecha y hora compuesta dividida por la letra T --> <xsd:element name="cronometro" type="xsd:dateTime"/> <cronometro>2004-02-24T11:27:00</cronometro> |
La siguiente tabla describe las diversas declaraciones disponibles para restringir valores numéricos, así como un ejemplo de cada uno.
<!-- Restringe un valor a un numero decimal --> <xsd:element name="efectivo" type="xsd:decimal"/> <efectivo>75.50</efectivo> <!-- Restringe un valor a un numero entero --> <xsd:element name="manzanas" type="xsd:integer"/> <manzanas>7</manzanas> |
La siguiente tabla describe otras declaraciones disponibles para restringir diversos valores, así como un ejemplo de cada uno.
<!-- Define un valor de tipo boolean verdadero o falso ( |
<xsd:simpleType>
y <xsd:complexType>
)
Además de los tipos de datos pre-definidos descritos anteriormente, también es posible definir secuencias especificas de elementos XML através de los elementos <xsd:simpleType>
y <xsd:complexType>
.
Aunque el ejemplo anterior de Schemas describió el uso de estos elementos, existen otra serie de estructuras que pueden ser definidas para lograr generar restricciones más complejas, las cuales son descritas a continuación :
<xsd:group>
<xsd:group name="elementosPersona"> <xsd:sequence> <xsd:element ref="nombrecompleto"/> <xsd:element ref="correo" minOccurs="0" maxOccurs="unbounded"/> <xsd:element ref="ubicacion"/> <xsd:element ref="telefono" minOccurs="0" maxOccurs="2"/> <xsd:element ref="clasificacion"/> <xsd:element ref="edad"/> </xsd:sequence> </xsd:group> <xsd:complexType name="datosDePersona"> <xsd:group ref="elementosPersona"/> <xsd:attribute name="id" type="xsd:integer" use="required"/> <xsd:attribute name="visible" type="xsd:boolean" use="optional"/> </xsd:complexType> <xsd:element name="persona" type="datosDePersona"/> |
Mediante <xsd:group>
es posible pre-definir un grupo de elementos para ser empleados en otro elemento <complexType>
o <simpleType>
; el fragmento anterior indica que el tipo de dato datosDePersona
debe incluir los elementos del grupo llamado elementosPersona
así como los 2 atributos descritos, posteriormente se define que el elemento <persona>
debe cumplir con las características del tipo de dato (complexType
) datosDePersona
.
<xsd:attributeGroup>
<xsd:attributeGroup name="caracteristicas"> <xsd:attribute name="serie" type="xsd:integer"/> <xsd:attribute name="disponible" type="xsd:boolean"/> </xsd:attributeGroup> <xsd:complexType name="producto"> <xsd:attributeGroup ref="caracteristicas"/> </xsd:complexType> |
Através de <xsd:attributeGroup>
es posible pre-definir un grupo de atributos para ser empleados al declarar un elemento <complexType>
o <simpleType>
; el fragmento anterior indica que el tipo de dato producto
debe incluir los atributos definidos en el grupo caracteristicas
.
<xsd:extension>
, <xsd:simpleContent>
y <xsd:complexContent>
Mediante el elemento <xsd:extension>
es posible crear un tipo nuevo de secuencia a partir de un elemento <xsd:simpleType>
o <xsd:complexType>
existente, lo anterior permite ajustar ciertas secuencias para casos específicos sin la necesidad de crear un nuevo elemento simpleType
o complexType
.
Los elementos <xsd:simpleContent>
y <xsd:complexContent>
son utilizados en conjunción de <xsd:extension>
al momento de generar la nueva secuencia.
<xsd:simpleType name="formatoclasificacion"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Trabajo"/> <xsd:enumeration value="Familia"/> <xsd:enumeration value="Personal"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="formatonuevo"> <xsd:simpleContent> <xsd:extension base="formatoclasificacion"> <xsd:attribute name="clasificado" type="xsd:date"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> |
En la declaración anterior una vez descrito el tipo de dato (simpleType
) llamado formatoclasificacion
se declara un tipo de dato (complexType
) llamado formatonuevo
, éste último extiende el comportamiento del tipo de dato formatoclasificacion
agregando un atributo adicional a su estructura, nótese el uso de los elementos <xsd:simpleContent>
y <xsd:extension>
.
<xsd:complexType name="residencia"> <xsd:choice> <xsd:element ref="ciudad"/> <xsd:element ref="municipio"/> </xsd:choice> </xsd:complexType> <xsd:complexType name="residenciacompleta"> <xsd:complexContent> <xsd:extension base="residencia"> <xsd:sequence> <xsd:element name="direccion" type="xsd:string"/> <xsd:element name="pais" type="xsd:string"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> |
El fragmento anterior define un tipo de dato (complexType
) llamado residencia
, para posteriormente extender su funcionamiento através del tipo de dato residenciacompleta
agregando una secuencia adicional, nótese el uso de los elementos <xsd:complexContent>
y <xsd:extension>
.
<xsd:list>
<xsd:simpleType name="precios"> <xsd:list itemType="xsd:decimal"/> </xsd:simpleType> <xsd:element name="historiaprecios" type="precios"> <historiaprecios> 5.32 6.23 6.86 7.01 </historiaprecios> <xsd:simpleType name="valuelist"> <xsd:list itemType="xsd:string"/> </xsd:simpleType> <xsd:element name="nombres" type="valuelist"> <stringvalues> Andrea Bertha Carla Daniela Esther </stringvalues> |
Mediante <xsd:list>
es posible definir que un tipo de dato simpleType
que cumpla con la características de una lista; el fragmento anterior demuestra la definición de dos tipos de datos (simpleType
) uno para una lista de números decimales y otro para una lista de String's, ambas declaraciones les sigue la posible definición del elemento en XML .
<xsd:redefine>
<!-- Agenda.xsd --> <?xml version="1.0"?> <xsd:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="datospersonales"> <xsd:sequence> <xsd:element name="nombre"/> <xsd:element name="apellido"/> </xsd:sequence> </xsd:complexType> <xsd:element name="customer" type="pname"/> </xsd:schema> <!-- AgendaNueva.xsd --> <?xml version="1.0"?> <xsd:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsd:redefine schemaLocation="Agenda.xsd"> <xsd:complexType name="datospersonales"> <xsd:complexContent> <xsd:extension base="datospersonales"> <xsd:sequence> <xsd:element name="direccion"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:redefine> </xsd:schema> |
Mediante <xsd:redefine>
es posible redefinir determinado tipo de dato para que adopte otro comportamiento, este mecanismo es similar a <xsd:extension>
con la diferencia que el elemento es extraído de otro Schema; el fragmento anterior extrae los valores del Schema Agenda.xsd
y modifica el tipo de dato (complexType
) datospersonales
para tener un comportamiento distinto al Schema original.
<xsd:union>
<xsd:simpleType name="volumen"> <xsd:restriction base="xsd:decimal"> <xsd:minInclusive value="0.25"/> <xsd:maxInclusive value="5.00"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="tamaño"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="individual"/> <xsd:enumeration value="regular"/> <xsd:enumeration value="familiar"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="refresco"> <xsd:simpleType> <xsd:union memberTypes="volumen tamaño" /> </xsd:simpleType> </xsd:element> |
Mediante <xsd:union>
es posible definir un nuevo tipo de datos (simpleType
) a partir de la unión de otros dos tipo de datos (simpleType
) ; el fragmento anterior define un tipo de dato llamado refresco
que puede tomar como valores todos aquellos definidos en el tipo de dato volumen
o tamaño
.
<xsd:restriction>
)
Finalmente, vale mencionar que en conjunción de los tipos de datos pre-definidos y aquellos compuestos por <xsd:simpleType>
y <xsd:complexType>
existe la posibilidad de refinar aun más sus estructuras através del elemento <xsd:restriction>
.
A continuación se describen diversos usos del elemento <xsd:restriction>
seguido de su respectiva explicación.
<xsd:element name="letra"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="[a-z]"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="algebra"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="[xyz]"/> </xsd:restriction> </xsd:simpleType> </xsd:element> |
El elemento letra
se encuentra restringido a un carácter encontrado entre la letra a
o z
, mientras el elemento algebra
define una restricción también de un carácter, solo que limitado a las letras x
, y
o z
.
<xsd:element name="idioma"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="ingles|español"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="temperatura"> <xsd:simpleType> <xsd:restriction base="xsd:decimal"> <xsd:minInclusive value="-10"/> <xsd:maxInclusive value="120"/> </xsd:restriction> </xsd:simpleType> </xsd:element> |
El elemento idioma
se restringe a los valores ingles
o español
, mientras el elemento temperatura
debe cumplir con un rango numérico comprendido entre -10
y 120
inclusive.
Como fue mencionado en la exposición del Schema anterior, el valor asignado al elemento <xsd:pattern>
representa un Regular Expression, sintaxis típicamente empleada en diversos lenguajes de programación para describir secuencias de caracteres.
template
, XPath, Condicionales y Ciclos en XSL.