Sigueme por RSS! RSS

Repasando el XML


01 - Introducción.
02 - Estructura.
03 - Normas básicas para que los documentos sean válidos.
04 - La estructura clásica DTD (definición de tipo de documento).
05 - XML Schema Definition (XSD ó definición de esquemas XML).
06 - Secciones CDATA (Character Data).
07 - El estilo en los documentos XML.
08 - Los comentarios.
09 - Validación de un documento XML.
10 - Generar XSD a partir de un XML.
11 - Paradigma de la entrada (XML + XSD + CSS) perfectamente validado.



01 - Introducción.

XML (lenguaje de etiquetas extendido) es una tecnología (no un lenguaje de programación) desarrollada por la w3c (World Wide Web Consortium) con el que podemos definir nuestro propio lenguaje de presentación, es extensible, lo que significa que podemos  seguir agregando etiquetas aun cuando ya se encuentra en producción y sin ninguna clase de problemas.

A diferencia del HTML, XML no se centra en la representación de la información, si no, en la información en si misma, garantiza que los datos sean independientes de aplicaciones o de fabricantes.



02 - Estructura
(clic para mostrar/ocultar).

La estructura de un XML es muy similar a la de un documento HTML, con la diferencia de que en el primero podemos crear las etiquetas y atributos que queramos, lo que ofrece flexibilidad para organizar la información.

Un documento XML está formado por el prólogo y por el cuerpo del documento.

- El prólogo es opcional, puede contener la versión, codificación del documento, el DTD (definición de tipo de documento), etc.

- El cuerpo es obligatorio, debe contener solo un elemento raíz, una de las normas para que el documento este bien formado, sea válido.

A continuación un ejemplo de la estructura de un documento XML (nuestro documento de ejemplo).
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cursos>
  <curso id="a">
   <alumno dni="6432123">
     <nombre>Maria</nombre>
     <apellido>Bolivar</apellido>
     <fecha-nac>25/12/1990</fecha-nac>
     <sexo>Femenino</sexo>
   </alumno>
   <alumno dni="9544321">
     <nombre>José</nombre>
     <apellido>García</apellido>
     <fecha-nac>12/02/1991</fecha-nac>
     <sexo>Masculino</sexo>
   </alumno>
   <alumno dni="15456737">
     <nombre>Angelica</nombre>
     <apellido>Peña</apellido>
     <fecha-nac>06/08/1989</fecha-nac>
     <sexo>Femenino</sexo>
   </alumno>
  </curso>
</cursos>

Las etiquetas son elementos que empiezan y terminan con los símbolos mayor ">" y menor "<" que, de la siguiente manera: <nombre>, donde nombre es el nombre del elemento. Podemos tener elementos con contenidos y elementos vacíos.

Un elemento con contenido debe tener etiqueta de inicio y cierre, ejemplo:
<etiqueta>contenido</etiqueta>

Los elementos vacíos se caracterizan por no tener contenido entre etiquetas de inicio y fin, pero se debe indicar que es de ese tipo colocando una barra invertida "/" al final de la misma, ejemplo:
<etiqueta />

Los atributos permiten establecer o asignar características o propiedades a los elementos de un documento, ejemplo:
<etiqueta atributo='valor'/>

Es recomendable que los documentos comiencen con una línea que describa la versión de XML, el tipo de documento, etc.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  

En ella se declara que estamos ante un documento XML, se le puede asignar varios atributos algunos obligatorios (*) y otros no:
versión (*): indica la versión de XML usada en el documento.
encoding: indica la forma en que se ha codificado el documento (UTF-8, ISO-8859-7, etc.).
standalone: indica si el documento es independiente de un DTD (yes ó no)(se explica más abajo).



03 - Normas básicas para que los documentos sean válidos
(clic para mostrar/ocultar).

XML especifica unas normas básicas a nivel de sintaxis que se deben cumplir por todos aquellos documentos con intención de denominarse XML válidos,  documentos bien formados.

Las características básicas exigidas, son:

3.1 - las etiquetas deben seguir un orden jerárquico, esto implica que se encuentren bien situadas y que cada una de ellas tenga su etiqueta de cierre.

ejemplo de etiquetas mal anidadas:
<alumno><nombres></alumno></nombres>
La forma correcta sería:
<alumno><nombres></nombres></alumno>

3.2 - Los documentos XML sólo permiten un elemento inicial, padre/raíz del que todos los demás sean parte.
ejemplo incorrecto:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<curso id="a">
   contenido ...
