<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /><title>Introducción a AxKit</title><link rel="stylesheet" href="BrunoV_html_docbook.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.50.0" /><meta name="keywords" content="axkit, XML, Perl" /></head><body><div class="article"><div class="titlepage"><div><h1 class="title"><a id="id3034114"></a>Introducción a AxKit</h1></div><div><div class="authorgroup"><div class="author"><h3 class="author">Carlos Escribano</h3></div></div></div><div><div class="legalnotice"><p class="legalnotice-title"><b>DC.Rights</b></p><p><a href="http://opencontent.org/openpub/" target="_top">OpenPublication</a></p></div></div><div><div class="abstract"><p class="title"><b>Abstract</b></p><p>Axkit es un módulo de Apache para presentar documentos XML o de otros formatos estructurados. Si queremos utilizar directamente en la web nuestros documentos de OpenOffice, DocBook, o MusicML, sin realizar transformaciones previas a HTML, ésta es la herramienta que buscamos.</p><p>AxKit permite también crear páginas dinámicas e incorporar datos externos, de bases de datos u otras fuentes. Están disponibles numerosas extensiones, y es fácil añadir otras nuevas, con Perl. Es un producto derivado de  Cocoon, otro extradordinario entorno de publicación, pero es más evolucionado y versátil. Bienvenidos a la potencia de XML en la web.</p></div></div><hr /></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt>1. <a href="#id2962896">Primeras Impresiones</a></dt><dt>2. <a href="#id3035785">La tubería de AxKit</a></dt><dd><dl><dt>2.1. <a href="#id3035925">Procesadores de Librerías de etiquetas (taglibs)</a></dt><dt>2.2. <a href="#id2964624">Máquinas SAX</a></dt><dt>2.3. <a href="#id2964811">Procesador de XSLT</a></dt><dt>2.4. <a href="#id2964852">Procesador de XPathScript</a></dt><dt>2.5. <a href="#id2964962">Filtros para salidas en PDF (PassiveTeX, HtmlDoc, AxPoint)</a></dt><dt>2.6. <a href="#id2965032">Filtro para salidas gráficas</a></dt></dl></dd><dt>3. <a href="#id2965085">Instalación y Configuración</a></dt><dd><dl><dt>3.1. <a href="#id2965093">Instalación</a></dt><dt>3.2. <a href="#id2965188">El uso de directivas en la configuración de Apache</a></dt><dt>3.3. <a href="#id2965400">Esquema general de la configuración de AxKit</a></dt><dt>3.4. <a href="#id2960697">Configuración mínima</a></dt><dt>3.5. <a href="#id2960843">Configuración de los estilos</a></dt><dt>3.6. <a href="#id2961437">Configuración de una máquina SAX</a></dt><dt>3.7. <a href="#id2961529">Configuración para el procesado de Librerías de etiquetas</a></dt><dt>3.8. <a href="#id2961608">Configuración de XPathScript</a></dt></dl></dd></dl></div><div class="section"><div class="titlepage"><div><h2 class="title" style="clear: both"><a id="id2962896"></a>1. Primeras Impresiones</h2></div></div><p><a href="www.axkit.org" target="_top">AxKit</a> es un servidor de aplicaciones XML para <a href="http://www.apache.org/httpd.html" target="_top">Apache</a> y forma parte del <a href="http://xml.apache.org/" target="_top">Apache XML Project</a>. La primera utilidad de AxKit es la de publicar documentos XML. Cuando el navegador los solicita,y a través de diversas tranformaciones, entrega un documento de un tipo u otro: Normalmente será un HTML estándard, pero podría ser también un HTML reducido para navegadores de texto, como Lynx, o la versión para imprimir, en PDF. En la forma más sencilla de trabajo, se comportaría como un procesador XML para la web, sirviendo HTML, Texto, PDF, WML, RTF, Braille o cualquier otra salida estructurada, como lo haríamos desde la línea de comandos con <a href="http://xml.apache.org/xalan-j/" target="_top">Xalan</a> o <a href="http://xmlsoft.org/XSLT/xsltproc2.html" target="_top">XSLTProc</a>, ayudados de utilidades como <a href="http://xml.apache.org/fop/" target="_top">FOP</a>.</p><p>AxKit entrega al final un documento personalizado, que no es <span class="emphasis"><em>strictu sensu</em></span> el contenido original, sino la forma como lo deseamos ver. Las ventajas de este planteamiento son muchas:</p><div class="itemizedlist"><ul type="disc"><li><p>Completa separación de contenido y presentación. El texto original se ocupa estrictamente de los contenidos, no ha de incluir información de cómo debe ser presentado.</p></li><li><p>No alteración de los contenidos originales. El documento que queremos mostrar se puede utilizar en contextos no orientados a la web, y tratado con las herramientas que sean más adecuadas. Podemos hacer en él cuantas modificaciones deseemos, y, puesto que presentación y contenido están separados, todas las modificaciones en el original surten efecto inmediato, sin necesidad de alterar la capa de presentación. Lo contrario también es cierto: Cuando modifiquemos el estilo de nuestra web los originales no se ven afectados, no hemos de reacondicionarlos de nuevo.</p></li><li><p>El formato de los documentos a presentar no ha de ser HTML, se puede elegir cualquier formato estructurado.</p></li><li><p>Se utilizan formatos y herramientas estandard. Ello es una garantía para la continuidad de los datos y para su portabilidad a otros sistemas.</p></li></ul></div><p>Pero AxKit está integrado con <a href="http://www.perl.com/" target="_top">Perl</a>, y contiene una estructura potente y abierta, que le permite trabajar en conjunto con otros módulos de Perl, por lo que sus capacidades se multiplican. En la más pura tradición del <a href="http://www.perldoc.com/perl5.8.0/pod/perlfaq1.html" target="_top">TMTOWTDI</a> de Perl, las técnicas que incorpora son de lo más variado, y el usuario podrá encontrar la solución más adecuada a sus necesidades, desde configuraciones estrictamente limitadas a los estándares XML, hasta procesos personalizados donde se mezcla código y datos en busca de facilidad de construcción. Los métodos para conseguir el resultado final son:</p><div class="itemizedlist"><ul type="disc"><li><p>Incorporación de documentos externos. Este es uno de los procedimientos habituales de la generación de contenido dinámico. La incorporación se puede llevar a cabo en cualquier momento del proceso del documento XML, y es posible tambien hacerlo en las de hojas de estilo, por lo que se puede modificar el contenido tanto de los documentos XML como de los filtros a aplicar.</p></li><li><p>Conversión de otros formatos estructurados a XML. El camino habitual para ello es el de los <a href="http://axkit.org/wiki/view/AxKit/ProviderHowTo" target="_top">proveedores</a>. Se trata de programas que convierten un formato estructurado en XML, a patir del cual se inicia el tratamiento habitual de AxKit. Gracias a ellos podemos presentar directamente en la web documentos de otros formatos. Así en CPAN están disponibles proveedores para <a href="http://search.cpan.org/author/MSERGEANT/Apache-AxKit-Provider-OpenOffice-1.02/OpenOffice.pm" target="_top">OpenOffice</a>, <a href="http://search.cpan.org/~msergeant/AxKit-Provider-HTML-1.0/" target="_top">HTML</a> y
<a href="http://search.cpan.org/author/MSERGEANT/Apache-AxKit-Provider-PodSAX-1.00/PodSAX.pm" target="_top">POD</a>, y es sencillo construir uno para incorporar datos de cualquier aplicación.</p><p>También es posible la conversión en otros estadios del procesamiento, a través de generadores SAX (drivers), que son programas que convierten documentos en formatos estructurados diversos a XML. AxKit puede invocarlos en medio del procesamiento de un documento normal XML, por ejemplo al insertar documentos externos.</p><p>En CPAN hay generadores SAX para un buen número de formatos, como <a href="http://search.cpan.org/author/ISTERIN/XML-SAXDriver-Excel-0.06/Excel.pm" target="_top">MS-Excel</a>, <a href="http://search.cpan.org/author/ERIKRAY/XML-SAX-RTF-0.1/RTF.pm" target="_top">RTF</a>, <a href="http://search.cpan.org/author/PETERW/SVG-Parser-0.97/Parser/SAX.pm" target="_top">SVG</a>, <a href="http://search.cpan.org/author/MSERGEANT/Text-WikiFormat-SAX-0.03/lib/Text/WikiFormat/SAX.pm" target="_top">TWikiFormat</a>, <a href="http://search.cpan.org/author/JOHANVDB/XML-Generator-Pdb-0.1/lib/XML/Generator/Pdb.pm" target="_top">PDB</a>, <a href="http://search.cpan.org/author/ISTERIN/XML-SAXDriver-CSV-0.07/CSV.pm" target="_top">CVS</a>, <a href="http://search.cpan.org/author/ASCOPE/XML-SAXDriver-vCard-0.05/lib/XML/SAXDriver/vCard.pm" target="_top">VCard</a>, <a href="http://search.cpan.org/author/PERRAD/WAP-SAXDriver-wbxml-2.03" target="_top">wbxml</a> o <a href="http://search.cpan.org/~msergeant/XML-Generator-DBI-1.00/" target="_top">DBI</a> (acceso a Bases de Datos).</p></li><li><p>Utilización de elementos XML de contenido dinámico. Las librerías de etiquetas (<a href="http://java.sun.com/products/jsp/taglibraries.html" target="_top">taglibs</a>) son elementos XML que encapsulan código y se expanden tras ser procesadas para dar lugar a un texto XML que las sustituye. Provienen de <a href="http://java.sun.com/products/jsp/jstl/index.html" target="_top">JSP</a>, aunque a AxKit llegan de la mano de <a href="http://wiki.cocoondev.org/Wiki.jsp?page=XSP" target="_top">XSP</a> de Cocoon. Por este camino se incluyen fragmentos de código en los textos XML. En AxKit pueden utilizarse tanto en los documentos XML que entran o se incorporan a la cadena de transformaciones (documentos XSP), como dentro de las hojas de estilo XSLT (hojas lógicas). Con ellas, la estructura del documento original no cambia, aunque se le incorporan elementos nuevos.</p></li><li><p>Transformaciones a través de filtros. El contenido del documento XML es modificado a su paso por un filtro, convirtiendo la estructura original en otra estructura nueva. AxKit permite incorporar filtros del tipo:</p><div class="itemizedlist"><ul type="round"><li><p><a href="http://www.saxproject.org/" target="_top">SAX</a>. El contenido del documento XML es transformado mediante un filtro SAX.</p></li><li><p><a href="http://www.w3.org/TR/xslt" target="_top">XSLT</a>. La transformación se realiza de acuerdo con una hoja de estilo XSLT.</p></li><li><p><a href="http://search.cpan.org/~msergeant/XML-XPathScript-0.03/XPathScript.pm" target="_top">XPathScript</a>. Ésta es una implementación específica de AxKit. Son una alternativa a las hojas de estilo XSLT, y consisten en una plantilla del documento final en la que se insertan textos extraidos del documento XML que entran en el filtro, al estilo de los documentos <a href="http://www.asp.net/" target="_top">ASP</a>.</p></li><li><p>Filtros para salida como PDF. AxKit incorpora tres filtros para conversiones de documentos XML en PDF: Para documentos del tipo <a href="http://www.w3.org/TR/xsl/" target="_top">XSL-FO</a> , para los del tipo <a href="http://www.w3.org/TR/html401/" target="_top">HTML</a> y para un formato de presentaciones, <a href="http://axkit.org/wiki/view/AxKit/Apache%3A%3AAxKit%3A%3ALanguage%3A%3AAxPoint" target="_top">Axkit Slideshow XML</a>.</p></li><li><p>Filtros gráficos. AxKit permite la conversión desde <a href="http://www.w3.org/TR/SVG/" target="_top">SVG</a> a los formatos gráficos habituales: PNG, JPG, GIF,...</p></li></ul></div></li></ul></div><p>También es posible procesar directorios, en lugar de archivos. El punto de partida es tal como lo hace Apache mismo cuando muestra el contenido de un directorio a falta de un archivo descriptor, <tt>index.html</tt>, pero la potencia del procesado de AxKit permite construir documentos mucho más sofisticados. Mediante este camino se han logrado por ejemplo utilizar documentos no estructurados, en concreto <a href="http://search.cpan.org/author/NIKC/AxKit-App-Gallery-0.4/lib/AxKit/App/Gallery.pm" target="_top">imágenes</a>. </p><p>La presentación de contenidos en XML suele ser una tarea lenta en términos de proceso. Para abordar el problema AxKit provee de una cache propia, que permite almacenar el resultado en previsión de otras demandas, por lo que el resultado es muy rápido, casi siempre como si entregara paginas html estáticas.</p><p>Igualmente, si el navegador lo soporta, envía el resultado en formato comprimido, para que la transferencia sea aún más rápida.</p><p>AxKit es preferentemente una herramienta de servidor. Es posible también utilizarlo en entorno mixto, como un simple emisor de texto crudo XML, dejando al cliente la tarea de aplicar los estilos, aprovechando eso sí las funcionalidades de cache o control de errores de AxKit. Pero ni todos los clientes soportan tratamiento XML directamente, ni este último sistema ofrece ni de lejos las posibilidades del primero.</p><p>AxKit como vemos es una herramienta muy potente para construir webs. No provee de aplicaciones concretas ya terminadas, aunque sobre ella están disponibles un <a href="http://search.cpan.org/~msergeant/AxKit-XSP-Wiki-0.06/lib/AxKit/XSP/Wiki.pm" target="_top">wiki</a>, y dos CMS libres, <a href="http://www.callistocms.com/" target="_top">Callisto</a> y <a href="https://sourceforge.net/projects/xims/" target="_top">Xims</a>, además de un framework integrado con <a href="http://search.cpan.org/dist/HTML-Mason/" target="_top">Mason</a>, <a href="http://search.cpan.org/~jsmith/Uttu-0.06/lib/Uttu/Manual/Intro.pod" target="_top">Uttu</a>, y otras herramientas privativas.Por su versatilidad, permite diversos niveles de uso. No se necesitan conocimientos de programación para utilizarla, aunque sí evidentemente nociones de XML. Extender funcionalidades parcialmente soportadas o no previstas es sencillo, pero obviamente requiere algún conocimiento de Perl.</p></div><div class="section"><div class="titlepage"><div><h2 class="title" style="clear: both"><a id="id3035785"></a>2. La tubería de AxKit</h2></div></div><p>AxKit no trata de convertir el documento entrante de una sola vez en el que ha de ser su formato definitivo, sino que lo hace pasar por una tubería de procesadores, cada uno de ellos encargado de una tarea sencilla, que irá transformando el documento que recibe en otro, que entrega al siguiente, y así sucesivamente. El concepto deriva de la tubería UNIX, donde unos pocos comandos sencillos resuelven problemas muy complejos al dividirse el trabajo en pequeñas tareas que se van sucediendo unas detrás de otras.</p><p>En la tubería de AxKit, las cosas no son muy diferentes. En lugar de programar complejos sistemas de transformación de estructuras, es más fácil llevar a cabo pequeñas tareas, cada una de acuerdo con la tecnología más adecuada a la necesidad que se suscita.</p><p>Las ventajas son evidentes: La complejidad de las tareas es muy pequeña, y por tanto es más fácil de implementar y mantener. Al diferenciarse tanto, también puede dividirse el trabajo y especializarse. Dada la modularidad del planteamiento, es fácil insertar en la cadena código u hojas de estilo reutilizables, por lo que el esfuerzo se reduce considerablemente.</p><p>La tubería de procesadores es una idea que AxKit toma de <a href="http://xml.apache.org/cocoon/" target="_top">Cocoon</a>, aunque aquí como hemos visto es más versátil. Se sirve de que los documentos XML son estructuras, y es muy fácil convertir una estructura en otra, y también lo es fragmentar el problema de la conversión en pequeños subproblemas.</p><p>Además de los proveedores, que deben convertir documentos de otros formatos a XML antes de poder ser procesados como el resto, en la actualidad es posible incorporar a la tubería estos procesadores:</p><div class="itemizedlist"><ul type="disc"><li><p>Librerías de etiquetas (XSP)</p></li><li><p>Máquinas SAX</p></li><li><p>XSLT</p></li><li><p>XPathScript</p></li><li><p>PassiveTeX</p></li><li><p>HtmlDoc</p></li><li><p>AxPoint</p></li><li><p>Svg2AnyFormat</p></li></ul></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id3035925"></a>2.1. Procesadores de Librerías de etiquetas (<span class="emphasis"><em>taglibs</em></span>)</h3></div></div><p>Las librerías de etiquetas son programas que sustituyen los contenidos de elementos XML concretos. Los elementos son expandidos y reemplazados por nuevo código XML.</p><p>Por ejemplo, tenemos una librería de etiquetas que responde a los elementos <span class="emphasis"><em>articulo:titulo</em></span> y <span class="emphasis"><em>articulo:texto</em></span>. Su objetivo es expandir en un documento el título y resumen de varios documentos Simplified DocBook (sus elementos title y abstract). Construir una página de resúmenes es muy sencillo con esta librería de etiquetas.</p><p>AxKit permite las librerías de etiquetas en dos tipos de documentos: textos XSP y Hojas lógicas. Los primeros son textos XML que incluyen, mezcladas, las librerías de etiquetas. Típicamente constituyen la entrada de la tubería AxKit. Los segundos son hojas de estilo XSLT que incorporan librerías de etiquetas. En ambos casos, éstas son expandidas y sustituidas por otro texto.</p><p>Así una página XSP cuyo tipo de documento sea article en <a href="http://www.oasis-open.org/docbook/xml/simple/" target="_top">Simplified Docbook</a> podría contener algunas librerías de etiquetas dentro:</p><pre class="programlisting">        &lt;listitem&gt;
        &lt;para&gt;&lt;articulo:titulo&gt;
                &lt;articulo:archivo&gt;mitexto.dbk&lt;/articulo:archivo&gt;
        &lt;/articulo:titulo&gt;&lt;/para&gt;
        &lt;para&gt;&lt;articulo:resumen&gt;
                &lt;articulo:archivo&gt;mitexto.dbk&lt;/articulo:archivo&gt;
        &lt;/articulo:resumen&gt;&lt;/para&gt;
        &lt;/listitem&gt;</pre><p>Observese que los elementos a expandir se sitúan en un espacio de nombres diferente del principal. Cada librería de etiquetas posee un espacio de nombres conocido, al que es obligado hacer referencia en el documento (luego veremos cómo). Podemos trasladar esta estructura XML a la lógica de una aplicación: El programa <span class="emphasis"><em>articulo</em></span> contiene los métodos <span class="emphasis"><em>titulo</em></span> y <span class="emphasis"><em>resumen</em></span>, recibe a modo de parámetero la propiedad <span class="emphasis"><em>archivo</em></span> y su propósito es devolver los contenidos de los elementos <span class="emphasis"><em>title</em></span> y <span class="emphasis"><em>abstract</em></span> que se encuentran en el fichero <span class="emphasis"><em>archivo</em></span>. Así visto, programar la libreria de etiquetas <span class="emphasis"><em>resumenes</em></span> es una tarea sencilla, de unas pocas lineas. Sabiendo que el elemento abstract en Simplified DocBook ocupa una posición fija (article/articleinfo/abstract), la información deseada se puede recuperar con una sola función XPath. El título cuesta alguna línea más de código, pero es muy similar.</p><p>El archivo externo <span class="emphasis"><em>mitexto.dbk</em></span> podria contener:</p><pre class="programlisting">        &lt;article&gt;
                &lt;articleinfo&gt;
                        &lt;title&gt;Título del artículo&lt;/title&gt;
                        &lt;abstract&gt;
                                &lt;para&gt;Este es el resumen del artículo que buscábamos.&lt;/para&gt;
                        &lt;/abstract&gt;
                &lt;/articleinfo&gt;
                ...
        &lt;/article&gt;</pre><p>El documento resultante podría ser:</p><pre class="programlisting">        &lt;listitem&gt;
        &lt;para&gt;Título del artículo.&lt;/para&gt;
        &lt;para&gt;Este es el resumen del artículo que buscábamos.&lt;/para&gt;
        &lt;/listitem&gt;</pre><p>Como vemos los elementos del espacio de nombres <span class="emphasis"><em>articulo</em></span> han sido reemplazados por otros elementos que hemos construido mediante un programa, y los nuevos han quedado integrados en el espacio de nombres principal. Con este sistema hemos contruido el documento XML definitivo.</p><p>AxKit contiene una librería de etiquetas por defecto, <a href="http://axkit.org/wiki/view/AxKit/Apache%3A%3AAxKit%3A%3ALanguage%3A%3AXSP" target="_top">xsp</a>, que contiene unos cuantos métodos que encapsulan directamente código en Perl. Por ejemplo, podemos incluir directamente en el texto XML:</p><pre class="programlisting">&lt;xsp:logic&gt;if ($x eq 2) { &lt;para&gt;Este es el segundo articulo:&lt;/para&gt; };&lt;/xsp:logic&gt;</pre><p>Puede calificarse como una librería de etiquetas de bajo nivel, y los propios autores desaconsejan su uso, en favor de pasar el código a librerías de etiquetas específicas, donde sólo se indiquen los métodos y propiedades del código invocado, como las que hemos mencionado arriba.</p><p>CPAN contiene en la actualidad más de una veintena de librerías de etiquetas para propósitos generales, como <a href="http://search.cpan.org/dist/AxKit-XSP-ESQL/ESQL.pm" target="_top">AxKit::XSP::ESQL</a> que provee de elementos que contienen sentencias SQL, para usar bases de datos como fuente en los documentos,  <a href="http://search.cpan.org/author/MSERGEANT/AxKit-XSP-Param-1.4/Param.pm" target="_top">AxKit::XSP::Param</a>, para el paso de parámetros externos al propio documento, o <a href="http://search.cpan.org/author/MSERGEANT/AxKit-XSP-Cookie-1.41/Cookie.pm" target="_top">AxKit::XSP::Cookie</a>, para la gestión de cookies. La colección es bastante completa, y cubre las necesidades habituales en la construcción de webs. Las más importantes comparten la sintaxis con taglibs similares de Cocoon, por lo que existe un alto grado de compatibilidad a nivel de documentos fuente entre Cocoon y AxKit.</p><p>Si somos más exigentes, no obstante, construir nuestra propia librería es muy sencillo. Existen dos aproximaciones diferentes para hacerlo, <a href="http://search.cpan.org/author/MSERGEANT/AxKit-1.6.2/lib/Apache/AxKit/Language/XSP/TaglibHelper.pm" target="_top">Apache::AxKit::Language::XSP::TaglibHelper</a> y <a href="http://search.cpan.org/author/MSERGEANT/AxKit-1.6.2/lib/Apache/AxKit/Language/XSP/SimpleTaglib.pm" target="_top">Apache::AxKit::Language::XSP::SimpleTaglib</a>, ambas en la distribución misma de AxKit, que facilitan la tarea. Dos tutoriales de Barrie Slaymaker, <a href="http://www.perl.com/pub/a/2002/04/16/axkit.html" target="_top">XSP, Taglibs and Pipelines</a> y <a href="http://www.perl.com/lpt/a/2002/07/02/axkit.html" target="_top">Taglib TMTOWTDI</a> nos pueden servir de ayuda si deseamos hacerlo.</p><p>AxKit contiene en realidad tres procesadores de librerías de etiquetas, uno para gestionar la librería de etiquetas por defecto (XSP), y otros dos para tratar las construidas desde fuera de AxKit mismo (TaglibHelper y SimpleTaglib como hemos visto).</p></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2964624"></a>2.2. Máquinas SAX</h3></div></div><p>Una máquina SAX es una tubería de filtros y generadores SAX: La salida de un filtro es pasada como entrada al siguiente.</p><p>SAX es un analizador que trata el archivo de entrada al estilo de los flujos de UNIX, una sóla vez. Cuando se encuentra un patrón que nos interesa, se dispara un <span class="emphasis"><em>evento </em></span>, y lo podemos tratar: El principio o fin del documento, el principio o fin de un elemento, una cadena de caracteres, un comentario, una instrucción de procesamiento, el principio o fin de una sección CDATA o la presencia de una entidad de referencia, cualquiera de ellos nos permitirá tomar decisiones adecuadas.</p><p>Puesto que trata un flujo de datos, leyendo una sóla vez, SAX es muy rápido, y presenta claras ventajas frente a los analizadores que necesitan construir el árbol del documento primero (DOM o XPath), o sea retenerlo en memoria al completo. Si nuestros documentos a tratar son breves, los analizadores de árbol no son un inconveniente, pero si hemos de vérnoslas con documentos muy largos el coste en memoria y tiempo de proceso aumentan.</p><p>En CPAN hay unos cuantos Filtros SAX ya creados para desarrollar tareas genéricas. Por ejemplo, <a href="http://search.cpan.org/dist/XML-Filter-Namespace/lib/XML/Filter/Namespace.pm" target="_top">XML::Filter::Namespace</a> devuelve sólo los elementos del archivo XML que pertenecen a un espacio de nombres; <a href="http://search.cpan.org/author/ASCOPE/XML-Filter-Glossary-0.2/lib/XML/Filter/Glossary.pm" target="_top">XML::Filter::Glossary</a> reemplaza determinadas palabras con las entradas que les corresponden en una tabla y  <a href="http://search.cpan.org/author/GRANTM/XML-Filter-Sort-0.91/lib/XML/Filter/Sort.pm" target="_top">XML::Filter::Sort</a> ordena los &quot;registros&quot; de un documento XML, útil cuando se trata de documentos orientados a datos serializados. Si entre los existentes no solventamos nuestras necesidades es muy fácil implementar uno nuevo, con unas pocas líneas de Perl. Hay varios tutoriales en la web que lo hacen sencillo, como el de Kip Hampton <a href="http://www.xml.com/pub/a/2001/10/10/sax-filters.html" target="_top">Transforming XML With SAX Filters</a>. </p><p>La máquina SAX no está limitada a los filtros, también puede utilizar generadores SAX (también llamados drivers). Es posible, por ejemplo, que un filtro de la tubería convierta el flujo XML entrante en una estructura de otro tipo, y la entregue a un generador SAX en el siguiente paso de la tubería, para con ella seguir creando nuevas estructuras XML. Un uso complejo, sin duda, pero que nos da idea de la potencia de las máquinas SAX. De nuevo CPAN contiene unos cuantos generadores SAX para tareas genéricas, como , <a href="http://search.cpan.org/author/KHAMPTON/XML-Generator-PerlData-0.89/PerlData.pm" target="_top">XML-Generator-PerlData</a>, que  devuelve código XML a partir de estructuras de datos de Perl, como hashes. No obstante el camino más sencillo de utilizar los generadores es invocándolos desde un filtro, para incorporar datos externos al documento.</p><p>La referencia para el uso de máquinas SAX la encontraremos en el <a href="http://axkit.org/wiki/view/AxKit/Apache%3A%3AAxKit%3A%3ALanguage%3A%3ASAXMachines" target="_top">AxKit Wiki</a>. El tutorial de Kip Hanton, <a href="http://xml.com/lpt/a/2002/02/13/sax-machines.html" target="_top">Introducing XML::SAX::Machines, Part One</a>, y el más específico de Barrie Slaymaker, <a href="http://www.perl.com/lpt/a/2002/09/24/axkit.html" target="_top">An AxKit Image Gallery</a> son un buena ayuda para los que deseen construir máquinas SAX personalizadas.</p></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2964811"></a>2.3. Procesador de XSLT</h3></div></div><p>La gestión de las hojas de estilo XSLT descansa sobre un procesador XSLT externo, del que AxKit provee un módulo para hacer de interfaz. Están soportados dos procesadores alternativos, <a href="http://xmlsoft.org/XSLT/" target="_top">LibXSLT</a>, de <a href="http://www.gnome.org/" target="_top">Gnome 2</a> y <a href="http://www.gingerall.com/charlie/ga/xml/p_sab.xml" target="_top">Sablotron</a>.</p></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2964852"></a>2.4. Procesador de XPathScript</h3></div></div><p>Éste es un lenguaje específico de AxKit, basado en instrucciones de procesamiento, pensado para suplir las limitaciones de XSLT. AxKit lo trata como un procesador XSLT, recibiendo el documento XML y el correspondiente <span class="emphasis"><em>estilo</em></span> XpathScript a la entrada, y ofreciendo un documento transformado a la salida.</p><p>El documento de <span class="emphasis"><em>estilo</em></span>, habitualmente con la extensión .xps, es muy similar a los documentos ASP o PHP. Contiene una plantilla de la salida, intercalando en el texto instrucciones de procesamiento a completar con el resultado de la entrada.</p><p>XPathScript contiene unas pocas funciones, sobretodo implementando XPath - de ahí el nombre. El código se separa del texto mediante los delimitadores &lt;% - %&gt;. Por ejemplo, es posible que nuestro texto XML en la entrada sea un documento de docbook con la siguiente estructura (parcial):</p><pre class="programlisting">        &lt;article&gt;&lt;articleinfo&gt;&lt;title&gt;Introducción a AxKit&lt;/title&gt;...</pre><p>Y deseamos convertirlo a su equivalente html:</p><pre class="programlisting">        &lt;html&gt;&lt;head&gt;&lt;title&gt;Introducción a AxKit&lt;/title&gt;...</pre><p>El archivo .xps correspondiente podría contener:</p><pre class="programlisting">        &lt;html&gt;&lt;head&gt;&lt;title&gt;&lt;%= findvalue(&quot;/article/articleinfo/title/text()&quot;) %&gt;&lt;/title&gt;...</pre><p>Es posible también incluir código de Perl directamente en la plantilla .xps. Por ejemplo:</p><pre class="programlisting">        &lt;% my $date = `date +'%d-%m-%Y'`; chomp $date; %&gt;
        &lt;p&gt;Hoy es &lt;%= $date %&gt;&lt;/p&gt;</pre><p>La guía de Matt Sergeant <a href="http://www.axkit.org/wiki/view/AxKit/XPathScriptGuide#" target="_top">XPathScript - A Viable Alternative to XSLT?</a> es el punto de partida obligado para conocer este lenguaje.</p></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2964962"></a>2.5. Filtros para salidas en PDF (PassiveTeX, HtmlDoc, AxPoint)</h3></div></div><p>AxKit incluye tres procesadores para conversiones en documentos PDF. La conversión desde documentos en formato xsl:fo a PDF se realiza a través de TeX, utilizando un interfaz a la librería de macros de TeX <a href="http://www.hcu.ox.ac.uk/TEI/Software/passivetex/" target="_top">PassiveTeX</a>.</p><p>Es posible no obstante utilizar una conversión directa de documentos XHTML a PDF a través de un interfaz de HtmlDoc.</p><p>AxKit incluye un procesador específico para salidas impresas de documentos <a href="http://axpoint.axkit.org/" target="_top">Axkit Slideshow XML</a>, un tipo de documento de presentaciones. Existe una <a href="http://www.bitflux.ch/slideml/2axkitslideshow.html" target="_top">hoja XSLT</a> para convertir <a href="http://www.slideml.org/" target="_top">SlideML</a> en este formato, por lo que también pueden utilizarse de esta manera los documentos de SlideML.</p></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2965032"></a>2.6. Filtro para salidas gráficas</h3></div></div><p>Está disponible en AxKit un procesador para conversiones de SVG en los formatos gráficos habituales,<a href="http://search.cpan.org/~tomson/Apache-AxKit-Language-Svg2AnyFormat-0.02/lib/Apache/AxKit/Language/Svg2AnyFormat.pm" target="_top"> Apache::AxKit::Language::Svg2AnyFormat</a>. La conversión se reliza en dos pasos: El filtro en sí convierte SVG a PNG, y en un segundo término, con <a href="http://www.imagemagick.org/www/perl.html" target="_top">Image::Magick</a>  se accede a las posibilidades de transformación de la librería <a href="http://www.imagemagick.org/index.html" target="_top">ImageMagick</a>, que puede generar los formatos gráficos más extendidos, como JPG, GIF, TIFF o PhotoCD. </p></div></div><div class="section"><div class="titlepage"><div><h2 class="title" style="clear: both"><a id="id2965085"></a>3. Instalación y Configuración</h2></div></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2965093"></a>3.1. Instalación</h3></div></div><p>Desde los sistemas de paquetes como Debian es fácil instalarlo. Como siempre, nuestro aliado apt-get:</p><pre class="programlisting">        apt-get install axkit</pre><p>Esto nos instalará AxKit y todos los módulos y librerías que necesita. Es importante advertir que la versión de Debian woody se ha quedado anticuada, y no ofrece algunas funcionalidades importantes en el AxKit actual, aunque en el buscador de repositorios <a href="www.apt-get.org" target="_top">www.apt-get.org</a> se pueden encontrar paquetes no oficiales más actualizados.</p><p>Otro método sencillo, y que nos permitirá instalar siempre las últimas versiones, tanto de este módulo como de todos los que depende, es, obviamente, desde CPAN:</p><pre class="programlisting">        # perl -MCPAN -e shell
        cpan&gt; install AxKit</pre><p>Ni que decir tiene que AxKit es un sistema complejo, construido sobre unos cuantos módulos de Perl y algunas librerias y programas externos (básicamente LibxXSLT/LibXML2 o Sablotron y TeX para una configuración mínima), y, puesto que es un módulo de Apache, debe ser compilado con las cabeceras de esta aplicación, por lo que no todo puede dejarse en manos de CPAN. El trabajo para instalarlo desde fuera de un sistema de paquetes no es sencillo.</p><p>Hemos de asegurarnos de que tenemos habilitado mod_perl en Apache, no suele estarlo por defecto. Obviamente las rutas cambian según los sistemas. En Debian estará así:</p><pre class="programlisting">        # cat /etc/apache/httpd.conf | grep mod_perl
         LoadModule perl_module /usr/lib/apache/1.3/mod_perl.so</pre></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2965188"></a>3.2. El uso de directivas en la configuración de Apache</h3></div></div><p>AxKit es un módulo de Apache, y su configuración está integrada en la del servidor web. Por las características de la configuración de Apache, basada en directivas distribuidas bastante libremente en un grupo disperso de archivos, configurar AxKit puede llegar a ser una tarea algo compleja, aunque a cambio disponemos de una gran versatilidad.</p><p>Lo que recordamos aquí en general no es específico de AxKit, se refiere al servidor Apache en su conjunto.</p><p>Las directivas se han de incluir en archivos de configuración genéricos(en la actualidad se suelen concentrar en httpd.conf) o en ficheros específicos a colocar en los directorios afectados (normalmente los archivos .htaccess).</p><p>Una parte de las directivas de AxKit deben situarse en el cuerpo principal del archivo o en su defecto en una sección <span class="emphasis"><em>Virtual Host</em></span>. Son las que se refieren a la instalación de AxKit (Perlmodule) y sus Plugins (AxAddPlugin).</p><p>El resto puede situarse en cualquier lugar, bien en el cuerpo principal, si deseamos que afecten a toda nuestra web, bien en cualquier sección, si queremos que sólo a una parte, bien en archivos .htaccess. Recordemos que las secciones o directivas de bloque posibles de Apache son:</p><div class="itemizedlist"><ul type="disc"><li><p><span class="emphasis"><em>Directory</em></span> o <span class="emphasis"><em>DirectoryMatch</em></span>: para implicar sólo los archivos presentes en esa parte del sistema de ficheros virtual de Apache. Se aceptan en el nombre de directorio expresiones regulares.</p></li><li><p><span class="emphasis"><em>Files</em></span> o <span class="emphasis"><em>FilesMatch</em></span>: Afectan sólo a los archivos cuyo nombre encaja en el patrón expresado aquí, si es necesario con la ayuda de expresiones regulares.</p></li><li><p><span class="emphasis"><em>Location</em></span> o <span class="emphasis"><em>LocationMatch</em></span>: Limita el alcance a la URL.</p></li></ul></div><p>El uso de archivos .htaccess a colocar en un directorio permite establecer una jerarquía de preferencias. Si un directorio no contiene un archivo de este nombre, o en él no hay directivas aplicables, Apache seguiría buscando en los directorios que conforman la ruta, en busca de indicaciones expresas. Así para un documento solicitado que se refiera a la ruta virual de Apache:</p><pre class="programlisting">        /articulos/2003/xml/estearticulo.dbk</pre><p>la búsqueda de directivas en archivos .htaccess se mantendría mientras no se encontraran resultados así:</p><pre class="programlisting">        /articulos/2003/xml/.htaccess
        /articulos/2003/.htaccess
        /articulos/.htaccess
        /.htaccess</pre><p>Por fin, si la búsqueda hubiera sido infructuosa, AxKit acabará en los archivos de configuración de Apache, buscando en las secciones o directivas de bloque que correspondan.</p><p>De esta manera es como podemos establecer por ejemplo un estilo por defecto a nuestra web (mediante directivas colocadas en /.htaccess), y un estilo específico para partes concretas, que sustituirían al estilo por defecto (a aplicar por ejemplo mediante /articulos/2003/xml/.htaccess).</p><p>Es importante que en la sección que describa el comportamiento de Apache con nuestros archivos tengamos habilitada y abierta la directiva AllowOverride. De lo contrario Apache no leerá los archivos .htaccess. AllowOverride All será la opción más sencilla, aunque se pueden utilizar configuraciones algo más estrictas.</p></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2965400"></a>3.3. Esquema general de la configuración de AxKit</h3></div></div><p>El esqueleto de la configuración de AxKit es:</p><div class="itemizedlist"><ul type="disc"><li><p>Registro en mod_perl. AxKit depende de mod_perl, y se registra en él con la directiva PerlModule.</p></li><li><p>Declaraciones de Plugins. Como ya hemos indicado antes, deben situarse en la sección general o Virtual Host del archivo de configuración. Con las directivas AxAddPlugin.</p></li><li><p>Registro de las librerías de etiquetas utilizadas. Con AxAddXSPTaglib.</p></li><li><p>Indicación de los procesadores. A través de AxAddStyleMap se indica que un determinado tipo MIME debe ser tratado con determinado procesador.</p></li><li><p>Indicación de los proveedores: Con la directiva AxContentProvider.</p></li><li><p>Indicación de las hojas de estilo. Básicamente se realiza con la directiva AxAddProcessor. Elegir los procesos y hojas de estilo a aplicar es sin duda la tarea más compleja de la configuración de AxKit, por lo que lo trataremos en detalle más abajo.</p></li><li><p>Regulación del comportamiento de la cache. Con AxCacheDir especificamos el directorio para la cache; con AxNoCache la inhibimos; señalemos que si instalamos el módulo Apache::AxKit::Plugin::QueryStringCache AxKit guarda caché también de la URI completa, no sólo de la base de la URI.</p></li><li><p>Regulación de características de la entrega. Mediante AxGzipOutput se controla si la salida será comprimida para los clientes que lo soporten. Con AxTranslateOutput y AxOutputCharset se concretan la codificación del documento entregado.</p></li><li><p>Control de bitácora. Con la directiva AxDebugLevel se señala el nivel de información de bitácora mostrada. Con  AxLogDeclines se añade información cuando AxKit rehúsa tratar un documento, usualmente porque la entrada no la reconoce como XML, y mediante AxStackTrace se añade información de seguimiento de las excepciones. AxTraceIntermediate permite volcar en un directorio sendos archivos con cada una de las transformaciones que sufre el texto al pasar por la tubería. AxDebugTidy por fin permite formatear la salida de la depuración.</p></li><li><p>Control de errores. Con AxErrorStylesheet se puede indicar una hoja de estilos de errores. Ësta es obviamente una directiva específica de AxKit, pero siempre es posible invocar la directiva de Apache ErrorDocument, señalándole un documento XSP como salida, por lo que de nuevo se invocará la tubería de AxKit en el tratamiento del error.</p></li></ul></div><p>Prácticamente todas las directivas mencionadas arriba son opcionales, excepto el registro de AxKit en mod_perl, y la asignación de los procesadores. La referencia completa de las directivas la hallaremos en <a href="http://search.cpan.org/dist/AxKit/lib/AxKit.pm" target="_top">la documentación</a> de la aplicación. </p><p>Por supuesto que AxKit es un módulo de Apache, e interacciona con otros módulos, especialmente mod_perl, por lo que las aplicaciones de AxKit necesitan a menudo otras directivas externas al mismo. Es el caso de las directivas de mod_perl PerlModule, para declaración de módulos, PerlSetVar, utilizada para establecer el comportamiento de diversos módulos de AxKit a modo de parámetros, o PerlHandler, utilizada también por otros módulos para controlar los manejadores. En general, en el uso de las directivas de mod_perl nos guirá la documentación de los módulos a instalar.</p><p>Esporádicamente necesitaremos también directivas de otros módulos de Apache, como AddHandler de mod_mime, que indica a Apache que determinado tipo MIME será gestionado por AxKit.</p></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2960697"></a>3.4. Configuración mínima</h3></div></div><p>Configurar AxKit conlleva tan sólo tres pasos obligados: Registrar AxKit en mod_perl, especificar el procesador XSLT a utilizar e indicar la hoja de estilos a aplicar; incluso este último paso se puede obviar si en el documento original hemos incluido una referencia a esta hoja de estilos, como veremos más abajo.</p><div class="itemizedlist"><ul type="disc"><li><p>Registrar AxKit: AxKit se integra en Apache con la directiva PerlModule. Es obligado que esté entre la configuración genérica de Apache (típicamente httpd.conf) y no puede estar en archivos .htaccess. Lo colocaremos fuera de las secciones, o en una sección VirtualHost.</p></li><li><p>Especificar el o los procesadores de estilos. Se realiza con la directiva AxAddStyleMap, que asocia un tipo MIME con un procesador. Recordemos que los tipos MIME permitidos en la tubería de AxKit son:</p><div class="itemizedlist"><ul type="round"><li><p>application/x-xsp, a través de Apache::AxKit::Language::XSP</p></li><li><p>text/xslfo, a través de Apache::AxKit::Language::PassiveTeX</p></li><li><p>text/xsl, con Apache::AxKit::Language::LibXSLT o Apache::AxKit::Language::Sablotron</p></li><li><p>application/x-saxmachines, con Apache::AxKit::Language::SAXMachines</p></li><li><p>application/x-xpathscript, a través de Apache::AxKit::Language::XPathScript</p></li><li><p>application/x-axpoint, con Apache::AxKit::Language::AxPoint</p></li><li><p>text/xhtml, con Apache::AxKit::Language::HtmlDoc</p></li><li><p>application/svg2anyformat, con  Apache::AxKit::Language::Svg2AnyFormat</p></li></ul></div></li><li><p>Especificar la hoja de estilos a aplicar. Veremos en detalle esto abajo. El camino más sencillo sería indicar directamente en el archivo de configuración que un determinado tipo MIME se procesa con una hoja determinada.</p></li></ul></div><p>Así, para utilizar todos nuestros documentos con una hoja de estilos stylesheet.xsl, a procesar por LibXSLT especificaremos:</p><pre class="programlisting">        PerlModule AxKit
        AxAddStyleMap text/xsl Apache::AxKit::Language::LibXSLT
        AxAddProcessor text/xsl /stylesheets/stylesheet.xsl</pre></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2960843"></a>3.5. Configuración de los estilos</h3></div></div><p>AxKit nos permite ofrecer un comportamiento diferente en función de un gran número de circunstancias, por ejemplo si accedemos desde un dispositivo WAP, si nuestro cliente no dispone de gráficos o si la salida la deseamos en PDF. El abanico es ciertamente amplio, que hará esta parte de la configuración el elemento más personalizable y por ende más complejo.</p><p>Es posible indicar en el propio documento XML qué hoja de estilos se aplicará, mediante la intrucción de procesamiento <a href="http://www.w3.org/TR/xml-stylesheet/" target="_top">xml-stylesheet</a>:</p><pre class="programlisting">        &lt;?xml-stylesheet href=&quot;default.xsl&quot; type=&quot;text/xsl&quot;?&gt;</pre><p>Las instrucciones de procesamiento como la anterior declaran hojas de estilo llamadas persistentes, que se identifican por no contener el atributo title, y se aplican directamente sin hacer ninguna otra comprobación.</p><p>En defecto de instrucciones de procesamiento en el documento, o incluso si se utilizan otras instrucciones de procesamiento como veremos más abajo, la gestión de los estilos se deja en manos de AxKit. El camino habitual para la la elección del estilo es la directiva AxAddProcessor, que asocia un tipo MIME con una hoja de estilo. Como vimos arriba, para aplicar una hoja de estilos styleshhet.xsl a los documentos del tipo MIME text/xsl especificamos:</p><pre class="programlisting">        AxAddProcessor text/xsl /stylesheets/xslfo.xsl</pre><p>Determinados procesadores no necesitan hoja de estilos, por ejemplo los filtros que convierten documentos de un determinado tipo a PDF, pero igualmente debemos invocarlos, por lo que se ha de indicar NULL en lugar de la hoja:</p><pre class="programlisting">        AxAddProcessor text/xslfo NULL</pre><p>Las directivas AxAddProcessor definen la tubería de AxKit. El procesado de un documento (y el orden en que se produce) depende de la sucesión de directivas de este tipo que vayamos especificando. Así, un documento xml que queremos convertir en PDF pasa habitualmente por un procesador XSLT que lo convierte en un documento del tipo xsl-fo, y éste por un procesador PassiveTex que lo convierte en PDF. Las directivas a aplicar son:</p><pre class="programlisting">        AxAddProcessor text/xsl /stylesheets/xslfo.xsl
        AxAddProcessor text/xslfo NULL</pre><div class="section"><div class="titlepage"><div><h4 class="title"><a id="id2960965"></a>3.5.1. Restricciones</h4></div></div><p>Es posible restringir el ámbito de aplicación del procesado, para que no se aplique a todos los documentos, sino sólo a unos determinados. Las selecciones son:</p><div class="itemizedlist"><ul type="disc"><li><p>Las habituales en Apache (Directory, Files, Location). Así para aplicar un hoja de estilos book.xsl a los archivos cuyo nombre siga un determinado patrón (por ejemplo, los que comiencen por book) utilizaremos la correspondiente directiva de bloque:</p><pre class="programlisting">        &lt;Files ~ &quot;^book.*&quot;&gt;
        AxAddProcessor text/xsl /stylesheets/book.xsl
        &lt;/Files&gt;</pre></li><li><p>El nombre del elemento raíz del documento, con AxAddRootProcessor. Así, para que una hoja de estilos capitle.xsl se aplique sólo a los documentos cuyo elemento raíz tenga por nombre capitle espeficaremos:</p><pre class="programlisting">        AxAddRootProcessor text/xsl capitle.xsl capitle</pre></li><li><p>El tipo de documento, con AxAddDocTypeProcessor. Así, para que una hoja de estilos article.xsl se aplique a los documentos de DocBook 4.2 espeficaremos:</p><pre class="programlisting">        AxAddDocTypeProcessor text/xsl article.xsl &quot;-//OASIS//DTD DocBook
                        XML V4.2//EN&quot;</pre></li><li><p>El DTD utilizado, con AxAddDTDProcessor. Así para aplicar una hoja de estilos tei.xsl a los documentos que utilicen el DTD tei.dtd:</p><pre class="programlisting">        AxAddDTDProcessor text/xsl tei.xsl tei.dtd</pre></li><li><p>La URI utilizada. Con AxAddURIProcessor podemos evaluar si la URI se adapta a un patrón determinado, de acuerdo a expresiones regulares. El propósito es bastante similar a la directiva de bloque de Apache Location. Así, si deseamos que el estilo book.xsl se aplique a todos los documentos terminados en _book.xml, especificaremos:</p><pre class="programlisting">        AxAddURIProcessor text/xsl book.xsl &quot;^.*_book.xml$&quot;</pre></li></ul></div></div><div class="section"><div class="titlepage"><div><h4 class="title"><a id="id2961081"></a>3.5.2. Selección de estilos</h4></div></div><p>Cuando se ha de elegir entre varias tratamientos según las circunstancias necesitamos poder identificar en la configuración cada uno de esos tratamientos, o estilos. Para delimitarlos se ha definido una nueva sección o directiva de bloque, AxStyleName, que permite especificar los ingredientes de la tubería de AxKit en cada caso. La que tiene por nombre #default se aplica en defecto de las demás.</p><p>Así, si deseamos que AxKit entregue bien un documento XHTML o bien un documento PDF, podemos definir dos estilos, con el comportamiento adecuado para cada caso. En caso de no utilizar ninguno de éstos nuestro estilo #default utiliza la hoja html:</p><pre class="programlisting">        &lt;AxStyleName &quot;xhtml&quot;&gt;
                AxAddProcessor text/xsl /stylesheet/xhtml/docbook.xsl
        &lt;/AxStyleName&gt;
        &lt;AxStyleName &quot;pdf&quot;&gt;
                AxAddProcessor text/xsl /stylesheet/fo/docbook.xsl
                AxAddProcessor text/xsl-fo NULL
        &lt;/AxStyleName&gt;
        &lt;AxStyleName &quot;# default&quot;&gt;
                AxAddProcessor text/xsl /stylesheet/html/docbook.xsl
        &lt;/AxStyleName&gt;</pre><p>Es posible también indicar en el propio documento XML los estilos, y con ello las hojas de estilo a aplicar, a través de instrucciones de procesamiento. El nombre del estilo viene indicado mediante el atributo title. El estilo por defecto se señala en las instrucciones que contienen la hoja llamada preferente, que no contienen el pseudo-atributo alternate o que incluyen el pseudo-atributo alternate=no. El resto de estilos se declaran mediante instrucciones con hojas alternativas, llamadas así porque contienen pseudo-atributos alternate con valor yes.</p><p>La configuración anterior podría ser reproducida en un documento XML, mediante estas instrucciones de procesamiento:</p><pre class="programlisting">&lt;?xml-stylesheet alternate=&quot;yes&quot; title=&quot;xhtml&quot; href=&quot;/stylesheet/xhtml/docbook.xsl&quot; type=&quot;text/xsl&quot;?&gt;
