Copyright © 2004 Claudio Bustos.
Se garantiza el permiso para copiar, distribuir y modificar este documento según los términos de la GNU Free Documentation License, Version 1.2 o cualquiera posterior publicada por la Free Software Foundation, sin secciones invariantes ni textos de cubierta delantera o trasera. Una copia de esta licencia se encuentra en Apéndice B, GNU Free Documentation License
2004
Tabla de contenidos
Lista de figuras
Lista de tablas
Lista de ejemplos
Tabla de contenidos
La rápida evolución de la Red ha tenido como pilar fundamental el lenguaje de marcado HTML. La demanda creciente por nuevas funciones llevó a que los distintos fabricantes de herramientas para Internet diseñaran extensiones propietarias que resultaron en la incompatibilidad del código HTML entre navegadores.
Para solucionar esto, la organización a cargo del HTML, la W3C, desarrollo un nuevo entorno de programación para reemplazar al HTML, el cual tiene como centro el XML o Lenguaje Extensible de Marcado, por sus siglas en inglés. Tal como su nombre lo indica, su principal diferencia con el antiguo HTML es que le entrega al desarrollador la posibilidad de configurar los documentos de acuerdo a sus preferencias y necesidades, garantizando la compatibilidad de este código entre distintas herramientas, al ser sus especificaciones estándares de dominio público.
Usuarios con experiencia el manejo de sistemas operativos (Windows, Linux), procesadores de texto e Internet.
Deseable conocimiento de HTML
Conocer el origen de XML y su relación con otros lenguajes de marcado como HTML
Comprender que es XML, a partir de las especificaciones W3C
Evaluar en que situaciones es recomendable utilizar XML, conocimiento sus ventajas y limitaciones
Construir documentos XML válidos y bien formados, de acuerdo a una especificación DTD
Conocer los fundamentos básicos de los lenguajes XHTML, XSL y Docbook
Comprender el funcionamiento de los procesadores de XML de tipo SAX y DOM
Conocer tecnologías relacionadas al uso de XML: editores, validadores, API para distintos lenguajes, navegadores, etc.
Tabla de contenidos
Históricamente, el término marcado hace referencia al proceso de hacer marcas en los manuscritos con instrucciones para el uso de determinados tipos de tamaños y tipos de fuentes, espaciado, intendación, etc.
El marcado de documentos electrónicos tuvo en un sus inicios la misma intención, describir solamente el formato del texto. Sin embargo, en los años 70, surgió el concepto de separar la presentación del contenido del texto, esto es, definiendo de modo preciso la estructura lógica de un documento dado, es posible implementar diversas formas de presentarlo, además de ser facilitar su indexación, la generación de vistas selectivas, etc. Es así que en el año 1974, Charles F. Goldfarb, liderando un grupo de trabajo de la IBM, da a conocer los primeros bocetos del lenguaje SGML, el antecesor de los lenguajes de marcado descriptivos usados en la actualidad.
Habiendo establecido este pequeño marco histórico, es posible definir los dos grandes tipos de lenguajes de marcado:
Son aquellos que entregan información sobre la estructura lógica de un documento, indicando a que tipo de elemento pertenece cada porción de texto. A los lenguajes de marcado descriptivo que permiten crear otros lenguajes, se les denomina meta-lenguajes, por ejemplo, XML y SGML
Son aquellos que especifican la presentación del texto, es decir, el tipo y tamaños de fuente, márgenes, colores, etc.
El Lenguage de Marcado Generalizado Estandar o SGML (Standard Generalized Markup Language) es un estándar que determina cómo especificar un lenguaje de marcado de documentos o un conjunto de etiquetas. SGML en sí no es un lenguaje, sino una descripción de como especificar uno; en otras palabras, en un metalenguaje.
Una aplicación o lenguaje derivado de SGML contiene los siguientes elementos
Especifica que caracteres y delimitadores pueden aparecer en una aplicación
La DTD define la sintaxis de los constructos de marcado. Un DTD puede incluir definiciones adicionales como entidades definidas por números o nombres
Describe la semántica que está adherida al marcado. Impone restricciones sintácticas que no pueden ser expresadas por el DTD
Instancias concretas, que contienen datos y marcado. Poseen una referencia al DTD
La definición de cada uno de estos elementos escapa al objetivo de este curso. Sin embargo, varios de ellos serán analizados cuando se presenten los lenguajes HTML y XML.
HTML es un lenguaje de marcado, derivado de SGML, cuyo objetivo es servir como lenguaje de publicación en la WWW. Su nombre es el acrónimo de Lenguaje de Marcado de Hipertexto (HiperText Markup Language), en inglés
HTML le permite a los autores:
Publicar documentos en línea con encabezados, textos, tablas, listas, fotos, etc.
Recuperar información a través de hipervínculos, a través de un click en un botón
Diseñar formularios para el envío de información a servicios remotos
Incluir diversos tipos de aplicaciones dentro del documento principal, como archivos de audio, video, etc.
El lenguaje HTML se ubica en una categoría intermedia entre los lenguajes de marcado descriptivo y procedimentales, ya que incluye tanto etiquetas estructurales (encabezados, parráfos, citas, etc), como etiquetas de formato (negrita, cursiva, saltos de línea, etc).
Ejemplo 1.1. Código HTML
<html>
<head>
<title>Este es el titulo</title>
</head>
<body>
</body>
<h1>Este es un encabezado</h1>
<p>Este es un párrafo</p>
<p>Este es un párrafo, también, pero ahora viene un salto de línea
<br />
Etiquetas de formato: <b>negrita</b>, <i>cursiva</i>, y <u>subrayado</u>
<p>Otro párrafo
</body>
</html>
Si bien HTML ha tenido un inmenso éxito como lenguaje de publicación en la WWW, con el tiempo las siempre crecientes necesidades hicieron patentes sus deficiencias y limites
Mezcla marcado estructural y de presentación: si bien HTML nació principalmente como lenguaje de marcado descriptivo, dirigido a la publicación de contenidos técnicos, la expansión de la red y el acceso de usuarios de diversa índole produjo la necesidad, por parte de los desarrolladores, de tener un mayor control sobre la apariencia de los sitios. Esto redundó en un uso inadecuado de las etiquetas estructurales con fines decorativos y la proliferación desordenada de etiquetas de presentación.
Dificultad de procesamiento computacional: la especificación HTML permite el uso de variadas abreviaciones en el marcado y es bastante permisiva con errores en éste, lo cual implica un gran esfuerzo de los desarrolladores de software para crear programas que procesen de modo adecuado este lenguaje.
Problemas de internacionalización: La especificación para el uso de caractéres no occidentales en HTML, si bien es bastante clara, fue ignorada por muchos desarrolladores de navegadores, lo que llevó a importantes inconvenientes en la visualización de documentos en idiomas foráneos, especialmente asiáticos
Intepretación ambigua: a partir de la permisividad de la especificación, la mezcla de etiquetas de marcado y estructura y el uso inapropiado de las primeras con usos estéticos, es bastante lógico entender porque distintos navegadores presentan diversas versiones del mismo documento. Todo esto, además, implica que la posibilidad de obtener información semántica significativa sobre un documento (por ejemplo, cuales son los nombres de las secciones), sea prácticamente imposible
Uso especifíco para Web: El HTML fue diseñado expresamente para su uso en la web. Ld facilidad para crear documentos ha impulsado su uso en otros ámbitos, lo que ha hecho aún más patente sus limitaciones para, por ejemplo, almacenar información de manera ordenada y sistemática que sea susceptible de análisis computacional.
Esta y otras razones impulsaron al W3C a crear una nueva especificación, pero esta vez no sobre un lenguaje especifico, sino sobre una forma de diseñar nuevos lenguajes y los procedimientos para analizarlos, que fuesen compatibles con las características de la WWW, pero que no limitase a ésta. Este es el objetivo que dio origen al Lenguaje de Marcado Extensible, XML
Según la propia W3C, XML es un formato de texto simple y flexible derivado de SGML. Su desarrolló comenzó en el año 1996, y fue adoptado como estándar en Febrero de 1998.
En primera instancia, se orientó a satisfacer las necesidades de publicación electrónica no satisfechas por HTML. En la actualidad, ha tomado un importante rol como formato estándar para el intercambio de datos en la Web y en otros contextos.
XML no es un lenguaje de marcado, como HTML, sino un metalenguaje que permite definir otros lenguajes de marcado para usos especificos. Esto quiere decir que es nuestra aplicación específica la que debe encargarse de reconocer los contenidos incluidos dentro del documento XML para, por ejemplo, presentarlos. No existe nada dentro de la especificación que señale cómo debe presentarse o procesarse el contenido del documento.
El contenido de esta sección es altamente técnico, y muchos de los conceptos aquí presentados son explicados y ejemplificados más adelante. Por tanto, puede omitirse su lectura en una primera instancia.
Según la W3C, XML es un subconjunto de SGML, cuyo objetivo es permitir la entrega, recepción y procesamiento de documentos SGML en la Web, más allá de las capacidades de HTML.
El lenguaje XML describe una clase de documentos, los documentos XML, y define de forma parcial el comportamiento de los programas computacionales que los procesan. A estos últimos se les denomina procesadores (parsers) de XML
Los documentos XML están compuestos de unidades de almacenamiento denominadas entidades, que contienen datos procesables y no procesables. Los datos procesables están compuestos de carácteres, algunos de los cuales pasan a ser datos de carácteres (CDATA) y otros marcado. El marcado describe la estructura lógica del documento.
Los objetivos del diseño de XML son:
Uso directo en Internet
Permitir una gran variedad de aplicaciones
Compatibilidad con SGML
Facilidad para desarrollar programas que procesen XML
Número de carácterísticas opcionales reducidas al mínimo
Documentos legibles para los humanos, con una relativa claridad
Diseño de documentos rápido, formal y conciso
Facilidad de creación de documentos XML
Formato de las etiquetas es de mínima importancia
Un documento XML es aquel que cumple con las características de un documento bien formado, de acuerdo a la especificación W3C.
Los documentos XML tienen una estructura física y lógica. Físicamente, los documentos XML están compuestos de entidades. Una entidad puede hacer referencia a otras entidades, lo que causará la inclusión de estas en el documento. Un documento comienza con un elemento raíz. La estructura lógica del documento está compuesta por declaraciones, elementos, comentarios, referencia a caracteres e instrucciones de proceso, las cuales son indicadas en el texto por marcado explícito. La estructura lógica y física debe presentar una jerarquía adecuada.
Un procesador o parser de XML es un módulo de software que lee documentos XML y provee acceso a su contenido y estructura. Se entiende que este módulo actúa en favor de otro módulo, llamado aplicación.
Los procesadores XML se dividen en dos clases: validadores y no validadores. Ambos tipos de procesadores deben dar cuenta de cual falla formal del documento XML que procesa. Los procesadores validadores deben, además, deben reportar cualquier violación a las restricciones impuestas a la estructura por un DTD o un XML Schema.
Entre las ventajas más importantes de XML se encuentran
Es fácilmente procesable por humanos como por software: la posibilidad de escribir la etiquetas de acuerdo a los propios requerimientos hace que la lectura humana de un documento XML sea bastante fácil. Además, la serie de imposiciones sobre la sintaxis del documento implica una gran facilidad para procesar los documentos, a diferencia del HTML u otros derivados de SGML.
Promueve la separación de presentación y contenido: el uso de tecnologías como el CSS y el XSLT permiten omitir cualquier tipo de marcado de presentación en el documento, permitiendo que un determinado contenido pueda ser presentado de muchas formas posibles e, incluso, en formatos de archivo distintos (PDF, RTF, XLS). Lo mismo ocurre, pero a la inversa: esto es, se puede usar la misma plantilla de presentación para mostrar los más diversos contenidos.
Diseñado para ser usado en cualquier idioma: La adopción del estándar UTF-8 permite el uso de XML en cualquier idioma conocido
Es particularmente adecuado para la transmisión de información a través de la WWW: Al ser XML una tecnología adaptada a la red, fácilmente procesable por software y que permite establecer estándares de modo fácil y claro, resulta particularmente indicada para la transmisión de datos entre diversos actores en la red, especialmente las realizadas entre negocios.
Fácil análisis sintáctico por lo estricto de las regulaciones de composición de documentos, lo que posibilita la creación de poderosas herramientas de extracción de datos.
Tabla de contenidos
Los documentos XML tienen una estructura fija, compuesta de dos partes, el encabezado y el cuerpo. En el encabezado se especifican las caracteristicas del documento en sí, como la versión de XML a la cual pertenece, la especificación de la estructura al cual debe adherir, etc. En el cuerpo se incluyen la información propiamente tal y está compuesto por distintos elementos.
Cómo se señalo en la sección “Definición de documento XML”,el documento se divide en marcado y los datos de caracteres (CDATA). El marcado corresponde a las instrucciones que el parser de XML debe procesar. Las marcas o 'tags' se reconocen porque comienzan con el carácter ">" y terminan con el carácter "<"; la única excepción son las referencia a entidades, que comienzan con el carácter "&"; y terminan con el carácter ";". Los datos de caracteres, por su parte, corresponden a todo lo que no es marcado y forma el texto del documento.
Todos los documentos XML deben comenzar con un encabezado, que en su forma más simple se presenta como:
<?xml ?>
Ahora bien, este codigo no será aceptado por ningún procesador de XML, ya que se requiere siempre la identificación de la versión de XML a la cual pertenece el documento. Para ello, agregamos el atributo version.
<?xml version="1.0" ?>
Como vemos, un atributo se define escribiendo el nombre de la variable (en este caso 'version'), un signo igual = y el valor de la variable, entre comillas simples o dobles
El encabezado puede tener otros dos atributos, los cuales por lo general son omitidos. El primero es encoding, el cual determina el tipo de codificación del documento, importante para la interpretación de los carácteres según la lengua, lo cual es especialmente importante en lenguajes como el japonés. Los conjuntos más utilizados para el lenguaje español son el ISO-8859-1 y el UTF-8. El segundo atributo es standalone, el cual indica si se necesita un documento externo (DTD o XML Schema) para definir la estructura del documento; puede adoptar los valores yes o no
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
Si bien el encabezado puede contener más objetos, para la comprensión cabal de éstos es necesario entender, primero, cual es la composición del cuerpo de un documento XML. Por tanto, la descripción de los elementos faltantes se realizará en secciones posteriores
El cuerpo de un documento XML está formado por el contenido en sí del documento, el cual se divide en texto y marcado. El marcado, a su vez, se divide en elementos, atributos, comentarios, referencia a entidades e instrucciones de proceso. A continuación, presentamos un ejemplo típico de cuerpo XML
Ejemplo 2.1. Cuerpo XML
<libro>
<titulo>Mi libro</libro>
<prefacio />
<capitulos>
<capitulo id="cap_1">
<titulo>Capitulo 1</titulo>
</capitulo>
<capitulo id="cap_2">
<titulo>Capitulo 2</titulo>
</capitulo>
</capitulos>
</libro>
Los elementos son los objetos esenciales de un documento XML. Los elementos pueden contener otros tipos de objetos, incluyendo a otros elementos. Como vemos en el ejemplo, los elementos se definen con dos etiquetas (tags), la primera señalando el inicio del elemento, con la nomenclatura <nombre> y la segunda señalando el término, de la forma </nombre>.
Si bien en HTML se puede omitir la etiqueta de cierre, en XML eso no es posible. Si se desea señalar que un elemento está vacío, se puede utilizar la forma abreviada <nombre />. Además, es importante mantener la correcta anidación de los elementos, o sea, que la etiqueta de cierre de un elemento no se encuentre después del cierre del elemento que lo contiene.
Por último, es necesario destacar que un documento XML debe poseer un elemento, el cual es denominado raíz, que contenga a todos los otros
Ejemplo 2.2. Uso correcto e incorrecto del elemento raíz
<?xml version="1.0" ?>
<libro>
<titulo>Este es el titulo</titulo>
</libro>
<?xml version="1.0" ?>
<libro>
<titulo>Este es el titulo</titulo>
</libro>
<libro>
<titulo>Este es el titulo del segundo libro</titulo>
</libro>
Los elementos son la unidad básica del XML y es posible utilizar sólo este tipo de objetos para definir un documento, pero si tenemos una situación como la siguiente
<inventario>
<item>
<tipo>computador</tipo>
<id>50</id>
<marca>HP</marca>
<modelo>5100</modelo>
<descripcion>Descripcion HP 5100</descripcion>
</item>
<item>
<tipo>computador</tipo>
<id>60</id>
<marca>HP</marca>
<modelo>6100</modelo>
<descripcion>Descripcion HP 6100</descripcion>
</item>
</invetario>
es bastante obvio que los elementos tipo o id son carácteristicas del item, más que objetos o entes propiamente tales. Para este y otros casos, W3C definió los atributos, que son objetos que definen las propiedades de un elemento dado. El formato de un atributo es
nombre_atributo = "valor_atributo"
, permitiéndose el uso de comillas simples o dobles alrededor del valor del atributo. Nuestro código anterior quedaría, entonces, del siguiente modo:
<inventario>
<item tipo="computador" id="50" marcar="HP" modelo="5100">
Descripcion HP 5100
</item>
<item tipo="computador" id="60" marcar="HP" modelo="6100">
Descripcion HP 6100</descripcion>
</item>
</inventario>
Muchas veces, especialmente si el codigo crece mucho, es necesario colocar algún tipo de aviso dentro del documento para recordar para que se servía un determinado elemento, o para documentar la falta de un datos, etc. Para esos casos, se pueden agregar comentarios dentro del código, los cuales no serán considerados por el procesador de XML. Este objeto tiene la estructura
<!-- Aquí va el comentario -->
Cómo se habrá percatado por los ejemplos anteriores, dentro de los elementos se puede incluir o no texto. Es importante considerar que a diferencia de HTML, se considera relevante todo carácter de espacio que se utilice. Por ejemplo:
<item>Nombre</item>
es considerado distinto a
<item> Nombre </item>
y el procesador de XML debe tomar en cuenta ese hecho, para eliminar los espacios o los saltos de línea, si es necesario.
Otro factor a considerar es que, dependiendo del procesador y de la codificación utilizada, existen ciertos carácteres que no pueden ser ingresados tal cual, como los signos <, & >. Para ello, existen dos alternativas:
Las referencias a entidades son objetos que representan a otros. Poseen la estructura:
&nombre_entidad;
Por ejemplo, el signo < es representado por la entidad <. Existen 5 entidades predefinidas en XML, existiendo la posibilidad por parte del usuario de crear las que considere necesarias. (Ver Tabla 2.1, “Entidades predefinidas”)
Si bien utilizar entidades es el método por excelencia para hacer referencia a carácteres no posibles de escribir directamente, en ocasiones resulta poco práctico, como cuando se requiere escribir código fuente. En este caso, seria deseable una instrucción para desactivar el procesamiento, lo cual también sería deseable en el caso de que el procesador eliminase los espacios y se desease mantenerlos. La instrucción para ello es CDATA y tiene la estructura
<![CDATA[ texto_sin_procesar ]]>
Si escribimos un documento XML con las reglas expuestas en las dos secciones anteriores sin cometer errores, estaremos en presencia de un documento bien formado. Ahora bien, generalmente esto no basta para crear una aplicación, ya que debemos limitar en mayor o menor medida el tipo de datos a ingresar. Por ejemplo, si tenemos una aplicación de guía teléfonica, un marcado como el siguiente sería, por decir lo menos, inútil
<?xml version="1.0" ?>
<directorio>
<persona>
<nombre>Juan</nombre>
<apellido_paterno>Perez</apellido_paterno>
<apellido_paterno>Salgado</apellido_paterno>
<apellido_paterno>Muñoz</apellido_paterno>
<color_pelo>Negro</color_pelo>
<persona><nombre>Segunda personalidad</nombre></persona>
</persona>
</directorio>
Como se puede observar, si bien el documento está bien formado, ya que el marcado está escrito correctamente, cuenta sólo con un elemento raíz y contiene carácteres presentes en la codificación pre-establecida, presenta evidentes errores lógicos. Es evidente que no existen personas con más dos apellidos y que una persona no puede estar contenida dentro de otra ni es una característica de ella.
Debe existir alguna forma de especificar restricciones sintácticas al marcado para definir su estructura, o sea, que objetos se aceptarán en el documento, en que cantidad y en que orden. El documento que se encarga de realizar esta especificación se llama Documento de Definición de Tipo (DTD, por sus sigla en inglés).
Esta descripción permite que cada XML porte una descripción de su propia estructura. Además, grupos independientes pueden acordar el uso de un DTD común para intercambiar datos y verificar que los documentos propios como ajenos tengan la estructura adecuada, o sea, sean válidos.
Con lo expuesto anteriormente, es tiempo de definir los conceptos de documento válidos y documento bien formado.
Es aquel que responde a las características de un documento XML tal como la especifica la recomendación W3C, no existiendo limitaciones sobre el número o tipo de contenidos. Esto implica, entre otras cosas:
Ocupar sólo carácteres aceptados por la codificación del documento, la cual fue definida en el atributo encoding del encabezado
La estructura de elementos es estrictamente jerárquica: existe sólo un elemento raíz y todos los tags están correctamente anidados, no existiendo superposiciones de elementos.
Los nombres de elementos están compuestos por letras, números y los signos -_.:, siendo importante la presencia o no de caracteres con mayúscula.
Los valores de los atributos van cerrados entre comillas simples o dobles
Es aquel que, estando bien formado, respeta las restricciones establecidas por una definición externa, correspondienta ésta a un documento DTD o XML Schema, en cuanto a los elementos y atributos aceptados, su cantidad y en el orden en el cual pueden aparecer.
Como vimos, un documento válido debe debe hacer a una definición del tipo, cantidad y orden de los contenidos considerados pertinentes. Si bien existen dos especificaciones para realizar esta labor, DTD y XML Schema, explicaremos el uso de la primera de estas forma, ya que es la más antigua y común.
La referencia de un DTD se realiza por medio del elemento DOCTYPE, el cual ubica en el encabezado del documento, a continuación de la instrucción <?XML ?>. Dependiendo de la ubicación del DTD, el elemento DOCTYPE adoptará dos formas
La definición del documento DTD se encuentra en un archivo distinto al XML.
Ejemplo 2.5. Referencia externa a DTD
<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
<!DOCTYPE libro SYSTEM "libro.dtd" >
<libro />
Como vemos, después de <DOCTYPE se incluye el nombre del elemento raiz (libro, en nuestro caso), el término SYSTEM, que indica que se debe acceder a un archivo local o remoto, y el nombre del archivo, que en este caso es libro.dtd
La definición del DTD se encuentra dentro del mismo documento.
Ejemplo 2.6. Referencia interna a DTD
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<!DOCTYPE libro [
<!ELEMENT libro EMPTY >
]>
<libro />
En este ejemplo, después de <DOCTYPE se incluye el nombre del elemento raiz (libro) y se ubica el texto del DTD entre corchetes ([ y ])
En la sección sobre el encabezado del documento XML, se nombró la existencia del atributo standalone. Con los datos anteriormente expuestos, es fácil entender que un standalone = "yes" quiere decir que el documento no tiene un DTD o este se incluye directamente en el encabezado. La referencia externa, en cambio, determina un valor de standalone = "no"
La forma en la cual se puede organizar un documento DTD es bastante libre. Es conveniente, eso sí, seguir el orden en el cual deben presentarse los objetos en el documento XML, definiendo primero los objetos que aparecen primero y/o que pueden ser incluidos en varios otros elementos, con sus respectivos atributos, para luego definir el resto de los elementos
La definición de los elementos presenta la siguiente sintaxis básica
<!ELEMENT nombre-elemento categoría>
o
<!ELEMENT nombre-elemento (contenido-elemento)>
La primera nomenclatura se utiliza para asignar a un elemento una de las categorías genéricas (ANY o (EMPTY) . La segunda, cuando se quiere definir de forma exacta el tipo y orden de elementos que puede incluir el elemento en cuestión
Sintaxis básica para definir elementos en DTD
Indica que el elemento puede contener cualquier tipo de contenido
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE cualquier_cosa [ <!ELEMENT cualquier_cosa ANY > <!ELEMENT parrafo ANY > ]> <cualquier_cosa> <parrafo>Esto es un parrafo</parrafo> Fuera de parrafo </cualquier_cosa>
Indica que el elemento no puede contener nada, o que es lo mismo, que es un elemento vacío
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE vacio [ <!ELEMENT vacio EMPTY > ]> <vacio />
Se define cual va a ser el orden y número de elementos permitidos. No se puede agregar otro contenido, aparte del definido.
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE secuencia [ <!ELEMENT secuencia (primero,segundo,tercero) > <!ELEMENT primero EMPTY> <!ELEMENT segundo EMPTY> <!ELEMENT tercero EMPTY> ]> <secuencia> <primero /> <segundo /> <tercero /> </secuencia>
El elemento sólo contiene datos de carácter, y no elementos en su interior. Se representa por la expresión #PCDATA
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE solo_texto [ <!ELEMENT solo_texto (#PCDATA) > ]> <solo_texto> Este elemento sólo permite ingresar texto, nada más. </solo_texto>
Sintaxis para definir orden y cantidad de elementos en un DTD
<!ELEMENT nota (mensaje)>
El elemento mensaje debe presentarse una vez dentro del elemento nota
<!ELEMENT persona (nombres, apellido_paterno, apellido_materno)>
El elemento persona debe contener los elementos nombres, apellido_paterno y apellido_materno, en ese mismo orden
<!ELEMENT jauria (perro+)>
El elemento jauría debe contener uno o más elementos perro
<!ELEMENT persona (hijo*)>
El elemento hijo puede presentarse 0, 1 o más veces dentro del elemento persona.
<!ELEMENT persona (apendice?)>
El elemento apendice puede estar 1 vez o no estar dentro del elemento persona
<!ELEMENT vivienda (casa|departamento|mediagua)>
El elemento vivienda puede contener uno de los siguientes elementos: casa,departamento o mediagua.
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE mensaje[ <!ELEMENT mensaje (#PCDATA|negrita|cursiva)*> <!ELEMENT negrita (#PCDATA|cursiva)* > <!ELEMENT cursiva (#PCDATA) > ]> <mensaje> Este texto contiene texto libre, <negrita>negritas</negrita>, <cursiva>cursiva</cursiva> y <negrita><cursiva>ambos</cursiva></negrita> </mensaje>
Se puede tener datos de carácter y elementos mezclados dentro de un elemento padre, pero en la definición deben señalarse como elementos alternativos (uso de |), y en modo * (0 o más elementos aceptados).
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE libro[
<!ELEMENT libro ((titulo?,titulo_breve?)?,
introduccion?,
(capitulo|seccion)*,
glosario?) >
<!ELEMENT titulo ANY >
<!ELEMENT titulo_breve ANY >
<!ELEMENT introduccion ANY >
<!ELEMENT seccion ANY >
<!ELEMENT capitulo ANY >
<!ELEMENT glosario ANY >
]>
<libro>
<titulo></titulo>
<titulo_breve></titulo_breve>
<capitulo />
<seccion />
<seccion />
<capitulo />
<capitulo />
<glosario>
</glosario>
</libro>Se pueden agrupar distintas expresiones entre paréntesis, para lograr detallados ajustes de orden y cantidad. En el ejemplo, tenemos que existe una definición basada en orden de 4 elementos, siendo el primero y el tercero agrupaciones.
En la primera agrupación, vemos que se puede tener 0 o 1 titulo y a continuación 0 o 1 titulo_breve, y todo esto puede o no estar antes de la introduccion.
En la tercera agrupación, se ha establecido que se pueden tener 0 o más elementos de capitulo o seccion entre la introducción y el glosario.
Los atributos de los elementos son declarados a través de una instrucción ATTLIST
<!ATTLIST nombre-elemento nombre-atributo tipo-atributo valor-preestablecido>
Tabla 2.2. Tipo de atributo para ATTLIST
| Valor | Explicación |
|---|---|
| CDATA | El valor contiene datos de carácter. |
| Atributos enumerados (en1|en2|..) | El valor del atributo corresponde a algunos de los enumerados en la lista |
| ID | El valor debe ser un ID único |
| IDREF | El valor debe corresponder a un ID ya existente |
| IDREFS | El valor es una lista ID ya existententes, separados por espacios |
| NMTOKEN | El valor es un nombre XML válido |
| NMTOKENS | El valor es una lista de nombre XML válidos, separados por espacios |
| ENTITY | El valor es una entidad |
| ENTITIES | El valor es una lista de entidades, separadas por espacios |
| NOTATION | El valor es el nombre de una notación |
| xml: | El valor es un valor predefinido de xml |
Tabla 2.3. Valores por defecto para ATTLIST
| Valor | Explicación |
|---|---|
| valor | El valor por defecto para el atributo |
| #REQUIRED | El atributo debe ser incluido en el elemento |
| #IMPLIED | El atributo no debe ser incluido |
| #FIXED valor | El valor del atributo es fijo. No tiene mucha utilidad, excepto cuando se altera una DTD para fijar un valor que antes era variable. |
Por ejemplo, si tenemos el elemento persona, podemos incluir el atributo nacionalidad. Si quisiesemos aceptar cualquier valor literal para esta variable, y fuese obligatario incluirla, su definición sería
<!ATTLIST persona nacionalidad CDATA #REQUIRED >
Si sólo aceptaramos personas de nacionalidad chilena y argentina, siendo mayor el número de chilenos, podríamos definir el atributo con una enumeración, dejando como valor por defecto 'chilena'
<!ATTLIST persona nacionalidad (chilena|argentina) "chilena" >
Cómo realizar una explicación de cada posibilidad sería bastante tedioso, así que a continuación se presentará un ejemplo comentado, que muestra las formas más usuales de definir atributos. Este ejemplo introduce, además, el uso de un DTD externo para validad un documento XML.
Ejemplo 2.7. Uso de ATTLIST
catalogo.dtd
<!ELEMENT catalogo (categoria|libro|autor)+ >
<!ELEMENT categoria (#PCDATA) >
<!ELEMENT autor (#PCDATA) >
<!ELEMENT libro EMPTY >
<!ATTLIST categoria categoria_id ID #REQUIRED > 
<!ATTLIST autor id ID #REQUIRED > 
<!ATTLIST autor iniciales CDATA #IMPLIED> 
<!ATTLIST libro id ID #REQUIRED > 
<!ATTLIST libro categoria_id IDREFS "general" > 
<!ATTLIST libro id IDREF #IMPLIED > 
<!ATTLIST libro estado 
(intacto|dañado|robado|prestado)
"intacto">
![]() | Tipo de atributo: ID. El valor de este atributo para el documento debe ser único. |
![]() | Tipo de atributo: CDATA. Se puede ingresar cualquier dato de carácter, o sea, texto que no sea marcado |
![]() | Tipo de atributo: IDREF. El valor del atributo debe corresponder un ID ya especificado. |
![]() | Tipo de atributo: IDREFS. El valor del atributo debe corresponder a uno o más IDs ya especificados, separados por espacios. |
![]() | Tipo de atributo: enumeración. El valor del atributo debe corresponder a alguno de los especificados en la lista. |
![]() | Valor por defecto: #REQUIRED. Se requiere ingresar un valor para el atributo |
![]() | Valor por defecto: #IMPLIED. No se requiere ingresar un valor para el atributo |
![]() | Valor por defecto específico. Si no se ingresa un valor, se utiliza el asignado |
catalogo.xml
<?xml version="1.0" encoding="ISO-8859-1"
standalone="no" ?>
<!DOCTYPE catalogo SYSTEM "catalogo.dtd" >
<catalogo>
<categoria id="general">General</categoria>
<categoria id="referencia">Libros de referencia</categoria>
<categoria id="circulación">Libros en circulación</categoria>
<autor id="autor1">Autor 1</autor>
<autor id="autor2" iniciales="a2">Autor 2</autor>
<libro id="libro1"/>
<libro id="libro2" categoria_id="general referencia"/>
<libro id="libro3" estado ="prestado" />
</catalogo>Si se necesita definir más de un atributo para un mismo elemento, se puede utilizar la misma sintaxis
<!ATTLIST nombre-elemento
nombre-atributo tipo-atributo valor-preestablecido
nombre-atributo tipo-atributo valor-presetablecido ...>Por ejemplo
<!ATTLIST libro id ID #REQUIRED
isdn CDATA #IMPLIED >
El último tipo de objeto a definir dentro de un DTD son las entidades, que como ya hemos señalado en la sección “Texto y entidades” nos permiten representar carácteres no posibles de incluir como texto o cualquier otro tipo de texto.
La sintaxis de definición de una entidad es bastante simple, siendo
<!ENTITY identificador "valor" >
El uso más importante de las entidades, aparte de permitir la representación de caracteres, es la de incluir texto o marcado de manera estándar. Cuando se realiza una referencia a una entidad, el procesador la reemplaza de forma literal por el contenido asignado como valor, el cual puede incluir marcado.
Por ejemplo, en HTML existe la etiqueta <a>, que con el atributo href nos permite hacer un link a una página. Por ejemplo:
<a href='http://www.google.cl'>Google</a>
Crea un link con el texto 'Google', dirigido a http://www.google.cl. Puede darse el caso que necesitemos ocupar repetidamente esa estructura en nuestro texto. Para evitar el trabajo de escribirlo una y otra vez, es posible crear una entidad &google;, que funcione como abreviatura de la expresión completa. Su DTD sería:
<!ENTITY google "<a href='http://www.google.cl'>Google</a>">
Entonces, si tenemos en nuestro texto
A continuación tendremos un link a google:
&google;
El procesador reemplazará la entidad por su definición y obtendremos:
A continuación tendremos un link a google: <a href='http://www.google.cl'>Google</a>
Una variante de lo anterior es incluir el contenido de un archivo completo a través de la entidad. La sintaxis para ellos es:
<!ENTITY identificador SYSTEM "nombre_archivo" >
Por ejemplo, podemos dividir el contenido el contenido de un libro en tres archivos xml (capitulo_1.xml,capitulo_2.xml,capitulo_3.xml) e incluirlos dentro del archivo principal, definiendo tres entidades.
<?xml version="1.0" ?>
<!DOCTYPE libro [
<!ENTITY capitulo_1 SYSTEM "capitulo1.xml" >
<!ENTITY capitulo_2 SYSTEM "capitulo1.xml" >
<!ENTITY capitulo_3 SYSTEM "capitulo1.xml" >
]>
<libro>
&capitulo_1;
&capitulo_2;
&capitulo_3;
</libro>
Por último, es posible utilizar las entidades para ahorrar trabajo en la creación del DTD. Por ejemplo, si tenemos un atributo que es común a muchas entidades, es posible crear una entidad que la represente. La sintaxis es bastante similar a la de una entidad común
<!ENTITY % identificador "valor" >
Por ejemplo, hemos visto en varios ejemplos que los identificadores obligatorios se crean siempre como ID #REQUIRED. Entonces, podemos resumir la definición del DTD realizada en el ejemplo de uso de attlist usando entidades y el formato abreviado de definición de atributos.
Ejemplo 2.8. Uso de entidades para definir atributos
<!ELEMENT catalogo (categoria|libro|autor)+ >
<!ELEMENT categoria (#PCDATA) >
<!ELEMENT autor (#PCDATA) >
<!ELEMENT libro EMPTY >
<!ENTITY % IdRequerido "id ID #REQUIRED" >
<!ATTLIST categoria %IdRequerido; >
<!ATTLIST autor %IdRequerido;
iniciales CDATA #IMPLIED>
<!ATTLIST libro %IdRequerido;
categoria_id IDREFS "general"
autor_id IDREF #IMPLIED
estado
(intacto|dañado|robado|prestado)
"intacto">
Tabla de contenidos
Como hemos señalado reiteradas veces, XML no es un lenguaje en sí, sino un metalenguaje que entrega especificaciones destinadas a que los desarrolladores creen nuevos lenguajes.
En xml.org, uno de los sitios más importantes de lenguajes XML, existen más de 200 especificaciones distintas, que cubren los más variados ámbitos.
De los muchos lenguajes XML existentes, hay algunos que son especialmente relevantes, ya sea porque corresponden a versiones actualizadas de lenguajes extendidos ya existentes (HTML, Docbook), o por su aceptación como herramientas estándar para el manejo de ciertas tareas (XML Schema, XSL-FO, XLS, MathML, etc.).
Es los siguientes capítulos describiremos 3 lenguajes XML especialmente relevantes:
XHTML (Lenguaje de Hipertexto Extensible): El sucesor de HTML, el lenguaje de publicación de facto en la WWW, ahora en formato XML
XSL (Lenguaje de Hojas de Estilo Extensible): Conjunto de tecnologías destinadas a la transformación y presentación de documentos XML. Comprende tres lenguajes relacionados: XPath, XSLT y XSL FO.
Docbook: uno de los lenguajes de creación de textos electrónicos más populares, junto a LaTex.
Según el W3C, el Lenguaje de Hipertexto Extensible o XHTML es la familia de documentos presentes y futuros que reproduce, contiene y extiende HTML, reformulados en XML. XHTML es el sucesor de HTML y cuenta una serie de especificaciones propias.
La principal ventaja de usar XHTML sobre HTML es la posibilidad de usar las poderosas herramientas de transformación XML (como XSLT) y la posibilidad de integrar otros lenguajes, como MathML, SML o SVG dentro del documento, lo que no puede hacerse con HTML.
HTML es un derivado de SGML, por lo que prácticas que son perfectamente legales, como no escribir el fin de tags vacíos, deben ser corregidas para que el documento sea compatible con XML.
A continuación, se presentaran las principales diferencias entre ambos lenguajes
Este concepto, propio de XML, indica que cada elemento debe contar con su marca de cierre y que la anidación de elementos debe ser correcta, no permitiéndose el solapado de elementos
Correcto
<p>Este es un <b>párrafo</b> correcto</p>
Incorrecto
<p>Este es un <b>párrafo incorrecto</p></b>
Los documentos XHTML deben usar minúsculas para todos los elementos y atributos HTML. Esta diferencia es necesaria, debido a que XML es sensible a las mayúscula: <li> y <LI> son etiquetas distintas.
Para los documentos basados en HTML, se permite omitir la etiqueta de cierre. En XML, en cambio, todos los elementos deben tener un tag de cierre, incluso aquellos marcados como EMPTY en el DTD, pudiendo usarse la forma abreviada.
Correcto
<p>Estos son tags <br /> bien </p><p>cerrados </p>
Incorrecto
<p>Estos no son tags <br> bien <p>cerrados </p>
Todos los valores de atributos deben estar entre comillas dobles o sencillas, aunque sus valores sean numéricos
Correcto
<td colspan="2">
Incorrecto
<td colspan=3>
A diferencia de HTML, XML no permite la minimización de atributos. Los pares de atributo-valor deben ser escritos en plenitud, no pudiendo omiterse el valor
Correcto
<input type='radio' checked='checked'>
Incorrecto
<input type='radio' checked>
En XHTML, los contenidos de elemento script y style son declarados como #PCDATA. Por tanto, caracteres como < y &, bastante comunes en los lenguajes de programación, serán tratados como inicio de etiqueta y entidad, respectivamente. Para evitar esto, es mejor incluir el contenido del script o de la hoja de estilo entre etiquetas CDATA
Correcto
<script language="Javascript" type="text/javascript">
<![CDATA[
function sumarUno(x) {
return x+1; }
]]>
</script>Incorrecto
<script language="Javascript" type="text/javascript">
function sumarUno(x) {
return x+1; }
</script>
Las etiquetas a, applet, form, frame, iframe, img, y map cuentan en su definición HTML con el atributo name, que sirve para identificarlos. En XML los atributos identificatorios son del tipo ID , y sólo puede existir un atributo ID por elemento; en XHTML el atributo id es del tipo ID, dejando obsoleto al atributo name
En HTML ciertos atributos podían poseer valores que estuviesen dentro de un conjunto predeterminado de antemano (por ejemplo, el atributo type en el elemento input). En XML son denominados atributos enumerados y su interpretación es sensible a las mayúsculas, así que el valor TEXT es distinto text; todos estos valores deben ser escritos en minúsculas
Correcto
<input type='text' id='mitexto' />
Incorrecto
<input type='TEXT' id='mitexto' />
XSL es la familia de recomendaciones para definir transformaciones y la presentación de documentos XML. Consiste de tres partes:
Un lenguaje XML que permite transformar un documento XML en otro.
Un lenguaje expresivo, usado por XSLT para acceder o referirse a partes de un documento XML.
Un vocabulario XML destinado a especificar una semántica de formato, o sea, especifica de forma detallada como debe presentarse un determinado contenido.
Una hoja de estilo XSLT especifica como se presentará un documento XML, especificando las transformaciones necesarias para convertirlo en un vocabulario XML de presentación, como XHTML o XSL-FO.
Al ser XSL un conjunto de tecnologías relacionadas, es posible utilizar todas o partes de ella para propósitos determinados.
El uso adecuado de distintas plantillas XSLT nos permite transformar un mismo tipo documento XML, escrito por ejemplo en Docbook, en otros formatos, como XHTML, HTML o XSL-FO. Al ser XSLT un lenguaje XML, se pueden reutilizar las herramientras utilizadas en la creación de los documentos XML para el diseño de las plantillas XSLT.
XPath es un lenguaje que permite navegar de modo flexible por la estructura del documento, a través de instrucciones sencillas y breves. Existen diversas implementaciones de esta tecnología para otros lenguajes, tales como Java o PHP, que permiten reducir la complejidad y extensión de las aplicaciones
Un documento XSL-FO, escrito directamente o producto de una transformación XSLT, puede ser transformado a distintos formatos de imagen - GIF, JPG, PNG - o de impresión - Postscript, PDF.
XPath es un lenguaje que permite acceder a los distintos objetos de un documento XML, usando una sintaxis compacta, no-XML; opera en la estructura lógica del documento, más que en su sintaxis superficial.
XPath modela el documento como un árbol de nodos, siendo cada uno de éstos un elemento, un atributo o texto. Cada uno de estos nodos puede contener, a su vez, a uno o más nodos y presenta un nombre único, que es muy similar al que utilizan los distintos sistemas de archivo, sobre todos los de tipo Unix. Utilizaremos como base el siguiente XML para los ejemplos
<AAA id="aaa1">
<BBB id="bbb1"/>
<CCC id="ccc1"/>
<BBB id="bbb2"/>
<DDD id="ddd1">
<BBB id="bbb3"/>
</DDD>
<CCC id="ccc2">
<DDD id="ddd2">
<BBB id="bbb4"/>
<BBB id="bbb5"/>
</DDD>
</CCC>
</AAA>Tabla 3.1. Expresiones más comunes utilizadas en XPath
| Ejemplo | Significado | Resultado |
|---|---|---|
| /AAA | Selecciona el elemento raiz AAA del documento | <AAA id="aaa1">
<BBB id="bbb1"/>
<CCC id="ccc1"/>
<BBB id="bbb2"/>
<DDD id="ddd1">
<BBB id="bbb3"/>
</DDD>
<CCC id="ccc2">
<DDD id="ddd2">
<BBB id="bbb4"/>
<BBB id="bbb5"/>
</DDD>
</CCC>
</AAA> |
| /AAA/BBB | Selecciona todos los elementos BBB que son hijos del elemento raiz AAA | <BBB id="bbb1"/> <BBB id="bbb2"/> |
| //BBB | Selecciona todos los elementos BBB dentro del documento | <BBB id="bbb1"/> <BBB id="bbb2"/> <BBB id="bbb3"/> <BBB id="bbb4"/> <BBB id="bbb5"/> |
| //CCC/* | Selecciona todos los elementos que están dentro de un elemento CCC | <DDD id="ddd2"> <BBB id="bbb4"/> <BBB id="bbb5"/> </DDD> |
| /AAA/BBB[2] | Selecciona el segundo elemento BBB, hijo del elemento raiz AAA | <BBB id="bbb2"/> |
| //@id | Selecciona todos los atributos id | id="aaa1" id="bbb1" id="ccc1" id="bbb2" id="ddd1" id="bbb3" id="ccc2" id="ddd2" id="bbb4" id="bbb5" |
| //BBB[@id='bbb1'] | Selecciona todos los elementos BBB que tengan un id igual a 'bbb1' | <BBB id="bbb1"/> |
XSLT es un lenguaje XML que permite, con las herramientas adecuadas, transformar un documento XML en otro. Para ello, es necesario crear un documento escrito en XSL que contiene las reglas de transformación, el cual llamaremos plantilla
La plantilla está compuesta por uno o más elementos template. Cada uno de estos elementos define que objetos van a ser transformados y cuales van a ser las transformaciones que van a sufrir. Para la definición de los elementos a transformar se ocupa XPath
Un documento XSLT presenta la siguiente estructura básica:
Ejemplo 3.1. Estructura básica de un documento XSLT
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
Este documento nos entrega algunas sorpresas. En primer lugar, observamos que todos los elementos presentan la sintaxis <xls:nombre_elemento />. El prefijo xls es denominado namespace, e identifica a todos los elementos que lo poseen como partícipes del lenguaje XSL. Se hace referencia a la definición de los objetos propios de este lenguaje en el atributo xmlns del elemento raíz xsl:stylesheet, el cual corresponde a una dirección de Internet, donde debería encontrarse la especificación el lenguaje
Hablando sobre el lenguaje en sí, podemos ver que existen dos elementos básicos, xsl:template y xsl:apply-template.
Indica sobre cual o cuales elementos del elemento original deben realizarse las tranformaciones indicadas en sus elementos hijos, a través del atributo match, que contiene una expresión XPath.
Este elemento indica que los hijos del elemento sobre el cual actúa el template deben ser procesados por otro template. Si este no existiese, simplemente son descartados.
Reutilicemos el xml que utilizamos para analizar distintos XPath y veamos que XML resultante se puede obtener utilizando estos dos elementos XSLT
Ejemplo 3.2. Uso de XSLT
fuente.xml
<?xml version='1.0' encoding='ISO-8859-1'?>
<?xml-stylesheet type="text/xsl" href="transformador.xsl" ?>
<AAA id="aaa1">
<BBB id="bbb1"/>
<CCC id="ccc1"/>
<BBB id="bbb2"/>
<DDD id="ddd1">
<BBB id="bbb3"/>
</DDD>
<CCC id="ccc2">
<DDD id="ddd2">
<BBB id="bbb4"/>
<BBB id="bbb5"/>
</DDD>
</CCC>
</AAA>
transformador.xsl
<?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <antes_raiz /> <xsl:apply-templates /> <despues_raiz /> </xsl:template> <xsl:template match="/AAA"> <a> <xsl:apply-templates /> </a> </xsl:template> <xsl:template match="//BBB"> <bbb> <xsl:apply-templates /> </bbb> </xsl:template> <xsl:template match="//DDD/BBB"> <bbb_hijo_de_ddd> <xsl:apply-templates /> </bbb_hijo_de_ddd> </xsl:template> </xsl:stylesheet>
resultado.xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?> <antes_raiz/> <a> <bbb/> <bbb/> <bbb_hijo_de_ddd/> <bbb_hijo_de_ddd/> <bbb_hijo_de_ddd/> </a> <despues_raiz/>
Cómo podemos observar, la expresión '/' selecciona al documento, antes del elemento raíz, lo cual nos permite agregar contenido antes y después de él. El comportamiento del resto de los templates es bastante predecible, excepto la relación entre //BBB y //DDD/BBB
El orden en el cual se presentan los templates es significativo. Si posicionamos <xsl:template match="//BBB"> al final, todos los BBB se transforman en bbb, ya que el parser sigue en orden la aplicación de los apply-template, y al no existir otros templates posteriores, no existe ninguna otra transformación que se pueda realizar. En cambio, si el elemento <xsl:template match="//DDD/BBB"> se ubica después, la adición de <bbb /> se omite debido a que este template toma el control por ser más especifico.
La capacidad para producir versiones impresas de los documentos HTML y, por extensión, XML, de los navegadores típicos es bastante limitada. Las herramientas de navegación necesarias para presentar un texto en línea son diferentes a las de un medio escrito. Para este último, tenemos los medios utilizados desde hace muchísimos años para los libros: cabeceras, pies de página, números de página, citas, etc. Además, para producir un documento escrito de calidad, es necesario tomar en consideración la tipografía, las imágenes y como estás se relacionan con un medio de proporciones fijas, como lo es la página escrita.
Tomando en cuenta esta necesidad, el W3C definió un vocabulario orientado a la creación de material dirigido a la impresión, el cual también es aplicable a medios electrónicos de página de tamaño fijo, como los lectores PDF.
La especificación XSL-FO es bastante larga y compleja, con muchos detalles técnicos. Además, el desarrollador común de XML no suele lidiar con este formato directamente, ya que se genera automáticamente a través de XSLT y es procesado directamente por los programas que lo transforman, a su vez, en un documento PS o PDF. Por tanto, no se procederá a una mayor explicación sobre esta tecnología.
Docbook es un sistema que permite escribir documentos estructurados usando SGML o XML. Está especialmente indicado para la creación de libros y artículos relacionados con software y hardware, aunque no está limitado a estos tópicos.
En lo técnico, Docbook es un DTD que provee un vocabulario y una estructura para la creación de documentos. Debido a que es una especificación amplia y robusta de lo que tradicionalmente se considera un libro, ha sido adoptada por un gran número de autores y cuenta con muchas herramientas - de código abierto y comerciales - que permiten realizar acciones tan variadas como la catalogación, publicación en WWW y creación de documentos impresos.
El desarrollo de documentos en Docbook tiene dos fases principales, la creación del documento y su publicación en uno o más medios
Para la creación del documento Docbook, al igual que con cualquier otro documento XML, basta tener un editor de texto simple, como el Block de Notas de windows. Empero, la complejidad de la especificación hace recomendable utilizar un editor que permite verificar la validez del documento que estamos construyendo, utilizando la DTD Docbook.
Particularmente indicado para este menester resulta la aplicación Jedit, que a través del plug-in de XML nos permite validar el documento cada vez que grabamos el archivo, avisando de cualquier error producido, además de entregarnos un listado de etiquetas posibles de incluir dentro del contexto en el que trabajamos.
En Apéndice A, Instalación de jEdit, se detallan las instrucciones para instalar el programa con los plug-in respectivos, descargar la DTD y hacerlas funcionar en conjunto
Una vez que hemos creado el documento Docbook y hemos verificado que esté bien formado y sea válido con respecto a la DTD, podemos proceder a su publicación, lo cual significa crear uno o más archivos en formatos distintos, ya sea para su publicación por vía electrónica o impresa.
Si bien existen herramientas comerciales que transforman directamente el documento Docbook en (X)HTML, RTF, PDF u otros formatos, lo más usual es utilizar XSLT para crear (X)HTML o XLS-FO, siendo este último susceptible de transformarse en un formato impreso, como RTF, PS o PDF.
La especificación Docbook permite la creación de las siguientes categorías de elementos, siendo posible utilizar todas o sólo algunas para propósitos determinados. Se presenta, entre corchetes, el nombre del elemento en inglés cuando corresponda.
Un conjunto puede contener uno más Libros. Es la jerarquía más alta de DocBook. Por ejemplo, permite agrupar a uno o más libros como una sola unidad
Es el elemento principal más común. Su definición es bastante general y flexible. Puede contener una mezcla de los siguientes componentes
Generalmente ubicada al inicio del libro
Comprende la Tabla de Contenidos[ToC], de Títulos [LoT] (para imágenes, tablas, ejemplos,etc) y el Índice[Index]
Son los elementos que siguien en jerarquía a Libro. Puede contener Partes [Part] y Referencias [Reference]. Las partes, a su vez, pueden contener Componentes. El libro puede no tener Divisiones y estar compuesto directamente de Componentes
Son los elementos que usualmente llamaríamos capítulos del libro
Corresponden a lo que llamaríamos capítulos de un Libro o Parte: Prefacio [Preface], Capítulo [Chapter], Apéndice [Appendix], Glosario [Glossary] y Bibliografía [Bibliography]. En este nivel también podemos tener Artículos [Article], que usualmente son utilizados como elemento principal en textos más breves
Existen distintos tipos de secciones en Docbook
Es el elemento más común para definir secciones. Deben estar anidadas correctamente, o sea, una Sect2 debe incluirse dentro de una Sect1
Es la alternativa a la nomenclatura anterior. Es recursiva, lo que indica que se permite incluir una Sección dentro de otra
Es una sección terminal, sin número, que no contiene otras secciones en su interior
Todos los elementos antes nombrados y otros poseen adaptadores que permiten incluir meta-información sobre ellos, como el título [Title], autor [Author], editor [Publisher], etc.. Por ejemplo, Libro contiene un elemento Información de Libro [BookInfo]
A grandes rasgos, corresponden a los párrafos de información contenidos en alguna Sección. Se pueden en las siguientes categorías:
Listas numeradas, con viñeta, de definición de términos
Avisos
Secciones donde se preserva el formato de texto, para la presentación de código fuente
Ejemplos, figuras, tablas, ecuaciones, gráficos
Párrafos
Estos elementos son porciones de texto, incluidos dentro de algún bloque de texto, que no causan un salto de línea y que entregan alguna información particular. Se dividen en:
De publicación: Acrónimos, Énfasis, Notas al Pie, Citas, etc.
Referencias cruzadas: Link a un elemento interno o a una URL, referencias a otro elemento, con y sin creación de hipervínculos.
Marcado: Texto que debe ser presentado de manera especial para efectos de presentación: Literal, Frase extranjera, etc.
Interfaz de usuario: Identifica elementos de una interfaz de usuario, como Botones, Iconos, Menus, etc.
Lenguajes de programación y constructos: Identifica elementos relacionados con la programación, como Accion, Clase, Código de Error, etc..
Uso general: Identifica elementos misceláneos, como Email, Nombre de Archivo, Opcional, Símbolo, etc.
El manual que usted lee en estos momentos fue creado con Docbook. Por tanto, nada mejor que revise el código fuente disponible en la página web del autor. . De todos modos, a continuación se presentará la estructura del primer capítulo, para ejemplicar la forma típica de un libro Docbook.
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
"http://www.oasis-open.org/docbook/xml/4.3b2/docbookx.dtd" >
<book lang="es">
<bookinfo>
<title>Introducción a XML</title>
<author>
<firstname>Claudio</firstname>
<surname>Bustos</surname>
</author>
<pubdate>2004</pubdate>
</bookinfo>
<chapter id="cap1">
<title>Fundamentos de XML</title>
<sect1 id="lenguajes_marcado">
<title>Los lenguajes de marcado</title>
<variablelist />
<sect2 id="sgml">
<title>SGML</title>
<variablelist />
</sect2>
<sect2 id="html">
<title>HTML</title>
<itemizedlist />
<example>
<title>Código HTML</title>
<programlisting />
</example>
</sect2>
<sect2 id="justificacion_xml">
<title>Justificación de XML</title>
<itemizedlist />
</sect2>
</sect1>
<sect1 id="xml">
<title>Qué es XML</title>
<sect2 id="xml_w3c">
<title>Especificación W3C</title>
<note>
</note>
<itemizedlist />
<sect3 id="xml_w3c_documento">
<title>Definición de documento XML</title>
</sect3>
<sect3 id="xml_w3c_parser">
<title>Definición de procesador de XML (parser)</title>
</sect3>
</sect2>
<sect2 id="xml_aplicaciones">
<title>Aplicaciones más comunes para el uso de XML</title>
</sect2>
<sect2 id="xml_ventajas_limitaciones">
<title>Ventajas y limitaciones de XML</title>
<itemizedlist />
</sect2>
</sect1>
</chapter>
</book>Es necesario hacer notar que, para hacer más breve el ejemplo, se eliminaron todos los elementos <para> y el contenido de los distintos tipos de listas.
Se inicia el XML con la instrucción de proceso <?xml ?>. La declaración del DTD a utilizar a través del DOCTYPE es distinta a las que hemos visto antes, ya que se hace referencia a un documento público.
<!DOCTYPE elemento PUBLIC "identificador_publico" "url" >
Tabla 3.2. DOCTYPE para identificadores públicos
| Identificador público formal | "-//OASIS//DTD DocBook XML V4.3//EN" | Nombre global y abstracto, conforme al norma ISO 8879. En este caso, se señala que el DTD es propiedad de la compañía Oasis, que la versión del DTD que estamos ocupando es la 4.3, y que el lenguaje de las marcas está basado en el inglés |
| Identificador de sistema | "http://www.oasis-open.org/docbook/xml/4.3b2/docbookx.dtd" | Al igual que los DOCTYPE de tipo SYSTEM, se puede incorporar, aparte de la referencia públic, una referencia al documento DTD tanto de forma local, como a un URL. |
Tras la definición del DOCTYPE, se abre el elemento book, raíz de todo el documento. Inmediatamente lo sigue el elemento bookinfo, que almacena meta-información sobre el libro. Para dividir al libro se utiliza como unidad mayor chapter, el cual consta de varias secciones anidadas (sect1,sect2 ysect3). Cada una de ellas cuenta con su título (title), y la mayoría del contenido se ubica dentro de elementos de párrafo (para), los cuales fueron omitidos, como ya se señaló.
Tabla de contenidos
Si bien las capacidades que nos brinda XSLT para navegar y transformar textos son notables, esde luego no ofrece todas las capacidades que un programador pudiese desear. Por tanto, para los distintos lenguajes de computación se han desarrollado librerías o módulos, denominados parsers, que le permiten al desarrollador tener un acceso fácil al documento XML.
Existen dos grandes tipos de parsers, las del tipo SAX y las del tipo DOM.
Los procesadores SAX navegan en forma secuencial a través del archivo, generando callbacks a funciones determinadas por el desarrollador ante cada evento, como la apertura de un tag o su cierre. Su ventaja es que ocupan muy poca memoria y son muy rápidos. La desventaja es que todo el trabajo de determinar la estructura del archivo (ver que tag se incluye dentro de otro), corre por cuenta del desarrollador.
Los procesadores DOM, a diferencia de los SAX, guardan toda la información de estructura y contenido del documento XML en memoria. Su ventaja es que es muy fácil navegar a través del XML, subiendo o bajando a través de los nodos, pudiendo recopilar información de muchas etiquetas en una sola instrucción. El problema radica en que son más lentos y que, dependiendo del tamaño del documento, almacenar la estructura completa puede requerir mucha memoria.
Los distintos navegadores presentan enfoques disímiles para el procesamiento de XML. Como ejemplo, utilizaremos el documento XML que contiene la introducción al manual, el cual es procesado primero en forma directa y, luego, a través de hojas de estilo CSS, una tecnología que permite especificar el modo de presentación de las distintos elementos dentro de una página HTML o XML
A continuación se incluirá el código CSS que contiene la descripción de como debiera presentarse el XML
preface {
background:white;
border:1px solid black;
font-size:9pt;
}
preface > title {
display:block;
font-size:150%;
color:blue;
}
section {
border: 1px solid black;
padding:5 px;
display:block;
margin;2px;
margin:5px;
}
section > title {
display:block;
font-weight:bold;
margin:5px;
}
para {
display:block;
margin-bottom:10px;
}
itemizedlist {
display:block; margin-left:40px;
list-style-type:disc;
}
listitem {
display:list-item;
}Internet Explorer puede presentar la estructura de un documento XML como un árbol y realizar validación de DTD sencillos
El enfoque preferido para trabajar en esta plataforma es el uso de XSLT, con sólo un mínimo de soporte para CSS sobre XML. En otras palabras, se supone que el desarrollador debe entregar un XSLT que transforme el contenido en HTML, sobre el cual se aplican los estilos definidos en el CSS. El problema radicaría en que el soporte XSLT de IE es bastante limitado
Al igual que Internet Explorer, Mozilla y su derivado, Firefox, pueden presentar la estructura de un documento XML
El enfoque de Mozilla se centra en la utilización de CSS, siendo su implementación de los estándares W3C para CSS 1 bastante completa. Para cada elemento se puede definir de manera bastante precisa su modo de presentación, siendo especialmente útil el manejo de la propiedad block.
XML se concibió como un formato de texto, no binario, para que fuese fácilmente editable. Hasta la plataforma más sencilla cuenta con alguna herramienta de edición de texto, por lo que es posible crear documentos XML incluso con el Block de Notas (notepad) de Windows, por dar un ejemplo. Ahora bien, para trabajar con documentos de cierta extensión es recomendable utilizar alguna herramienta más potente.
Existen dos grandes grupos de herramientas de desarrollo XML: los editores de texto propiamente tales y herramientas de edición gráfica. Estas últimas ocultan el marcado XML y lo representan de diversas maneras: estructuras en árbol, cajas anidades, presentación del texto con diversos colores o símbolos, etc.
Existe una infinidad de editores de texto, de los cuales resultan especialmente indicados para el desarrollo de XML aquellos que están dirigidos a los programadores. A continuación presentaremos algunas de las características que facilitan el trabajo con documentos XML; presentamos el nombre en inglés en aquellos casos donde no existe en castellano aún una forma común de denominarlas.
Tabla 4.1. Funcionalidades deseables en un editor de texto XML
| Nombre | Funcionalidad | Ventaja |
|---|---|---|
| Syntax Highlighting | Diferenciación por colores de los distintos objetos del marcado. | Permite distinguir rápidamente un elemento del marcado de otro y hace inmediatamente visible errores como la omisión de comillas. |
| Case Folding | Se omite la presentación de ciertas secciones del código que se encuentran bajo determinado nivel jerárquico. | Evita la saturación visual de elementos y hace extremadamente sencilla la tarea de mover o eliminar bloques completos |
| Autocompletación | Al iniciarse el ingreso de un elemento de marcada, se presentan los nombres de marcas que tengan igual inicio. También incluye la habilidad de crear automáticamente el último elemento abierto y de presentar los posibles atributos que puede tener un elemento | Es especialmente útil cuando se trabaja con DTD grandes, como docbook, donde es muy difícil recordar la nomenclatura exacta de los distintos objetos y en los documentos largos, donde es fácil perder la cuenta de los distintos elementos abiertos |
| Sangría automática (autoindenting) | Se agrega automáticamente sangría a los distintos elementos, siendo mayores los espacios para los elementos que se encuentran dentro de otros | Facilita la inspección visual del documento, al hacer análogas la estructura lógica a la gráfica del documento. |
| Validación de DTD | Se puede validar el documento dentro del mismo ambiente de desarrollo. Ante la presencia de un error, el programa marca de alguna manera el elemento erróneo o permite acceder directamente a la línea transgresora haciendo click sobre el reporte de error. | Hace muy rápida la localización y corrección de errores. |
Existe una infinidad de editores de texto, tanto gratuitos como comerciales, que ayudan al desarrollo de XML. Cómo escapa del alcance de este texto el hacer una reseña de estas herramientas, nos limitaremos a citar dos, las preferidas del autor del texto
Es un editor de texto genérico, especialmente diseñado para desarrollar programas, escrito en Java bajo licencia GPL (código abierto). Si bien en un inicio estuvo orientando a la creación de programación en Java, con el tiempo se convertido en una excelente de uso general, debido a su arquitectura robusta y flexible. En el caso específico de XML, cuenta con todas las carácteres citadas en la Tabla 4.1, “Funcionalidades deseables en un editor de texto XML” a través de distintos plugins, además de la posibilidad de realizar transformaciones XSLT y de búsquedas vía XPath.
Su desventaja principal es la necesidad de contar con un equipo rápido y con mucha memoria. En documentos grandes y complejos, puede ser necesario desactivar algunos plug-ins para evitar una excesiva demora en la edición
URL: http://www.jedit.org
Editor genérico, escrito en Delphi. Es un producto comercial, de tipo shareware. Es extremadamente rápido y soporta muy bien la edición de documetos largos. Si bien sólo cuenta en forma nativa con la diferenciación de marcados por colores, es muy fácil implementar funciones de autocompletación, sangría y validación a través de herramientas externas. Si se cuenta con un computador con pocos recursos, es la opción preferida
Además de los editores genéricos de texto, existen muchas programas diseñados específicamente para la edición de XML. Si bien la experiencia del autor no ha sido muy positiva con este tipo de software, para determinados requerimientos pueden ser adecuados. Estas herramientas por lo general cuentan con opciones para verificar que el documento esté bien formado y que sea válido con respecto a una DTD.
Los siguientes son algunos de los editores gráficos XML más importantes:
Tabla 4.2. Lista de editores gráficos XML
| Nombre | URL | Descripción |
|---|---|---|
| xmlspy | http://www.altova.com/dev_portal_xml_editing.html | Uno de los editores XML de pago más famosos, entre sus principales características se encuentra la posibilidad de visualizar los documentos en 5 formas distintas (grilla de texto, grilla, texto, Schema y navegador con compatibilidad XML-CSS), además de la posibilidad de crear plantillas XSLT a través de formularios y su completo soporte para XML Schema. |
| XMetal | http://www.xmetal.com/ | Su principal característica es la creación de plantillas para la creación de XML, las cuales permiten realizar operaciones similares a las de procesadores de texto como Microsoft Word. Además, permite transformar documentos SGML, cuenta con compatibilidad con sistemas de manejo de base de datos y cuenta con exportación integrada a formatos como HTML y PDF. |
| Arbotext | http://www.arbortext.com/ | Arbotext provee un conjunto de tecnologías para el desarrollo de XML, basadas en la interface de procesadores de texto. Provee de un modo de autoría simple basada en navegadores y puede exportar documentos XML a distintos formatos de manera simple. |
| Butterfly XML | www.butterflyxml.org | Una alternativa Open Source. Destaca principalmente por su GUI, que muestra en todo momento la estructura del documento en un formato similar al Explorer de Windows, además de presentar el código fuente con abuntantes indicaciones visuales para un rápido reconocimiento y corrección de errores. Cuenta, además, con soporte completo para Docbook, XSL-FO y XSLT. |
Si bien lo recomendable es contar con un editor de XML que cuente con un validador DTD, en ocasiones puede ser necesario revisar en lote muchos documentos, para verificar que sean válidos. O, en otras, puede ser necesario validar un documento que está en Internet.
Para el primer caso, podemos utilizar el validador de Sun, que permite validar documentos XML contra distintos esquemas (XML Schema, DTD, Relax, Trex). Lo podemos descargar en http://wwws.sun.com/software/xml/developers/multischema/index.html
Si nos vemos en la necesidad de utilizar un servicio de validación en línea, tenemos los siguientes sitios a nuestro disposición.
http://validator.w3.org/: El validador W3C oficial para HTML, aunque cuenta con un soporte limitado para XML.
http://validator.w3.org/: El validador W3C oficial para HTML, aunque cuenta con un soporte limitado para XML.
http://www.xml.com/pub/a/tools/ruwf/check.html: Validador de xml.com basado en el procesador de Lark.
http://www.ltg.ed.ac.uk/~richard/xml-check.html: Validador del grupo de Tecnologías de Lenguaje, basado en el parser RXP.
http://www.stg.brown.edu/service/xmlvalid/: El excelente validador del Scholarly Technology Group de la Universidad de Brown. Es el único del grupo que puede revisar documentos que no están on-line
Existe una gran cantidad de software libre y propietario para el trabajo con la especificación XSL. En general, las herramientas propietarias tienden a realizar todo el "trabajo sucio" ellas solas, siendo deber del usuario entregar el documento XML en el formato adecuado. Las herramientas libres, en cambio, suelen especializarse en una sola tarea y es labor del usuario unirlas para lograr el resultado esperado.
Tomando en consideración el diagrama para publicación de Docbook, nombraremos las herramientas de código abierto que pueden ser utilizadas para este propósito. Aparecen remarcadas aquellos motores que cuentan con mejor soporte para Docbook.
El procedimiento para instalar y usar jEdit con el fin de crear documentos Docbook es el siguiente
Procedimiento A.1. Procedimiento para instalar jEdit
Instalar Java Runtime Enviroment: Dirigirse a la página de descargas de Sun, y buscar el último Java Runtime Enviroment (JRE) disponible, necesario para correr aplicaciones Java. Si se trabaja sobre plataforma linux, se puede ocupar alternativas como Blackdown
Instalar jEdit: Dirigirse a la página de descargas de jEdit y descargar una versión de acuerdo a la plataforma. En Windows es altamente recomendable utilizar el formato ejecutable.
Activar soporte para DTD Docbook en jEdit
El plug-in XML de jEdit incluye, a la fecha, el DTD para Docbook 4.2. Los pasos siguientes sólo son necesarios si se quiere instalar una versión más reciente
Descargar el DTD de Docbook: El DTD de Docbook puede ser descargado desde la URL http://www.docbook.org/xml/index.html. Se debe seleccionar la versión estable más reciente, o sea, aquella que no tiene una b (beta) al final del número de versión. El archivo zip que se ofrece en la página debe descomprimirse en un lugar conocido, por ejemplo c:/docbook/dtd