Hogar Mapa Indice Busqueda Noticias Arca Enlaces Sobre LF
[Top bar]
[Bottom bar]
Este documento está disponible en los siguientes idiomas: English  Castellano  Deutsch  Francais  Italiano  Nederlands  Portugues  Russian  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Author]
por Egon Willighagen

Sobre el autor:

Recibirá este año su título de doctor en Química. Juega al baloncesto y participa en LinuxFocus y Linux en general.
Contenidos:

Empleo de XML y XSLT para desarrollar LinuxFocus.org (Holanda)

[Illustration]

Resumen:

Este artículo contiene la presentación hecha en el Encuentro de Software Libre en Burdeos en Julio. Explica la base de datos en XML utilizada para la generación automática del sitio Web LinuxFocus.org (Holanda)



 

Introducción

Hasta hace poco, el sistema utilizado para documentar el proceso de traducción en LinuxFocus consiste en un conjunto de ficheros ASCII, incluyendo resdb.txt, issuedb.txt y maindb.txt. Estos ficheros tienen un formato fijo y son utilizados para generar las paginas web. Sin embargo, son dificiles de ampliar, y la diferente naturaleza de los datos hacen dificil el control de la información disponible en un artículo.

LinuxFocus no generaba automáticamente demasiado contenido web cuando se instauró la nueva base de datos. Como editor web en el Equipo Holandés, yo estaba muy interesado en tener los ficheros index.html del sitio web generados dinámicamente. Editar bastantes ficheros HTML cada vez que un artículo iba a ser traducido, suponía un gran esfuerzo y provocaba errores en los links a otras páginas. Por tanto, decidí crear un sistema donde pudiera añadir información facilmente y donde pudiera generar los indices de las páginas del sitio web de una forma cómoda y sencilla. Comencé a trabajar en ello en el verano del 2000.

La elección de XML fue un poco arbitaría. Me sugirieron utilizar una base de datos relacional, pero yo tenía bastante experiencia en XML y preferí un sistema basado en ficheros de texto. Ideé un nuevo sistema de estructuración de la base de datos porque así podría usar un tipo de identificador en vez de los 2 o 3 esquemas que tenía hasta entonces. Guido Socher hizo todo el renombramiento con un gran esfuerzo (muchas gracias!!!)

La Definición de tipo de Documento (DTD) todavía está en desarrollo y una pequeña cantidad de contenido estaba en la base de datos con propósito de hacer pruebas. Después de haber añadido unos 20 artículos esto se convirtió claramente en un gran proyecto. Escribimos scripts para poder usar los antiguos ficheros pero no toda la información de la base de datos nueva estaba disponible y, como hemos explicado, la información que estaba disponible estaba sobre bastantes ficheros. Afortunadamente, Floris Lambrechts se involucró en el proyecto, y he de agradecerle profundamente por añadir la mayoría del contenido a la base de datos. Sin su ayuda, el sistema todavía no estaría disponible en estos momentos.

Junto con el nuevo formato vino la posibilidad de añadir nueva información. Y el año pasado fueron añadidas nuevas clases de datos a la base de datos. Se añadieron la tabla de autores, traductores, editores y otra gente involucrada en LinuxFocus, además de la localización de los ficheros. La razón de añadirlos fue que desde el principio de LinuxFocus había bastantes esquemas de nombramiento de ficheros. Durante el reformateo de la base de datos, fue reducido a dos esquemas. Algunos ficheros usaban el lado del servidor y usaban la extensión .shtml y los artículos antiguos utilizaban extensiones .html. La etiqueta puede ser usada para sobreescribir un fichero por defecto. (el actual por defecto utiliza "articulo"+número de artículo + ".shtml". Esto podría incluir un ".meta" opcional en caso de que se encontrase en el metaformato de LinuxFocus)

