De RSS a XHTML con XSL
Víctor Manuel Jáquez LealComo varios de ustedes sabrán, compré el dominio ceyusa.com y pues, como en todo lo que hago, me he dilatado en migrar del viejo sitio al nuevo. Pero he aqui la razón:
Una de las partes fundamentales de mi página personal es la agrupación de noticias de varios sitios web que frecuento, para así no visitarlos todos cada día; simplemente veo los encabezados y si hay algún título interesante, lo leo; no pierdo tiempo ni ancho de banda.
La forma como muestro los títulos de las noticias publicadas en los sitios escogidos es a través de un formato XML conocido como RSS. El RSS es una aplicación XML, conforme a la especificación RDF.
Pero vayamos más despacio. Con fines de convencionalismo, digamos que el XML es una forma de formatear texto derivado del SGML, con el cual podemos definir “aplicaciones XML”, o lenguajes de marcado, tales como el XHTML, DocBook, XSQL, RDF, etc. Estas aplicaciones XML tienen una función específica, de acuerdo a la semática de la información que comunican. Específicamente, el RDF (Resource Description Framework), tiene como función comunicar metainformación, es decir información sobre la información almacenada. Podemos exponer un catálogo bibliográfico en RDF, catálogos hemerográficos, de software y así. Finalmente diremos que el RSS (RDF Site Summary) es una subaplicación del RDF para sitios web, donde se expone los documentos publicados por un servidor en el World Wide Web.
Ahora, actualmente exiten cuatro diferentes versiones del RSS: 0.9, 0.91, 0.92 y 1.0, cada una defendida por los diferentes grupos que las propusieron. No obstante, cada una es incompatible de la otra desde el punto de vista del análisis semántico. Y cada sitio que expone su metainformación en esta forma, utiliza la versión que cree más conveniente para sus fines.
Incialmente, para realizar mi objetivo, utilizé un analizador sintáctico en Perl (XML::Parser), donde, sin verificar la validez del documento RSS descargado, buscaba por las marcaciones deseadas y las convertía en marcaciones en HTML. Esta forma de hacer las cosas es la más trivial y efectiva, además de la más implementada en la mayoría de los sitios que ofrecen la agrupación de noticias externas. Esto es así ya que de esta forma no importa la versión de RSS que se analize, simplemente buscamos por marcas como link, channel, description (las cuales son comunes en las diferentes versiones), extraemos su contenido y lo reescribimos en HTML.
Sin embargo, el año pasado, junto con mi afortunado encuentro con Gentoo, descubrí una nueva manera de generar HTML, separando de manera elegante el contenido de la presentación (una obsesión para todo programador): Las transformaciones con XSL.
Tanto el XHTML como el RSS y el DocBook son aplicaciones XML; el XSL es un lenguaje (y también es una aplicaicón XML) que nos permite aplicar una hoja de estilo a dichos formatos y convertirlos a cualquier otro. Por ejemplo, mediante XSLT (XSL Transformations) podemos tomar un documento en DocBook y convertirlo a XHTML. Como resultado de esto último podemos mantener constante nuestro contenido en DocBook y convertirlo a XHTML cambiando la presentención cuántas veces queramos, de la manera qué queramos. Hermoso ¿no?.
Precisamente Gentoo así es como mantiene su página web. Ellos hicieron su propia aplicación XML para describir su información, noticias, documentación, etc. Y cada que hay una modificación en el CVS, reconstruyen su sitio con XSLT, ahorrandose sobreprocesamiento de acceso a una base de datos, CGI, y demás elementos que consumen recursos considerables por cada petición que se le haga al sitio.
Así que un día, mientras cavilaba en cómo reestructurar mi página personal, con mi nuevo dominio, pensé en esto: por qué no, en lugar de utilizar un analizador sintáctico y poner el código “duro” la presentación, hago una transformación XSLT de RSS a XHMTL. ¡Sería salvaje, hombre!
Así que manos a la obra. Y cuando digo manos a la obra no me refiero a programar, si no a buscar en el Web si ya había hecho algo parecido, y en esos casos Google es tu mejor amigo. Encontré muchas opciones, varias hojas de estilos XSL, implementadas en varios lenguajes (Perl, PHP, Python, etc.). Pero los problemas comenzaron ahí.
Actualmente tengo un objetivo: aprender Python. Así que tenía que utilizar Python. Ahora, ¿qué bibliotecas utilizar? ¿4Suite? ¿libxml/libxslt? ¿otra? Por mi apego y amor a Gnome, decidí utilizar la famosa biblioteca libxml2/libxslt, donde su autor, Daniel Veillard, había integrado ligas a Python de su código en C.
Después siguió el tortuoso camino de buscar una bonita hoja de estilo en XSL. Hay varias, el problema es que la mayoría solo transforma una versión de RSS, y debido a que cada sitio utiliza la versión que le da la gana, pues muchos sitios me quedaba sin transformalos.
Encontré varias alternativas para bordear este atolladero: la primera era utilizar unas hojas XSL que convertían de RSS 0.9x a RSS 1.0 y después de RSS 1.0 a XHTML, pero eso es demasiado procesamiento para una frivolidad como ésta. Otra opción era reimplementar el módulo Perl XML::RSS::Tool, el cual toma cualquier documento RSS, lo parsea, lo vuelve a generar en RSS, pero ya en formato 0.9 para todos, y finalmente le aplica la transformación XSLT; otra forma de sobreprocesamiento sin sentido.
Todo esto minó mi espíritu. Estaba a punto de abandonar el barco, cuando encontré una joyita: protozilla-rss. Protozilla es un agregado al Mozilla para manejar otros contenidos y protocolos. Protozilla-rss es una implementación en Protozilla para renderizar en XHTML documentos RSS, utilizando lo que yo pretendía: XSLT puro. Sin embargo, Protozilla-rss a su ves, utilizaba una hoja de estilo del proyecto Reptile. Esta hoja de estilo, toma cualquier versión del RSS, busca las leves diferencias, las homogeiniza, y las convierte. Bastante ingenioso.
Para no hacer el cuento tan largo, tomé la hoja de estilo de Kevin A. Burton, la recorté para mis modestas necesidades y logré finalmente lo que deseaba.
Pueden ver mi versión recortada de la hoja XSL en mi nuevo, y aún sin terminar, sitio, junto con el programa en Python que hace la transformación. Este programa corre dentro de un proceso Cron, el cual lee mi lista de sitios a mostrar, extrae el RSS, lo convierte a una tabla en XHTML y lo guarda en la base de datos. Por último, me frontend en PHP simplemente lee de la base de datos esas tablas y las inserta en un documento XHTML.
Espero se diviertan.