&lt;?xml-stylesheet alternate=&quot;yes&quot; title=&quot;pdf&quot; href=&quot;/stylesheet/fo/docbook.xsl&quot; type=&quot;text/xsl&quot;?&gt;
&lt;?xml-stylesheet alternate=&quot;yes&quot; title=&quot;pdf&quot; href=&quot;NULL&quot; type=&quot;text/xsl-fo&quot;?&gt;
&lt;?xml-stylesheet title=&quot;html&quot; href=&quot;/stylesheet/html/docbook.xsl&quot; type=&quot;text/xsl&quot;?&gt;</pre><p>Una vez delimitados los estilos, es necesario indicar a AxKit cuál debe elegir. El criterio para hacerlo estará en función de:</p><div class="itemizedlist"><ul type="disc"><li><p>Los parámetros pasados en la URI. Puede utilizarse el plugin Apache::AxKit::StyleChooser::QueryString para pasarlo como parámetros GET:</p><pre class="programlisting">        http://localhost/prueba.xml?style=xhtml</pre><p>o con el plugin Apache::AxKit::StyleChooser::PathInfo pasarlos a través de PATH_INFO:</p><pre class="programlisting">        http://localhost/prueba.xml/xhtml</pre><p>o el con plugin Apache::AxKit::StyleChooser::FileSuffix pasarlos como si fueran un extensión añadida a la URI:</p><pre class="programlisting">        http://localhost/prueba.xml.xhtml</pre></li><li><p>Mediante una cookie. Al utilizar el plugin Apache::AxKit::StyleChooser::Cookie AxKit buscará en una cookie el valor correspondiente a la clave axkit_preferred_style, que en nuestro caso esperaremos que contenga xhtml.</p></li><li><p>Mediante el User Agent, el identificador del cliente. Esto se realiza con el plugin  Apache::AxKit::StyleChooser::UserAgent. La tabla de estilos y clientes se pasa a AxKit mediante una estructura específica a través de PerlSetVar. Por ejemplo, utilizaremos un estilo text optimizando la presentación del documento para navegadores de texto como Lynx, y quizá un estilo antiguos para navegadores antiguos que soporten sólo HTML 3.0, como Netscape 2.0. En defecto de ambos utilizaremos el estilo xhtml:</p><pre class="programlisting">        PerlSetVar AxUAStyleMap &quot;antiguos =&gt; Netscape 2.0,\
                        text =&gt; Lynx, \
                        xhtml=&gt;&quot;</pre></li><li><p>Mediante una función. Utilizando la directiva alternativa AxAddDynamicProcessor, AxKit pasará el control a un módulo que tomará la decisión en función de algún cálculo, típicamente evaluando el contenido del documento. Ésta es evidentemente una característica muy potente que deja la puerta abierta a cualquier criterio para la selección de estilos.</p></li></ul></div></div><div class="section"><div class="titlepage"><div><h4 class="title"><a id="id2961276"></a>3.5.3. Selección en función del medio</h4></div></div><p>Es posible aplicar una hoja de estilos u otra en función del Media Type, el tipo de medio en el que se utilizan los estilos. La <a href="http://www.w3.org/TR/REC-CSS2/media.htm" target="_top">Especificación CSS2</a> declara nueve tipos de medio: aural, braille,  handheld,  embossed, print, projection, screen,  tty y tv, más un tipo adicional all, aplicable a todos los medios. El valor por defecto es screen, que es el utilizado en clientes como IE o Mozilla.</p><p>AxKit reconoce el tipo de medio mediante la información que se obtiene del cliente en la negociación http. Existe no obstante un módulo específico, <a href="http://search.cpan.org/~msergeant/AxKit-1.6.2/lib/Apache/AxKit/MediaChooser/WAPCheck.pm" target="_top">Apache::AxKit::MediaChooser::WAPCheck</a>, para dispositivos WAP.</p><p>Una vez establecido el tipo de medio, AxKit debe entregar una hoja de estilo adecuada a este medio. Hay dos caminos para gestionar esto: las instrucciones de procesamiento a incluir en el propio documento - que es la opción que AxKit tomará prioritariamente- y las declaraciones mediante directivas de procesamiento, a incluir en secciones o directivas de bloque AxMediaType.</p><p>El propio documento puede incluir instrucciones de procesamiento <a href="http://www.w3.org/TR/xml-stylesheet/" target="_top">xml-stylesheet</a> que indican qué hoja de estilo debe aplicarse ante un tipo de medio. Así en este ejemplo, se utilizará la hoja de estilos screen.xsl en medios tipo screen, y tv.xsl en medios tipo tv, según indican estas PI dentro del documento:</p><pre class="programlisting">&lt;?xml-stylesheet type=&quot;text/xsl&quot; title=&quot;desktop&quot; href=&quot;screen.xsl&quot; media=&quot;screen&quot;?&gt;