Una vez la base de datos hubo alcanzado un tamaño considerable, comencé a hacer pruebas de rendimiento sobre los programas que el software que había escrito. El actual XSLT y hojas de estilo no son la primera implementación. Estan precedidas por código en Perl. Pero con el aumento de tamaño de la base de datos, el rendimiento se hizo bastante importante. El primer intento no fue bastante bueno. Sin embargo antes de explicar las herramientas, explicaré el formato de la base de datos.

 

La Definición del Tipo de DocumentoThe Document Type (DTD)

XML, lo primero de todo, es un lenguaje de especifación para lenguajes de marcado. La sintaxis define la secuencia de caracteres permitidos en un documento XML "bien formado" . Este dice que un documento es un elemento raiz y que un elemento consiste en una etiqueta inicial, contenido (texto, elementos hijos ó ambos) y una etiqueta final. Estas etiquetas consisten en un caracter "<" seguido por un nombre y al final un caracter ">". Una etiqueta final debe contener un "/" justo antes del nombre. Las etiquetas (como <br> en HTML) toma un "/" después del nombre. Una etiqueta de comienzo debe contener atributos y estos también deben tener una sintaxis concreta. Ejemplos de etiquetas XML son:

<greeting>Hello, world!</greeting>
o para una etiqueta vacía
<br/>

Además de una sintaxis, el lenguaje también define la semántica. Esta describe como se asocian unos elementos con otros. Por ejemplo, la semantica en HTML dice que la etiqueta <body> debería ser contenida por el elemento <html>( y no hay otra posibilidad de interpretarla). La semántica describe también que el elemento <img> es vacio como ocurre con <br>. Si esa fuera la semántica dada en una notación formal, las etiquetas podrían ser analizadas con un programa y usadas para validar el documento usando dicha semántica. Una de esas notaciones es la conocida como Definición del tipo de Documento (Document Type Definition), ó de forma abreviada, DTD. Si un documento pasa el proceso de validación se le conoce como valido. Se Debe ser muy cuidadoso con la validación, pues XML es muy estricto.

Ahora que conocemos lo que es una DTD , vamos a ver la DTD de la base de datos de LinuxFocus. Vamos a trabajar siempre sobre el mismo ejemplo. Examinando este ejemplo podrás hacerte una idea de la información que nuestra base de datos contiene ( DTD de la base de Datos de LinuxFocus).

 

<database>

El elemento raíz en la base de datos, ó una de sus extensiones/localizaciones es el elemento <database> .

<!ELEMENT database    (themes?, persons?, issues?, articles?)>
    

Observese que la "?" significa que el elemento hijo podría aparecer cero ó una vez. Por tanto, la base de datos podría contener información acerca de temas (themes), personas (persons),asuntos (issues) y artículos (articles). Ya que este ejemplo es demasiado trivial vamos a ver un ejemplo más interesante.

 

<themes>

Los temas están contenidos dentro del elemento <themes> que es un elemento hijo de <database>. Cada tema tiene un único Identificador y un título, y opcinalmente un resumen (desc) y una imagen (img).

