Xalan y Javadoc
(This is a reprint of the original post)
Después de muchas pruebas, he conseguido procesar documentos de DocBook con Ant de una forma satisfactoria. Como sabemos todos los que hemos usado alguna vez DocBook XML, se necesita un procesador de XSLT para convertir el documento fuente, que está en XML, a otros formatos, como HTML. Las alternativas libres más conocidas son Xalan, Saxon y libxml/xsltproc; ya hablé de ellas hace unos meses. Por motivos variados, estaba especialmente interesado en superar las dificultades que encontré en su momento cuando probé Xalan. Así que me puse manos a la obra.
En primer lugar, para que los XInclude funcionen bien, hay que ajustar algunas variables para que Xalan use Xerces como analizador de XML. No basta con meter Xerces en el CLASSPATH: hay que evitar que Java use la versión de Xerces que incorpora en sus bibliotecas estándar. Los XInclude son muy interesantes porque permiten partir las fuentes en XML de un documento DocBook.
Luego ataqué el problema de los catálogos, que no había conseguido dominar entonces. Los catálogos son ficheros que indican a las aplicaciones XML (como Xerces y Xalan) dónde pueden encontrar los recursos que necesitan en el disco duro, sin acudir a la red. Gracias a ellos, las aplicaciones no tienen que descargar el DTD de DocBook continuamente, por ejemplo. Al final encontré el problema: el catálogo correspondiente a DocBook en Debian tiene una especificación de DOCTYPE, y por tanto, ¡se necesita un catálogo para el catálogo! Como no encontré la forma de hacer eso, estuve mirando un poco más y descubrí que el DOCTYPE no está en las fuentes originales de DocBook, sino que es un añadido del empaquetador para Debian. La solución fue fácil: usar el tarball original y pasar del paquete Debian (docbook-xml). Con esto conseguí procesar mis documentos DocBook sin conexión a la red, completamente en local.
Por último, me ocupé de la velocidad de procesamiento. Ciertamente, Xalan no es rápido. Transformar un documento mediano en mi iBook le lleva 34 segundos. Pero Xalan dispone de una característica muy interesante: puede funcionar como evaluador parcial, y generar un programa especializado en aplicar una transformación XSL concreta a cualquier entrada XML. En otras palabras: puede compilar una transformación XSL para generar un programa que la aplica. El truco se llama XSLTC, y tras bastantes ciclos de prueba y error (hasta que descubrí que el parámetro -xd era obligatorio), conseguí hacerlo funcionar.
La primera transformación de un documento usando XSLTC lleva bastante tiempo. Para el mismo documento del ejemplo anterior, ahora tarda casi 49 segundos. Pero las siguientes transformaciones sobre otros documentos son más rápidas, de 23 segundos. Es evidente que el ahorro de tiempo es muy significativo si se pretenden transformar muchos documentos.
Hoy me he dedicado monográficamente a Xalan. Para mañana, intentaré echar un vistazo al debate que algunos bloggers mantienen sobre Javadoc (primera intervención de Martin Fowler, réplica de Torsten Curdt).