</curso>
<curso id="b">
   contenido ...
</curso>

forma correcta
<?xml version="1.0"?>
<cursos>
   <curso id="a">
      contenido..   
   </curso>
   <curso id="b">
      contenido...   
   </curso>
</cursos>

3.3 - Los valores de los atributos siempre deben estar encerrados entre comillas simples o dobles.

forma incorrecta:
<alumno dni=15456737>
forma correcta:
<alumno dni="15456737">

3.4 - El XML es case sensitive, es decir, es sensible a mayúsculas y minúsculas, toma por ejemplo la vocal "A" y "a" como caracteres diferentes.

forma incorrecta:
<Apellido>García</apellido>
devolvería un error similar a:
Error de lectura XML: etiqueta sin pareja. Esperado: </Apellido>

forma correcta: la etiqueta con el mismo nombre tanto de apertura como de cierre.
<apellido>García</apellido>

Si necesitamos usar ciertos caracteres dentro de los elementos sin que el procesador los interprete como lo contrario a lo que buscamos conseguir, XML define algunas entidades para representar caracteres especiales:
EntidadCaracter
&amp;&
&lt;<
&gt;>
&apos;'
&quot;"

Dos tipo, dobles --&gt; &quot; &amp; simple --&gt; &apos;

Se verá así:
Dos tipo, dobles --> " & simple --> '

Ora forma de usar caracteres especiales sin que sean interpretados por el procesador, es usar secciones CDATA (se explica abajo).

3.5 - las etiquetas sin contenidos deben tener el formato <nombre-etiqueta />

forma incorrecta:
<hr>
forma correcta:
<hr />

3.6 - Al momento de asignar el nombre a los elementos no podemos usar caracteres no alfabéticos, acentuados o espacios en blanco (para separar), excepto, números, guiones y puntos, siempre que no se empiece por ninguno de ellos.

forma incorrecta:
<2da-guia>abcd</2da-guia>
forma correcta:
<guia-2.2>abcd</guia-2.2>



04 - La estructura clásica DTD (definición de tipo de documento)
(clic para mostrar/ocultar).

Es un estándar que permite especificar qué elementos pueden existir en un documento XML, así como, atributos, elementos contenidos en otros elementos, la jerarquía de los mismos, etc.

En la DTD debemos ir definiendo el árbol de etiquetas que usaremos y en orden jerárquico, en nuestro XML de ejemplo la etiqueta <cursos> es nuestro elemento padre, tiene varios elementos hijos <curso> que a su vez tienen descendientes y así sucesivamente, eso debemos detallarlo.

Existen una serie de símbolos y elementos que se usan a la hora de armar una DTD:

- el texto ELEMENT se usa para definir un elemento, ejemplo:
<!ELEMENT nombre-elemento (contenido)>

- los elementos vacíos se declaran empleando la categoría EMPTY.
<!ELEMENT nombre-elemento EMPTY>

