Elementos empleados en XML Schemas

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.
  • source : Define una ubicación alterna que contiene información (URI )
<xsd:documentation atributos> Empleado para definir comentarios en forma de texto para el Schema.
  • source : Define una ubicación alterna que contiene información (URI )
  • xml:lang : Declara el idioma en la que esta definido el comentario (valor) [Casi nunca especificado]

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>
Otros elementos de <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 .

Tipos de Datos (Pre-Definidos)

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 :

Fechas

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>



Números

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>


Otros Datos

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 (true o false)  -->

             <xsd:attribute name="disponible" type="xsd:boolean"/>

             <producto disponible="true">Equipo de Computo</producto>


    <!--  Define un valor de tipo URI/URL     -->


             <xsd:attribute name="direccion" type="xsd:anyURI"/>

             <sitio direccion="http://www.osmosislatina.com/" />



Tipos de Datos (<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 .

Restricciones a Datos (<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.

Menú Curso

XML y sus Orígenes

Manipulación y Proceso de XML

DOM, SAX y JDOM

Namespaces, Schemas y DTD's

XSL: XSLT, XPath y TraX

XMLRPC y SOAP (Web Services)

Diseño con XMLRPC

Diseño con SOAP .

Apéndice "A" (Procesando XML con parsers).

Apéndice "B" (Validando XML con Schemas y DTD's).

Apéndice "C" (XSL: XPath y "XSL Stylesheets").

Apéndice "D" (XMLRPC: Diseño).

Apéndice "E" (SOAP, WSDL, UDDI y WSIL : Diseño).