&lt;?xml-stylesheet type=&quot;text/xsl&quot; title=&quot;desktop&quot; href=&quot;tv.xsl&quot; media=&quot;tv&quot;?&gt;</pre><p>Si optamos por gestionar los tipos de medio desde AxKit debemos definir dentro de archivos .htacces o en httpd.conf secciones AxMediaType que especifiquen el comportamiento para ese medio. Así, si tenemos previsto que nuestra web se presente con una hoja de estilos diferente si se accede desde un terminal WAP o desde un computador, incluiremos:</p><pre class="programlisting">        &lt;AxMediaType handheld&gt;
                AxAddProcessor text/xsl /stylesheets/page_to_wml.xsl
        &lt;/AxMediaType&gt;

        &lt;AxMediaType screen&gt;
                AxAddProcessor text/xsl /stylesheets/page_to_html.xsl
        &lt;/AxMediaType&gt;</pre><p>En ausencia de una sección AxMediaType específica, el medio por defecto es screen, por lo que cuando contemplamos configurar AxKit para responder a varios medios al menos debemos especificar una para el tipo screen.</p><p>Es posible definir varios estilos para cada tipo de medio, o sea definir varias secciones AxStyleName dentro de cada sección AxMediaType. En webs de cierta importancia deberíamos disponer de una sección AxMediaType por cada uno de los tipos de medio posibles, y dentro de ellas como mínimo una sección AxStyleName para navegadores de texto, antiguos y que soporten la entrega de XML directamente, además de estilos pra salida en texto y PDF.</p></div></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2961437"></a>3.6. Configuración de una máquina SAX</h3></div></div><p>Construir una máquina SAX en AxKit es muy sencillo. En primer lugar se ha de incluir una directiva AxAddStyleMap que permita conocer el manejador de este tipo MIME, en este caso el módulo Apache::AxKit::Language::SAXMachines:</p><pre class="programlisting">        AxAddStyleMap application/x-saxmachines Apache::AxKit::Language::SAXMachines</pre><p>Para invocar el procesador se incluye la directiva AxAddProcessor:</p><pre class="programlisting">        AxAddProcessor application/x-saxmachines .</pre><p>Esta directiva espera como parámetro final una URI para definir el espacio de nombres. Si no se incluyen hojas de estilo externas a la propia máquina SAX, la URI es el propio documento, y por ello se coloca un punto en su lugar.</p><p>Si la máquina SAX es estática, la misma para todo el conjunto de datos que esté en el ámbito de la directiva anterior, podemos indicarla también desde otra directiva PerlSetVar AxSAXMachineFilters, describiendo los filtros SAX en el orden que se aplican:</p><pre class="programlisting">        PerlSetVar AxSAXMachineFilters &quot;XML::Filter1 XML::Filter2&quot;</pre><p>En este caso la máquina SAX se compone de dos filtros, XML::Filter1 y XML::Filter2. No obstante en ocasiones la tubería no es conocida de antemano, se creará dinámicamente según se necesite. Entonces la directiva PerlSetVar AxSAXMachineClass apunta a un módulo que contiene la máquina, en este ejemplo My::SAXMachine:</p><pre class="programlisting">        PerlSetVar AxSAXMachineClass &quot;My::SAXMachine&quot;</pre></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2961529"></a>3.7. Configuración para el procesado de Librerías de etiquetas</h3></div></div><p>Los documentos XML que contienen (entre otros elementos) las librerías de etiquetas se suelen identificar con la extensión .xsp. Por tanto, para configurar AxKit para gestionarlos debemos en primer lugar indicar que este tipo MIME será manejado por el módulo Apache::AxKit::Language::XSP. De ello se encarga la directiva AxAddStyleMap:</p><pre class="programlisting">        AxAddStyleMap application/x-xsp Apache::AxKit::Language::XSP</pre><p>Hemos de indicar a AxKit qué librerías de etiquetas utilizaremos. Ello se realiza con la directiva AxAddXSPTaglib. Por ejemplo si incluimos la librería AxKit::XSP::Util:</p><pre class="programlisting">        AxAddXSPTaglib AxKit::XSP::Util</pre><p>Los documentos .xsp que incluyen las librerías han de indicar que utilizan xsp como estilo:</p><pre class="programlisting">        &lt;?xml-stylesheet href=&quot;NULL&quot;        type=&quot;application/x-xsp&quot;?&gt;</pre><p>y han de incluir una referencia al espacio de nombres de las librerías utilizadas. Si usáramos AxKit::XSP::Util y AxKit::XSP::ESQL, las que a su vez descansan sobre  la librería de etiquetas XSP, serían:</p><pre class="programlisting">        &lt;xsp:page
        language=&quot;Perl&quot;
        xmlns:xsp=&quot;http://apache.org/xsp/core/v1&quot;
        xmlns:util=&quot;http://apache.org/xsp/util/v1&quot;
        xmlns:esql=&quot;http://apache.org/xsp/SQL/v2&quot;
        &gt;</pre></div><div class="section"><div class="titlepage"><div><h3 class="title"><a id="id2961608"></a>3.8. Configuración de XPathScript</h3></div></div><p>El camino habitual de invocar el procesador de XPathScrip es señalar a AxKit que determinado tipo de archivos, con la extensión xps, corresponden a este procesador. Lo haremos con la directiva AxAddStyleMap, que le indica que las peticiones de archivos de este tipo MIME serán procesados por el módulo Apache::AxKit::Language::XPathScript:</p><pre class="programlisting">        AxAddStyleMap application/x-xpathscript Apache::AxKit::Language::XPathScript</pre><p>Y por supuesto en el documento XML que entra por la tubería se ha de incluir una referencia al procesador. Si nuestro estilo tiene por nombre <span class="emphasis"><em>default.xps</em></span> hemos de añadirle a la cabecera:</p><pre class="programlisting">        &lt;?xml-stylesheet href=&quot;default.xps&quot; type=&quot;application/x-xpathscript&quot;?&gt;</pre></div></div></div></body></html>