<!ELEMENT themes      (theme+)>
  <!ELEMENT theme       (title*, desc?, img?)>
    <!ELEMENT title       (#PCDATA)>
    <!ELEMENT desc       (#PCDATA)>
    <!ELEMENT img         (EMPTY)>
    

Algunos de estos elementos pueden tener atributos. Los atributos también son definidos en el DTD. Cualquier contenido puede ser atribuido con el elemento xml:lang que indica el lenguaje en el que se describe ese elemento. El valor del atributo debe ser cualquier token de acuerdo con la ISO 3166 standard para los códigos de cada pais. Ejemplos son: "en", "fr" and "nl". En todos, el identificador y los atributos xml:lang son especificados en la especificación original de XML y son parte de la sintaxis XML

<!ATTLIST theme       id            ID            #REQUIRED>
<!ATTLIST title       xml:lang      NMTOKEN       #REQUIRED>
<!ATTLIST desc        xml:lang      NMTOKEN       #REQUIRED>
<!ATTLIST img         src           CDATA         #REQUIRED>
    

Un ejemplo de base de datos podría ser la siguiente:

<database>
  <themes>
    <theme id="hw">
      <title xml:lang="en">Hardware</title>
      <img src="Hardware.jpg"/>
    <theme>
  <themes>
</database>
    
 

<issues>

Los Asuntos están contenidos en el elemento <issues> . Como ocurría en los temas, cada asunto tiene un único identificador.

<!ELEMENT issues      (issue+)>
  <!ELEMENT issue       (title+, published?, file*)>
    <!ELEMENT title       (#PCDATA)>
    <!ELEMENT published   (EMPTY)>
    <!ELEMENT file        (#PCDATA)>
    

El elemento <published> indica los asuntos publicados. El siguiente asunto y algunos "pseudoasuntos" traducidos de algún lenguaje a inglés, no tienen ese elemento. El elemento tiene también el atributo @xml:lang. El elemento <file> indica el fichero el cual el asunto será almacenado. No debería ser un puntero al index.html, porque éste es el utilizado para determinar la localización de los ficheros.

Un ejemplo (notese que usamos el atributos @code para acortar):

    <issue id="ToBeWritten" code="999996">
      <title xml:lang="en">Not yet written articles</title>
    </issue>
    <issue id="September2001" code="200109">
      <title xml:lang="en">September2001</title>
    </issue>
 

<persons>

La información acerca de los autores y traductores está almacenada en el elemento <person>. Cada "person" tiene un único identificador.

<!ELEMENT persons (person+)>
<!ELEMENT person
              ((name|email)*,(homepage|nickname|desc|team)*)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT homepage (#PCDATA)>
<!ELEMENT nickname (#PCDATA)>
<!ELEMENT desc (#PCDATA|%html-els;)*>
<!ELEMENT team EMPTY>
    

Una "person" tiene la siguiente información: un nombre, una dirección de email (ó más), página(s) web y un nick. Si la persona también forma parte del equipo de traducción, se añade el elemento <team>. Por ejemplo, la siguiente linea en el elemento <person> significa que Floris pertenece al grupo holandés (Dutch team) <xml:lang="nl"/>. Por último, cada persona tiene una descripción que puede contener enlaces a páginas.

Un ejemplo sería:

    <person id="nl-ew">
      <name>Egon Willighagen</name>
      <email>egonw@linuxfocus.org</email>
      <team xml:lang="nl"/>
    </person>
 

<articles>

Los artículos son, por supuesto, la parte más interesante de la base de datos.

  <!ELEMENT articles    (article+)>
    <!ELEMENT article     (title+,
        (file|personref|abstract|issueref|themeref|
         nometa|nohtml|translation|proofread)*)>
      <!ELEMENT abstract    (#PCDATA)>
      <!ELEMENT nohtml      EMPTY>
      <!ELEMENT nometa      EMPTY>
      <!ELEMENT translation
                   (personref*, (reserved|finished|proofread)*)>
      <!ELEMENT reserved    (#PCDATA)>
      <!ELEMENT finished    (#PCDATA)>
      <!ELEMENT proofread   (personref*, (reserved|finished)*)>
<!ATTLIST article     id            ID            #REQUIRED
                      xml:lang      NMTOKEN       #IMPLIED
                      type          (article|coverpage)
                                                  "article"
                      next          IDREF         #IMPLIED
                      prev          IDREF         #IMPLIED>
<!ATTLIST file        xml:lang      NMTOKEN       #REQUIRED
                      type          (target|meta) "target">
<!ATTLIST translation from          NMTOKEN       #REQUIRED
                      to            NMTOKEN       #REQUIRED>

    

Cada artículo tiene al menos un título, uno para cada lenguaje. El elemento <file> puede ser usado para dar la localización del fichero del artículo, tanto para el formato META y la versión HTML (ver el ejemplo de abajo). En los casos donde la versión META ó la HTML no estén disponibles, los elementos opcionales <nohtml/> y <nometa/> deberían ser usados. Cada artículo tiene un resumen (abstract). Este resumen es el que se utilizada dentro de la base de datos para crear los índice de las páginas web.

El elemento <article> tiene 5 atributos: el siempre requerido @ID, un atributo opcional xml:lang para determinar el lenguaje en el que fue originalmente escrito, un atributo @type usado para el comienzo de las páginas, que es usado en las traducciones (tambien tratadas como artículos). Por último, hay dos atributos ocpionales,@next y @prev, los cuales son usados para enlazar artículos con otros de naturaleza similar.

Un artículo es asociado a un asunto(issue) y a un tema (theme) con los elementos <issueref> y <themeref>. Ambos tienen un atributo @href .El valor de este atributo debe ser el identificador asociado al asunto ó al tema.

Por ejemplo:

<article id="article206" xml:lang="en">
  <title xml:lang="en">Using XML and XSLT to build
    LinuxFocus.org(/Nederlands)</title>
  <personref href="nl-ew"/>
  <issueref href="ToBeWritten"/>
  <themeref href="appl"/>
  <abstract xml:lang="en">
This article shows you how parts of the Dutch web site of LinuxFocus is
generated with XSLT tools from the XML database. It compares this with
the (very) much slower DOM tools in Perl.
  </abstract>
</article>

Un elemento <article> sería:

<article id="52">
  <title xml:lang="nl">Enlightenment</title>
  <file xml:lang="nl">Nederlands/July1998/article52.html</file>
  <translation from="en" to="nl">
    <personref href="nl-tu"/>
    <reserved>2000-09-06</reserved>
    <finished>2000-10-04</finished>
    <proofread>
      <personref href="nl-fl"/>
      <reserved>2000-10-04</reserved>
      <finished>2000-10-04</finished>
    </proofread>
  </translation>
  <abstract xml:lang="nl">
Enlightenment is een Linux window-manager met
uitgebreide mogelijkheden.  Dit artikel bespreekt
ze, samen met de installatie en de instelling
van E.  Dit alles is niet voor beginners daar
E op het moment nog in beta-stadium
verkeert.
  </abstract>
</article>

Dese cuenta de que esta traducción (planificada en un determinado tiempo) está hecha; y también la revisión de esta. En cualquier caso, la persona que hizo el trabajo está enlazada con los elementos <personref>.

Para todos estos elementos, el mejor tutorial es la propia base de datos:

 

Generación automática de páginas Web

Una de las razones por la que se creó este nuevo formato era la automatización en la creación de los índices. Vamos a ver como este formato nos va a permitir la generación de estas páginas web.

Primero, un poco de historia: La primera implementación usaba módulos en Perl para acceder a la base de datos. La interactuación era bastante aceptable, sin emargo la imbplemetación era muy lenta. La información estaba contenida en un contenedor XML llamado Document Object Model (DOM). La mayoría de las implementaciones para DOM, eran bastante lentas ó, al menos, mucho más lentas que la alternativa: Simple Application interface for XML (SAX).

Pero la tarea de generar una página web tenía una tercera alternativa mucho mejor: XSLT. Esta es un transformación basada en XML. Existen actualmente muchos procesadores XSLT son soportados por la mayoría de los lengaujes . Hace tiempo apareció un artículo en LinuxFocus sobre XML::XSLT, una implementación de XSLT para Perl. Desde la publicación de este artículo, han aparecido muchas más implementaciones. Aquí hay algunas que recomiendo:

Los ejemplos en el resto del artículo usarán Sablotron.

Un procesador XSLT toma dos ficheros como entrada: Uno es el fichero XML fuente utilizado para la transformación. El otro es una hoja de estilo XSL que define la transformación. Para la generación de páginas Web hay disponbiles las siguientes hojas de estilo XSLT:

Estas hojas de estilo no son las últimas versiones. Contacte conmigo ó con uno de nuestros editores en el equipo de traducción de Holanda para obtener la versiones más recientes.

Para generar el mainindex.html, por ejemplo, el grupo holandés ejecuta:

sabcmd stylesheets/mainindex.xslt db/lfdb.nl.xml > ../mainindex.html

Las hojas de estilo conocen donde está la base de datos raíz inglesa, y necesitan de conocer la base de datos como una entrada XML. Algunas hojas necesitan también parámetros adicionales:

sabcmd stylesheets/theme.xslt db/lfdb.nl.xml '$theme=appl' > ../Themes/appl.html

El índice Holandés index.html es también generado desde la base de datos, pero utiliza una configuración un poco más compleja. El index.html está hecho desde el lfpagecomposer de por Guid Socher desde un conjunto de ficheros de entrada preprocesados. Y estos ficheros de entrada preprocesados son generados desde un conjunto de ficheros con extensión .pre, tales como:

<H2>Vorige nummers</H2>

<p>Dit zijn de uitgaven van LinuxFocus in het Nederlands:
<ul>
<!-- macro xslt previssues -->
</ul>
<H2>Recent vertaalde artikelen</H2>
< macro xslt recently_translated -->

Estos ficheros son simplemente fragmentos de código HTML que, como una macro, aplican una hoja de estilo a la base de datos. El procesamiento está hecho con un programa llamado apply_stylesheets.pl que busca comandos <!-- macro xslt [stylesheet] --> y analiza la base de datos con el comando. Dese cuenta de que la extensión .xslt está omitida. Nuestro Makefile contiene:
%.shtml: %.pre
        @echo "Making $*..."
        @../../xml/bin/apply_stylesheets.pl $*.pre

Los ficheros *.shtml resultantes son usados por el script lfpagecomposer. Las hojas de estilo que son usadas para generar el index.html son: issuetoc.xslt, previssues.xslt y recently_translated.xslt.  

Localizando

Para usar este sistema para otros lenguajes, necesitas hacer lo siguiente:

  1. Localizar la base de datos XML (por ejemplo lfdb.nl.xml)
  2. Localizar las hojas de estilo

El siguiente paso es un poco deplorable. En un principio, solo el texto de salida necesita ser localizado, pero las hojas de estilo no tienen una propiedad de localización todavía. Esto es posible e intentaré ver como se implementa.

Recomiendo diseñar una DTD usando un editor XML conocido. En Emnacs, por ejemplo, usa el modo principal psgml Este te proporcionará la posibilidad de validar el documento (con nsgmls). Esto ayudará a eliminar bastantes errores. En Emacs también puedes usar el botón derecho del ratón para ver los elementos y atributos que puedes insertar en un determinado lugar de la especificación del fichero XML. (Gracias a Jaime Villate por su excelente charla en la LSM conferenia en Burdeos este año.)

Otra gran ayuda es la localización Holandesa de la base de datos XML. Si tienes problemas ejecutándola puedes consultar este fichero. Debes tener en cuenta que el aunque el contenido está la mayoría en Holandés, puedes ver como están organizados los elementos dentro de la base de datos. Si, aún así, tienes dudas, también puedes enviarme un email.

Localizar las hojas de estilo es probablemetne un poco delicado. El texto está entremezclado con los comandos XSLT. No debes tocarlo ( a no ser que tu sepas de verdad lo que estás haciendo). Planeo en un futuro localizar la shojas de estilo de forma que solo necesites editar un fichero que contenga las traducciones de los comandos XSLT, pero esto todavía no está hecho.  

Planes futuros

El documento anterior ayudarte para comenzar en el tema. La mayoría de las cosas se pueden copiar/pegar desde los ficheros Holandeses. Todos los ficheros están bajo licencia FDL y GPL. En el año próximo estos son mis planes para el sistema:

 

Formulario de "talkback" para este artículo

Cada artículo tiene su propia página de "talkback". A través de esa página puedes enviar un comentario o consultar los comentarios de otros lectores
 Ir a la página de "talkback" 

Contactar con el equipo de LinuFocus
© Egon Willighagen, FDL
LinuxFocus.org

Pinchar aquí para informar de algún problema o enviar comentarios a LinuxFocus
Información sobre la traducción:
en -> -- Egon Willighagen
en -> en Lorne Bailey
en -> es Moisés González

2001-10-09, generated by lfparser version 2.9