- los paréntesis permiten incluir sub etiquetas.
- si un elemento es destinado sólo a datos alfanuméricos se declara usando la cadena de caracteres #PCDATA entre paréntesis.
<!ELEMENT nombre-elemento (#PCDATA)>

- si un elemento es destinado para contener cualquier combinación de datos, se usa la cadena ANY.
<!ELEMENT nombre-elemento ANY>

- si un elemento tiene uno o más elementos hijos se declaran dejandolos entre paréntesis, separados por coma y en el mismo orden en que aparecerán en el documento.
<!ELEMENT alumno (nombre,apellido,sexo)>

luego hay que declararlos por separado especificando su tipo de contenido:
<!ELEMENT alumno (nombre,apellido,sexo)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellido (#PCDATA))>
<!ELEMENT sexo (#PCDATA)>

Podemos indicar cuantas veces aparece cada elemento hijo dentro de un elemento padre, para ello usamos los caracteres (+,*,?):
- si no usamos ningún caracter estaremos indicando que el elemento hijo aparece una sola vez:
<!ELEMENT cursos (curso)>

- si usamos el carácter + estaremos indicando que el elemento hijo aparecerá una o mas veces:
<!ELEMENT cursos (curso+)>

- si usamos el carácter * estaremos indicando que el elemento hijo aparecería cero o más veces:
<!ELEMENT cursos (curso+)>

- si usamos el carácter ? estaremos indicando que el elemento hijo aparecerá opcionalmente una sola vez.
<!ELEMENT cursos (curso?)>

- si usamos queremos indicar que un elemento padre puede tener elementos hijos y/o datos, lo hacemos de la siguiente manera:
<!ELEMENT cursos (#PCDATA curso)*>

Un elemento puede tener atributos, dentro del DTD se pueden declarar usando el elemento ATTLIST.
<!ATTLIST nombre-del-elemento nombre-del-atributo tipo-de-dato valor-por-defecto>

Para conocer que valores se pueden incluir en los parámetros tipo-de-dato y valor-por-defecto hay que chequear acá.

El DTD puede estar definido de dos formas, incluida dentro de nuestro archivo XML o desde un archivo externo, para la primera lo haríamos de la siguiente manera:
<!DOCTYPE nombre-de-la-DTD [
... aquí la definición correspondiente
]>

Y para incluirla desde un archivo externo, basta con agregar la instrucción DOCTYPE al principio de nuestro documento XML vinculando al archivo DTD externo.
<!DOCTYPE cursos SYSTEM "cursos.dtd">

La ventaja de incluirla desde un archivo externo, es que puede ser usada por mas de un documento.

La DTD es usado mucho para mantener la consistencia entre los documentos que utilicen la misma definición, sin embargo, éste tiene sus limitaciones y como alternativa tenemos el XML Schema.



05 - XML Schema definition (XSD ó definición de esquemas XML).
(clic para mostrar/ocultar).
XML Schema es un lenguaje de esquema escrito en XML, basado en la gramática y pensado para proporcionar una mayor potencia expresiva que las DTD, menos capaces al describir los documentos a nivel formal.

El XSD es similar a una DTD, es una mejora que aparece para ir más allá de las limitaciones de las DTD. No es indispensable pero simplifica la programación y ayuda a validar un documento XML.

Entre sus características:

- su sintaxis es similar a la de XML.
- los esquemas son extensibles a futuras incorporaciones.
- los esquemas son más ricos y más poderosos que las DTD.
- los esquemas se escriben en XML.
- se definen los elementos, atributos que pueden aparecer en un documento, así como, qué elementos son los elementos secundarios, el orden, el número, etc.
- define si un elemento está vacío o puede incluir texto.
- define los tipos de datos de elementos y atributos (integer, bolean, string, date, etc.).
- define los valores por defecto y fijos para elementos y atributos.
- permite el uso de namespaces, básicamente, estos permiten definir elementos con igual nombre dentro del mismo contexto, siempre y cuando se anteponga un prefijo al nombre del elemento.
- permite definir elementos globales y locales.

Resumiendo, con XML Schema podemos tener más control sobre los contenidos de un documento XML.

El elemento <schema> es el elemento raíz de todos los XML Schema.
<?xml version="1.0"?>
<xs:schema>
...
...
</xs:schema>

El elemento <schema> puede tener varios atributos, ejemplo:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://sitio.com"
xmlns="http://www.sitio.com"
elementFormDefault="qualified">
...
...
</xs:schema>

La línea:
xmlns:xs="http://www.w3.org/2001/XMLSchema"

indica que los elementos y tipos de datos utilizados en el esquema provienen del namespace predefinido "http://www.w3.org/2001/XMLSchema", donde ya están definidos los elementos (schema, element, complexType, sequence, string, boolean, etc.) y que los elementos y tipos de datos que provienen del mismo sitio deben llevar el prefijo xs.

El Namespace es un identificador que permite agrupar un conjunto de nombres de atributos y elementos, permitiendo distinguir entre dos o más campos con el mismo nombre.

la línea:
targetNamespace="http://sitio.com"

indica el namespace que va a ser utilizado para los elementos y de donde provienen.

la línea:
xmlns="http://www.sitio.com"

indica que el namespace por defecto es "http://sitio.com". Es decir, le dice al esquema de validación que todos los elementos utilizados en este documento XML se declaran en "http://sitio.com".

la línea:
elementFormDefault="qualified"

indica que todos los elementos utilizados por la instancia XML del documento que se declaró en este esquema, deben ser namespace calificados.

Podemos incluir una referencia en nuestro documento XML a un XML Schema, ejemplo:
<?xml version="1.0"?>
<cursos xmlns="http://sitio.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="cursos.xsd">

<curso>
...
</curso>
</cursos>

la línea:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

indica que queremos utilizar los elementos definidos en http://www.w3.org/2001/XMLSchema-instance.

la línea:
xsi:schemaLocation="cursos.xsd"

indica que vamos a usar ese fichero que contiene el xml Schema definition  (cursos.xsd), pero sin asociar un namespace a esas definiciones. Sin esta línea, no tendremos esquema de validación.

Los documentos xml Schema definition se guardan con extensión XSD.

- Elementos: se puede hacer uso de varios tipos de elementos.


El elemento complexType define un tipo complejo. Un elemento de tipo complejo es un elemento XML que contiene otros elementos y / o atributos.

Un elemento simple es un elemento XML que contiene sólo texto. No puede contener otros elementos o atributos. La sintaxis es la siguiente:
<xs:element name="nombre" type="tipo"/>

donde nombre es la denominación del elemento y tipo algunos de los siguientes datos:
Tipo de datos de ámbito local:
  • xs:string
  • xs:boolean
  • xs:date
  • xs:dateTime
  • xs:gDay
  • xs:gMonth
  • xs:gYear
  • xs:time
  • xs:byte
  • xs:decimal
  • xs:int
  • xs:integer
  • xs:long
  • xs:negativeInteger
  • xs:positiveInteger
Ejemplos:
<xs:element name="nombre" type="xs:string"/>
<xs:element name="edad" type="xs:integer"/>
<xs:element name="fecha-nac" type="xs:date"/>

Tipo de datos de ámbito global: definidos por el usuario.
<xs:element name="nombre" type="alfa"/> 
<xs:element name="apellido" type="alfa"/>
 
<xs:simpleType name="alfa">
  <xs:restriction base="xs:string">
    <xs:minLength value='3'/>
    <xs:maxLength value='8'/>
  </xs:restriction>
</xs:simpleType>

restriction: se explicara mas adelante.

Podemos asignar valores por defectos para nuestros elementos:
<xs:element name="cantidad" type="xs:decimal" default="0"/>

- Atributos:

Para definir atributos lo haríamos así:
<xs:attribute name="nombre" type="tipo" default="valor_por_defecto"/>

indicamos el nombre del atributo y el tipo de datos que puede ser alguno de los mencionados anteriormente.

Se puede indicar que el atributo tendrá un valor fijo que no debe cambiar, eso lo hacemos usando la propiedad "fixed":
<xs:attribute name="id" type="xs:string" fixed="a"/>

Los atributos son opcionales por defecto. Para especificar que el atributo es necesario / obligatorio, se usa el valor "required" para el atributo "use":
<xs:attribute name="dni" type="xs:string" use="required"/>

- Restricciones:

Limitando el mínimo y máximo de valores de un elemento usando "minInclusive" y "maxInclusive":
<xs:element name="total">
  <xs:simpleType>
     <xs:restriction base="xs:integer">
        <xs:minInclusive value="0"/>
        <xs:maxInclusive value="1000"/>
     </xs:restriction>
  </xs:simpleType>
</xs:element>

En este ejemplo estaríamos limitando el valor mínimo y máximo del elemento "total" que estará entre (0 y 1000).

Si quisiéramos limitar a que un elemento acepte solo una serie de valores, usamos "enumeration":
<xs:element name="Operadoras">
  <xs:simpleType>
     <xs:restriction base="xs:string">
        <xs:enumeration value="Digitel"/>
        <xs:enumeration value="Movilnet"/>
        <xs:enumeration value="Movistar"/>
     </xs:restriction>
  </xs:simpleType>
</xs:element>

También podríamos separar las restricciones para que puedan ser usadas por mas de un elemento, ejemplo:
<xs:element name="primernombre" type="namelist"/> 
<xs:element name="segundonombre" type="namelist"/>
 
<xs:simpleType name="namelist">
   <xs:restriction base="xs:string">
      <xs:enumeration value="Julia"/>
      <xs:enumeration value="María"/>
      <xs:enumeration value="Ana"/>
...

En este caso la restricción "namelist" puede ser usada por otro elemento al no pertenecer a "nombres".

Restricciones con patrones: podemos usar expresiones regulares para las restricciones de la siguiente manera:
<xs:element name="usuario">
  <xs:simpleType>
     <xs:restriction base="xs:string">
        <xs:pattern value="PATRON"/>
...

Donde "PATRON" puede ser:

[a-z] --> se indica que solo se aceptan letras minúsculas de la letra A a la Z.
[a-zA-Z] --> solo se aceptan letras de la A a la Z sean minúsculas o mayúsculas.
[A-Z][A-Z] --> solo se aceptan dos (2) letras mayúsculas.
[AEIOU] --> solo se aceptan vocales mayúsculas.
[5-9] --> solo se aceptan números del 5 al 9.
[0-9][0-9][0-9] --> solo tres (3) dígitos del 0 al 9.
([a-z])* --> se aceptan cero o más apariciones de letras de la A a la Z minúsculas.
([a-z][A-Z])+ --> se aceptan uno o mas pares de letras conformadas de la siguiente manera: la primera minúscula y la segunda mayúscula.
Masculino|Femenino --> solo se aceptan los valores masculino y femenino.
[a-zA-Z0-9]{8} --> debe haber exactamente ocho caracteres en una fila y los caracteres deben ser letras minúsculas o mayúsculas de A a Z, o un número del 0 al 9.
[a-zA-Z_ ÑÁÉÍÓÚÄËÏÖÜñáéíóüäëïöü']+ --> uno o más caracteres de la A a la Z sea minúscula o mayúscula, así como, eñes, vocales acentuadas, diéresis, apóstrofo, guión bajo y espacios.

y más posibilidades que dependerá de los requerimientos.

Evitando que el procesador XML elimine espacios en blanco en un campo que los necesita, como "direccion":
<xs:element name="direccion">
  <xs:simpleType>
     <xs:restriction base="xs:string">
        <xs:whiteSpace value="preserve"/>
...

Si usamos "whiteSpace" y le asignamos como valor "replace", el procesador XML reemplazará todos los espacios en blanco (saltos de línea, tabulaciones, espacios y retornos de carro) con espacios:
<xs:whiteSpace value="replace"/>

Si le asignamos el valor "collapse", se eliminaran todos los espacios en blanco ( saltos de línea , tabulaciones, espacios , retornos de carro se reemplazan por espacios , espacios iniciales y finales se eliminan y múltiples espacios se reducen a un solo espacio ):
<xs:whiteSpace value="collapse"/>

Para limitar el numero de caracteres de un elemento, podemos usar "length", para este caso deben ser exactamente ocho caracteres.
<xs:length value="8"/>

Si quisieramos asignar un minimo y un maximo de caracteres, usamos "minLength" y "maxLength":
<xs:minLength value="6"/>
 <xs:maxLength value="15"/>

- Indicadores

Podemos controlar cómo los elementos se van a utilizar en los documentos con los indicadores.

<sequence>" indica que el contenido del mismo se mostrara en el orden establecido:
<xsd:sequence>
   .. elemento 1
   .. elemento 2
   .. elemento N
</xsd:sequence>

<all> especifica que los elementos secundarios pueden aparecer en cualquier orden, y que cada elemento secundario debe ocurrir sólo una vez.

<choice> especifica que cualquier elemento secundario de una u otra puede ocurrir.

<any> nos permite extender el documento XML con elementos no especificados por el esquema.

<union> permite enlazar los valores de los tipos de componentes, podemos hacer que un elemento se rija bajo restricciones separadas.

<xs:simpleType name='clave'>
   <xs:union>
     <xs:simpleType>
       <xs:restriction base='xs:string'> 
  <xs:pattern value='[0-9]{15}'/>
      </xs:restriction> 
     </xs:simpleType>

     <xs:simpleType>
       <xs:restriction base='xs:NMTOKEN'> 
  <xs:enumeration value='AND'/>
  <xs:enumeration value='NAD'/>
      </xs:restriction> 
     </xs:simpleType>
   </xs:union>
</xs:simpleType>

maxOccurs especifica el número máximo de veces que un elemento puede aparecer; mientras que <minOccurs> especifica el número mínimo:

<xsd:element name="movil" type="xsd:string" minOccurs="1" maxOccurs="6" />

Para permitir que un elemento aparezca un número ilimitado de veces, lo declaramos como "maxOccurs='unbounded'".

mixed define que un elemento es de tipo compuesto, es decir, que puede contener texto, otros elementos, atributos, etc.
<xs:element name="direccion">
  <xs:complexType mixed="true"> 
...



06 - Secciones CDATA (Character Data).
Cuando armamos un documento XML al leer el contenido de un elemento, resulta tedioso tener que convertir las entidades a su correspondiente significado, los bloques CDATA nos permiten evitar esta situación.

Dentro de una sección CDATA podemos colocar los caracteres que queramos siempre y cuando estén en el rango de caracteres permitidos para el contenido de un XML.

La sintaxis es la siguiente:

<![CDATA[ esto es un ejemplo, mira! puedo usar estos caracteres <o.O> ]]>

Comienza con la cadena <![CDATA[ y termina con ]]>, es necesario resaltar que las secciones CDATA no pueden anidar a otra, es decir, no podemos incluir secciones dentro de secciones.

<nombre>Angelica
<![CDATA[ </aqui puedo poner lo que quiera/>
</// atributo=incluso si no respeta las reglas del XML>]]>
</nombre>



07 - El estilo en los documentos XML

Es posible utilizar CSS para dar formato a un documento XML, asignar estilo a la presentación, basta con incluir el archivo de la siguiente manera:

<?xml-stylesheet type="text/css" href="estilo.css"?>

Donde estilo.css es el archivo que almacena las reglas de presentación para nuestro documento XML.

En el archivo CSS debemos especificar la regla de presentación para cada una de las etiquetas, la aplicación del mismo dependerá de como queremos mostrarlo:

nombre-etiqueta {propiedad:valor; ...}

Por ejemplo, si queremos que la etiqueta <cursos> tenga cierto color de fondo y dimensión:

cursos {
   width:100%;
   background-color:#ddd;
}



08 - Los comentarios.
El uso de comentarios en XML es similar a como lo usamos en HTML.

<!-- esto es un comentario ... -->



09 - Validación de un documento XML.

Un documento XML es válido si se compone de elementos, atributos y comentarios como se especifica que se escriban.

Para asegurarnos de que nuestro documentos están correctos, podemos hacer uso de algún validador XML online, que te permite hacer la verificación con o sin la DTD.

Validadores online:
http://tools.decisionsoft.com/schemaValidate (recomendado)
http://www.xmlvalidation.com
http://www.xmlforasp.net/SchemaValidator.aspx



10 - Generar XSD a partir de XML.

Como lo vimos anteriormente, los archivos con extensión XSD son esquemas XML cuyo propósito es definir la estructura de un documento de tipo Extensibe Markup Language, al igual que una DTD.

XML Hit Software es un servicio on-line de hitsw.com que permite generar XSD al instante, requiriendo solo el documento XML. El acceso es gratuito y solo hay que completar un formulario de registro bastante rápido y sin confirmación de e-mail.



11 - Paradigma de la entrada (XML + XSD + CSS) perfectamente validado:
(clic para mostrar/ocultar)

El CSS (estilo.css):
cursos {
   width:100%;
   background-color:#ddd;
}
curso {
   display:block;
   margin-bottom: 15px;
   margin-top: 15px;
   margin-left: auto;
   margin-right: auto;
   width:300px;
   border:green solid 1px;
   background-color:#fff;
   padding:5px 0 5px 0;
}
name,alumno {
   font-family:Verdana, Geneva, sans-serif;
   font-size:12pt;
}
name {
   font-weight:bold;
   text-align:left;
}
alumno {
   display:block;
   padding:2px 0 2px 0;
   text-align:justify;
   text-indent:1cm;
}
nombre, apellido {
   color: #366;
   font-size: 20pt;
}
sexo, fecha-nac {
   display: block;
   color: blue;
   margin-left: 20pt;
}

El XML (cursos.xml):
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="estilo.css"?>
<cursos xsi:noNamespaceSchemaLocation="instituto.xsd" 
xmlns:xsi="www.w3.org/2001/XMLSchema">
    <curso id="a">
      <name>Curso A</name>
      <alumno dni="V-6432123">
         <nombre>María</nombre>
         <apellido>Bolivar</apellido>
         <fecha-nac>1990-12-25</fecha-nac>
         <sexo>Femenino</sexo>
      </alumno>
      <alumno dni="V-9544321">
         <nombre>José</nombre>
         <apellido >García</apellido>
         <fecha-nac>1991-02-12</fecha-nac>
         <sexo>Masculino</sexo>
      </alumno>
      <alumno dni="V-15456737">
         <nombre>Angelica</nombre>
         <apellido>Peña</apellido>
         <fecha-nac>1898-06-08</fecha-nac>
         <sexo>Femenino</sexo>
      </alumno>
   </curso>
   <curso id="b">
      <name>Curso B</name>
      <alumno dni="E-81678249">
         <nombre>César</nombre>
         <apellido>Peña</apellido>
         <fecha-nac>1994-10-17</fecha-nac>
         <sexo>Masculino</sexo>
      </alumno>
      <alumno dni="V-16429342">
         <nombre>Marta</nombre>
         <apellido>De lucia</apellido>
         <fecha-nac>1984-01-23</fecha-nac>
         <sexo>Femenino</sexo>
      </alumno>
   </curso>
   <curso id="c">
      <name>Curso C</name>
      <alumno dni="V-17695342">
         <nombre>Omar</nombre>
         <apellido>Helguera</apellido>
         <fecha-nac>1987-08-23</fecha-nac>
         <sexo>Masculino</sexo>
      </alumno>
      <alumno dni="V-12685312">
         <nombre>Kimberli</nombre>
         <apellido>Di' Mario</apellido>
         <fecha-nac>1991-11-24</fecha-nac>
         <sexo>Femenino</sexo>
      </alumno>
   </curso>
</cursos> 

El XSD (cursos.xsd):
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="www.w3.org/2001/XMLSchema">

 <!-- elemento padre "cursos"--> 
  <xs:element name="cursos">
    <xs:complexType>
      <xs:sequence>
        <!-- elemento hijo "cursos", puede aparecer varias veces-->
        <xs:element ref="curso" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- elemento hijo de "cursos" -->
  <xs:element name="curso">
    <xs:complexType>
      <xs:sequence>
        <!-- almacena el nombre a mostrar del curso-->
        <xs:element ref="name" />
        <!-- almacena los datos de los alumnos, puede aparecer varias veces -->
        <xs:element ref="alumno" maxOccurs="unbounded" />
      </xs:sequence>
      <!-- atributo "id" requerido para el elemento "curso" -->
      <xs:attribute name="id" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

  <!-- elemento "name" hijo de "curso", mixto -->
  <xs:element name="name">
    <xs:complexType mixed="true" />
  </xs:element>

  <!-- elemento "alumno" hijo de "curso" -->
  <xs:element name="alumno">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="nombre" />
        <xs:element ref="apellido" />
        <xs:element ref="fecha-nac" />
        <xs:element ref="sexo" />
      </xs:sequence>
      <!-- atributo del elemento "alumno", requerido -->
      <xs:attribute name="dni" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

  <!-- elementos hijos de "alumno" pertenecientes a la restrccion de tipo "alfa" -->
  <xs:element name="nombre" type='alfa'/>
  <xs:element name="apellido" type='alfa'/>

  <!-- restriccion "alfa" 
       restringimos el uso solo a letras de la A a la Z minusculas o mayusculas
       asi como, algunos otros caracteres.
  -->
  <xs:simpleType name="alfa">
    <xs:restriction base="xs:string">
      <!-- minimo 3 caracteres -->
      <xs:minLength value='3'/>
      <!-- maximo 15 caracteres -->
      <xs:maxLength value='15'/>
      <!-- evitamos que se elimnen los espacios en blanco -->
      <xs:whiteSpace value="preserve"/>
      <!-- restringimos el campo a uno o más caracteres de la A a la Z sea minúscula 
           o mayúscula, así como, eñes, vocales acentuadas, diéresis, los caracteres _' 
           y espacios. 
      -->
      <xs:pattern value="[a-zA-Z_ ÑÁÉÍÓÚÄËÏÖÜñáéíóüäëïöü']+"/>
    </xs:restriction>
  </xs:simpleType>

  <!-- fecha de naciemiento, hijo de "alumno" -->
  <xs:element name="fecha-nac">
    <xs:simpleType>
      <xs:restriction base="xs:date">
        <!-- eliminamos todos los espacios, saltos de línea, tabulaciones, etc.:-->
        <xs:whiteSpace value='collapse'/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

  <!-- elemento sexo, hijo de "alumno" -->
  <xs:element name="sexo">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <!-- solo los valores a "Masculino" ó "Femenino"-->
        <xs:pattern value="Masculino|Femenino"/>
        <!-- minimo 3 caracteres -->
        <xs:minLength value='8'/>
        <!-- maximo 15 caracteres -->
        <xs:maxLength value='9'/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>

</xs:schema>


Fuentes:

1 comentario: Suscribete a los comentarios por RSS

Anónimo

Gracias por el repaso
ahora me quedo todo claro al 100%

Publicar un comentario

- Los comentarios están siendo moderados y serán publicados en la brevedad posible.