Apache Cocoon 2

Motivación, Introducción y Explicación

Saúl Zárrate Cárdenas


Tabla de contenidos
1. ¿Por qué Cocoon?
1.1. Motivación
1.2. Entornos de publicación web (Web Publishing Framework)
2. Cocoon
2.1. ¿Qué es Cocoon?
2.1.1. Funcionamiento a nivel de usuario
2.2. Cocoon 1 Vs Cocoon 2
3. Estructura y arquitectura de Cocoon
3.1. Conceptos claves
3.1.1. Estructura
3.1.2. Arquitectura
4. Cocoon y las XSPs
4.1. Introducción
4.2. Tipos de páginas XSP
4.2.1. XSP con la lógica embebida en la presentación
4.2.2. XSP con hojas de estilos
4.2.3. XSP con bibliotecas de etiquetas
4.3. Conectividad a bases de datos
5. Paralelismo con Cocoon
6. Instalación de Cocoon 2
6.1. Requisitos para la instalación
6.1.1. Instalación de Tomcat
6.1.2. Ambiente Java
6.2. Instalando Cocoon
6.2.1. Instalación Rápida De Cocoon
6.2.2. Instalación a partir de los fuentes
7. Configuración y personalización en Cocoon
7.1. El sitemap
7.1.1. Selección y match en Cocoon
7.1.2. Funcionalidad del sitemap
7.1.3. Estructura básica del sitemap
8. Desarrollo en Cocoon
8.1. Contenido estático
8.2. Contenido Dinámico
8.2.1. Dando lógica con programación en Java
8.2.2. Acceso a bases de datos
8.3. Deployment en Cocoon
8.3.1. Condiciones mínimas
8.3.2. Inclusión de un subsitemap en el sitemap de Cocoon
8.3.3. Código del subsitemap
A. Formato de reunión semanal
A.1. Introducción
A.2. Descripción formato de reunión semanal
A.2.1. Elementos del formato de reunión semanal
A.3. XML
A.3.1. ¿Qué es?
A.3.2. Ejemplo XML con el formato de reunión semanal de Ingeniería de Software
A.4. XSL
A.4.1. Algunos aspectos de XSL
A.5. Usando el formato de reunión semanal en Cocoon
Tabla de figuras
3-1. Cocoon desde un punto de vista estructural
3-2. Arquitectura de Cocoon
4-1. Flujo en XSP
5-1. WorkFlow en Cocoon
6-1. Ventana de bienvenida de Tomcat
6-2. Ventana de bienvenida de Cocoon
A-1. Formato de reunión semanal en Cocoon
Tabla de ejemplos
7-1. Ejemplo de un sitemap básico
8-1. Código para funcionamiento de un solicitud de un fichero XML presentado como un HTML
8-2. Código para definir un Data Source para acceso a una base de datos
8-3. Código para cargar clases para acceso a bases de datos.
8-4. Ejemplo de Código de Base de Datos necesario a incluir con la Base de Datos hsql
8-5. Pipeline necesario para una XSP con etiquetas SQL y acceso a una Base de Datos
8-6. Código de una XSP con conexión a Base de datos con etiqueta SQL
8-7. Pipeline necesario para una XSP con etiquetas ESQL y acceso a una Base de Datos
8-8. Código de una XSP con conexión a Base de datos con etiqueta ESQL
8-9. Código para incluir un subsitemap
8-10. Código básico de un subsitemap
A-1. Ejemplo de una DTD para el formato de reunión semanal
A-2. Ejemplo de un documento XML para el formato de reunión semanal
A-3. Ejemplo de una XSL para el formato de reunión semanal
A-4. Código para añadir un pipeline que cargue el formato de reunión semanal

Capítulo 1. ¿Por qué Cocoon?

1.1. Motivación

Hoy en día, la presencia en el Web es cada vez más relevante e importante para las empresas. Día a día se demandan más servicios en Internet. Por esto, son requeridos sistemas con gran capacidad de transformación y asimilación de las nuevas tendencias, de las nuevas tecnologías y del constante cambio del propio mercado.

Una característica importante de este tema es lo que atañe a la presentación de la información en múltiples formas y dispositivos. Si tenemos en cuenta el manejo de la información como hasta actualmente se está haciendo y analizamos lo que significa para una empresa tener toda su presentación en páginas HTML, podemos notar que imponer un cambio de imagen en las propias páginas es una labor dispendiosa y debido a que se trata de "remendar" algo ya hecho, se torna en una tarea poco agradable.

Peor aún, si se trata de presentar la información de la empresa en un formato distinto al HTML, ya que además de crear la presentación se debe recolectar la información de la presentación en el formato que está manejando, es decir, el HTML.

Como usted ya se habrá dado cuenta, el tener la información en la misma capa en la que se presenta, genera inconvenientes grandes y desencadena una cantidad de factores negativos para las organizaciones tales como gastos en mantenimiento, mayor tiempo en los desarrollos, pérdida de tiempo y dinero en la capacitación de personas para que conozcan la estructura de presentación, etc.

Para las empresas en las cuáles los datos de presentación se generan de forma dinámica, el problema pasa del diseñador al programador. En estos casos el programador tiene que ir al código y cambiar la presentación, pero pensemos que en realidad ésto no es el trabajo de un programador, es precisamente la presentación, trabajo del diseñador. Es claro que el diseñador no puede hacerlo (y tampoco debe, por que no es su oficio) ya que su línea de trabajo no está pensada para esto. Ésto se da mucho en generación dinámica de aplicaciones que utilizan tecnologías del estilo de Servlets. Sin embargo nótese que el programador, al tener que modificar en su código fuente aspectos de presentación corre un riesgo alto de alterar el funcionamiento de la aplicación, lo cual cae en una solución peor e improductiva.

Una solución mejorada de los Servlets salió con la tecnología J2EE. En los J2EE Beans (que son la forma de presentar la información) se debería tener el mínimo código, es decir, el necesario para las clases que contienen toda la lógica del negocio. Por otro lado, con los taglibs (etiquetas XML para definir código) se posibilita crear páginas que no tienen una sola línea de código.

Bien, ésto mejora las cosas; sin embargo se siguen teniendo básicamente tres problemas:

  1. Si se quieren obtener distintas presentaciones, es necesario modificar el código Java que se encarga de dar formato a los datos

  2. El mantenimiento puede no ser tan transparente ya que un diseñador puede alterar el código embebido en el HTML.

  3. En ocasiones puede ocurrir que se incluya código Java mas allá del necesario para que puedan funcionar correctamente los beans.

Sería óptimo poder tener productos de información que fueran independientes de las distintas formas de presentación y que si ese contenido se generara dinámicamente, ese dinamismo también fuera totalmente independiente. En pocas palabras se quiere separar Contenido, Lógica y Presentación.

Si se tuviera en un repositorio toda la información sin ninguna característica que la atara a algún tipo de presentación, se podrían implantar cada una de las vistas que se desearan sin que se debiera tener en cuenta alguna de las otras. Luego, el cambio o el mantenimiento de una de las vistas no le afectaría, sino a ella misma.


1.2. Entornos de publicación web (Web Publishing Framework)

Es aquí, donde surgen los Entornos de Publicación Web Basados en XML y XSL. En este tipo de aplicación se tienen las ventajas de la tecnología XML, tales como ser un estándar, ser una meta común para las empresas de tecnología, facilidad en la transformación con el apoyo de la tecnología XSL, separación total entre datos y presentación de los mismos, separación entre el rol del programador y el rol del diseñador (y por lo tanto más productividad, menos costos y más paralelismo de trabajo), mejor y más fácil tratamiento al mantenimiento y ser compatible con el resto de tecnologías.

Hasta este punto un entorno de publicación web en xml resuelve el problema contenido-presentación. ¿Pero y la lógica de la aplicación?

Bien, para esta parte existen varias propuestas, pero la más interesante es un proyecto del grupo Apache que denominan XSP (eXtensible Server Pages). Para conocer un poco más de XSP vea el Capítulo 4

Como vemos, ya se explicó a grandes rasgos que el entorno de publicación web basado en XML es la mejor solución al problema planteado: Separar Contenido, Lógica y Presentación. Es aquí en donde entra el proyecto del grupo Apache llamado por ellos Apache Cocoon.

Importante

Es importante resaltar que esta solución tiene un problema: Es muy poco madura y aun anda en proceso de prueba lo cual genera expectativas de todo tipo. Cocoon es hasta el momento entre este tipo de soluciones, la más desarrollada y cuenta con gran credibilidad en este momento.


Capítulo 2. Cocoon

2.1. ¿Qué es Cocoon?

Cocoon es un sistema de publicación Web, basado en XML/XSL. Cuenta con desarrollo total en Java por lo cual se puede ejecutar desde cualquier servidor que pueda contener Servlets; y al ser un Servlet cuenta con las ventajas de éstos, es decir, se ejecutan como threads de forma simultánea en el mismo contexto y no tienen que llamar a métodos auxiliares como lo hacen tecnologías del estilo CGI.

Cocoon es Open Source. Es bastante configurable y personalizable. Además adopta características para escribir páginas de servidor en XML (XSPs). Permite diferenciar el procesamiento del documento para tenerlo en distintos formatos, dependiendo del tipo de software que hace la petición y cuenta con un sistema de caché para tener un mejor rendimiento. Un elemento adicional y clave para tener en cuenta es que es un producto gratuito y por lo tanto no tendrá que gastar dinero para su adquisición.

Su usted desea separar contenido, presentación y lógica en su aplicación, una buena alternativa es adoptar Cocoon.


Capítulo 3. Estructura y arquitectura de Cocoon

En este apartado me dedicaré a hablar un poco de la estructura interna y arquitectura en la que se basa Cocoon.


3.1. Conceptos claves

Antes de entrar en detalles es recomendable mostrar tres conceptos claves de la estructura de Cocoon. Éstos son:


Capítulo 4. Cocoon y las XSPs


4.2. Tipos de páginas XSP

De acuerdo a la forma como se programan, las XSPs se pueden dividir en tres grupos:

  1. Con la lógica embebida en la presentación

  2. Con hojas de estilos

  3. Con bibliotecas etiquetas


Capítulo 5. Paralelismo con Cocoon

Como ya nos hemos podido dar cuenta el paralelismo con Cocoon se incrementa de forma enorme. Esto mejora tanto la calidad de los productos (ya que las personas se especializan en un área en particular) como los tiempos de desarrollo de trabajo y de respuesta de los mismos. Aquí se explica como se puede hacer Workflow con Cocoon. En éste se deben tener en cuenta estos 5 perfiles.


Capítulo 6. Instalación de Cocoon 2

En este apartado nos adentramos en un campo un poco más denso, explicando cómo hacer la instalación de Cocoon.


6.1. Requisitos para la instalación

Ya que Cocoon es una aplicación Web hecha en Java, debe ejecutarse sobre un motor de Servlets. Como estamos hablando de Java, Cocoon puede ser ejecutado sobre cualquier motor de Servlets. Para este caso en particular se ha utilizado Tomcat 4.0.3


6.1.1. Instalación de Tomcat

La instalación de Tomcat es realmente muy sencilla.

Lo primero que debe hacer es descargar el instalador. Ésto lo puede hacer desde este enlace en el cuál encontrará la última versión de este producto de licencia libre. Para el momento en el que este documento estaba siendo elaborado la versión más reciente de Jakarta Tomcat era la 4.0.3 y ya existía una alfa para la versión 4.1.0

Una vez descargado el instalador, ejecútelo. Los pasos a seguir son bastante intuitivos y no presentan problema alguno.

En el directorio donde instaló Tomcat, es decir, donde está la raíz de la aplicación, lo llamaremos CATALINA_HOME (CATALINA es el nombre del contenedor de Servlets de Tomcat, el cuál tiene una implementación totalmente distinta desde la versión 4).

Para subir y bajar Tomcat vaya al directorio CATALINA_HOME/bin. Ahí encontrará dos scripts para llevar a cabo esta operación (startup y shutdown respectivamente).

Tomcat se ejecuta por omisión en el puerto 8080, así que una vez que haya arrancado Tomcat puede probar la instalación abriendo en el navegador la dirección http://localhost:8080. Si la instalación no tuvo problemas se le mostrará una página de bienvenida semejante a ésta:


6.2. Instalando Cocoon

6.2.1. Instalación Rápida De Cocoon

De Cocoon se pueden obtener dos distribuciones. La que trataremos en esta parte es la distribución en binario que puede ser descargada de este enlace. Con esta distribución lo único que usted debe hacer es descargarla y descomprimirla en cualquier directorio. En el directorio que usted eligió deberá haber quedado el fichero cocoon.war. Este fichero es el de la aplicación Cocoon.

Para que Tomcat y Cocoon se puedan comunicar, usted debe copiar el cocoon.war en el directorio CATALINA_HOME/webapps e iniciar Tomcat.

Cuando usted inicia Tomcat puede darse cuenta que el fichero es descomprimido automáticamente en el directorio CATALINA_HOME/webapps/cocoon/, el cual llamaremos de ahora en adelante COCOON_HOME. Para probar si cocoon está funcionando puede abrir la dirección http://localhost:8080/cocoon/ en el browser, en la cual debe mostrársele una página de bienvenida de este estilo.


6.2.2. Instalación a partir de los fuentes

En ocasiones es recomendable tener una copia local del código de Cocoon y compilar la aplicación de forma local. Para ésto, lo que usted debe hacer es descargar el código fuente de Cocoon. Esto lo puede realizar a través del servidor de CVS (Current Versioning System) de Apache.

Primero det todo, usted debe tener instalado CVS. Si usted no lo ha instalado aún en su máquina, puede consultar el sitio web de CVS para más información.

En el momento que tenga instalado el CVS, ingrese al servidor de CVS de Apache de la siguiente forma:

Cuando se le pregunte por una contraseña escriba anoncvs. Luego escriba lo siguiente:

Una vez hecho esto se inicia la descarga de todo el código necesario para la compilación de Cocoon.

Cuando tenga los fuentes de Cocoon descargados, debe compilarlos para crear el fichero cocoon.war. Para empezar a ejecutar el proceso de compilación utilice la siguiente instrucción:

Ésto creará un directorio con el código compilado, las bibliotecas y el fichero cocoon.war. Una vez termine el proceso copie el cocoon.war en el directorio CATALINA_HOME/webapps y reinicie Tomcat. De esta forma Cocoon estará ejecutándose en http://localhost:8080/cocoon/.


Capítulo 7. Configuración y personalización en Cocoon

Cocoon cuenta con varios ficheros para hacer la configuración y personalización del mismo. Entre éstos, el más importante a nivel de usuario es el sitemap.xml. En este fichero se lleva a cabo el proceso de selección y match.


7.1. El sitemap


Capítulo 8. Desarrollo en Cocoon

8.1. Contenido estático

Para poder implantar sus aplicaciones de contenido estático en Cocoon usted debe seguir varios pasos:

Vamos a suponer que usted tiene un fichero para presentar información acerca de su empresa y es la página inicial de la misma. En este caso ese fichero, por ser el inicial lo llamaremos index.

Esto quiere decir que deberá tener un fichero llamado index.xml (con su respectiva DTD, supongamos su nombre como index.dtd) en el cual tendrá la información necesaria para mostrar la página principal de la empresa y además deberá tener un fichero index.xsl con el cual se aplicará formato HTML al documento XML.

Sugerencia

Es de anotar que no tiene porque crear un fichero XSL por cada fichero XML que tenga en su aplicación, sólo que para efectos de un ejemplo de muestra basta con hacerlo de esta forma.

El fichero sitemap.xmap de Cocoon nos servirá para decirle a Cocoon dónde encontrar los fuentes, como procesarlos y cómo presentarlos. Este fichero lo puede encontrar en COCOON_HOME/.

Lo que tiene que hacer es editar este fichero para añadirle un pipeline con el cual se pueda atender una solicitud que muestre el fichero que desea presentar.

Para nuestro ejemplo vamos a suponer que el fichero index.xml se encuentra en la ruta $MiAplicacion/XML/, que el fichero index.dtd se encuentra en la ruta $MiAplicacion/DTD y el fichero index.xsl que transforma el XML en un HTML se encuentra en la ruta $MiAplicacion/XSL/HTML/

Atención

Tenga en cuenta la ruta en la que guarda su DTD para que el fichero XML la pueda reconocer.

Sugerencia

Es recomendable manejar rutas relativas en la declaración de la DTD para mejorar la portabilidad de la aplicación.

Sugerencia

Cuando este construyendo aplicaciones en Cocoon es bastante útil definir directorios para guardar sus ficheros XML, XSL, sus DTD, sus fuentes, sus clases, etc.

Bien, el pipeline que usted debe añadir es de este estilo:

Analicemos un poco más detalladamente esto. La línea match pattern="MiAplicacion/index.html" le indica a Cocoon que cuando llegue una solicitud del tipo http://localhost:8080/cocoon/MiAplicacion/index.html la atienda obteniendo los datos del fichero XML $MiAplicacion/XML/index.xml (esto se le indica mediante la línea generate type="file" src="$MiAplicacion/XML/index.xml") y aplicándole la transformación dada por el fichero XSL ubicado en $MiAplicacion/XSL/HTML/index.xsl (lo cual se le dice mediante la línea transform src="$MiAplicacion/XSL/HTML/index.xsl").

Nota

Para un ejemplo un poco más detallado consulte el Apéndice A.


8.2. Contenido Dinámico


8.2.2. Acceso a bases de datos

Para acceder una base de datos usted debe tener en cuenta tres pasos:

  1. Configurar el Data Source para acceder la base datos.

    Ésto lo debe hacer en al fichero cocoon.xconf añadiendo las siguientes líneas en la etiqueta datasources

  2. Configurar el fichero web.xml

    Para que cargue el driver e incluir el driver de tal forma que Cocoon tenga un lugar desde donde cargarlo.

    Para configurar el web.xml con ayuda de la etiqueta init-param y la etiqueta hija de ésta, param-name con valor load-class enunciando dentro de esta última el nombre del driver y separando el nombre de los distintos drivers por coma o espacio. Por ejemplo, para incluir un driver para Oracle y otro para IBM WebSphere las líneas de código que deberían verse en el fichero web.xml serían:

    Nota

    Si usted está utilizando la Base de Datos que viene con Cocoon (hsql)este paso no es necesario

  3. Si va a utilizar hsql debe añadir las instrucciones de base de datos que necesite su aplicación, tales como sentencias de autenticación, de creación de tablas, de inserciones de datos, etc. Esto lo debe hacer en el fichero cocoondb.script ubicado en la ruta COCOON_HOME/WEB-INF/db/

    Para nuestro caso se añadieron las siguientes líneas:

    con lo cual se está dando la posibilidad al usuario usuario con contraseña contrasena hacer operaciones sobre la tabla Pruebas, la cuál tiene 2 registros.


8.2.2.1. Etiquetas SQL y ESQL

Para la construcción de páginas XSP, contamos con dos tipos de etiquetas, SQL y ESQL.

La diferencia radica en que ESQL siendo más nuevo, presta mayores funcionalidades como combinar distintos tipos de hojas de estilos, soporte para prepared statements y manejo de varios resultsets en una sola sentencia, entre otras cosas. De ahí su nombre, Extended SQL.

A continuación presentaré dos ejemplos con estas tecnologías para analizar y tener en cuenta cómo funciona cada una.


8.2.2.1.2. Ejemplo con uso de etiqueta ESQL

Teniendo en cuenta todo lo anteriormente expuesto, se pueden escribir páginas con etiquetas sql.

Nota

Note que en este caso, es en la página XSP en donde se define el nombre de la conexión.

Como usted ya se habrá podido dar cuenta, la diferencia en implementación entre ambas tecnologías es mínima. Dependiendo de las necesidades de su aplicación puede escojer entre ambas, teniendo en cuenta las potencialidades de ESQL y el desconocimiento que existe aún por su poco tiempo de vida en el mundo del software.


8.3. Deployment en Cocoon


8.3.2. Inclusión de un subsitemap en el sitemap de Cocoon

En el fichero sitemap.xmap de Cocoon se deben añadir las siguientes líneas:

Bien, miremos un poco este código para comprenderlo mejor:

Sugerencia

En ambientes de desarrollo es bastante útil tener la opción de que cada vez que se haga un cambio, éste se pueda reflejar de forma inmediata. Sin embargo en ambientes de producción es mejor tener configurado que los cambios se reflejen una vez el servicio se baje y se vuelva a restaurar; ésto es para no perjudicar a los usuarios de la aplicación quienes podrían tener la impresión de una aplicación lenta.

Mejor aún si crea una copia de la aplicación, para tener una en producción y otra en desarrollo para hacer las pruebas. Para conocer como crear una aplicación en Cocoon consulte la sugerencia que está al final de la sección Sección 6.2.2


8.3.3. Código del subsitemap

El subsitemap, el cual debe estar ubicado como ya se dijo en la ruta $MiAplicacion/ debe seguir el siguiente estilo:

Miremos un poco este subsitemap:


Apéndice A. Formato de reunión semanal


A.2. Descripción formato de reunión semanal

En el formato de reunión semanal se pueden identificar tres componentes: información general de la reunión, agenda de la reunión e informes por rol.

Cabe anotar que mientras la información general es de carácter obligatorio, la agenda y los informes por rol pueden o no aparecer en el documento, pero si aparecen será sólo una vez.

A continuación se describen estos tres elementos


A.3. XML


A.3.2. Ejemplo XML con el formato de reunión semanal de Ingeniería de Software


A.3.2.2. XML del formato de reunión semanal

Aquí podemos apreciar un ejemplo de un posible documento XML del formato de reunión semanal.

Puede obtener el fuente de este ejemplo haciendo click aquí.

Ejemplo A-2. Ejemplo de un documento XML para el formato de reunión semanal


<?xml version="1.0" standalone="no"?>
<!DOCTYPE reunionSemanal SYSTEM "reunionSemanal.dtd">
<reunionSemanal> 
  <informacionGeneral> 
	 <sitio> Oficina W302 </sitio> 
	 <fecha> 27 de Febrero de 2002 </fecha> 
	 <horaInicio> 4:00 pm </horaInicio> 
	 <horaFin> 5:32 pm </horaFin> 
	 <secretario> Juan Torres </secretario> 
	 <asistente> Saúl Zarrate Cardenas </asistente> 
	 <asistente> Juan Pablo Quiroga </asistente> 
	 <asistente> Jaime Irving Dávila </asistente> 
  </informacionGeneral> 
  <agenda> <aspectos> 
	 <aspecto> 
		<descripcion> Practicar DTD, XML </descripcion> 
		<propuestas> 
		  <propuesta aprobado="No"> 

			 <textoPropuesta> Desarrollar un ejemplo con el Formato de Lanzamiento
				de Ingenieria de Software </textoPropuesta> 
			 <decision> Como ya se presentó el Formato de
     de Lanzamiento de Ingenieria de Software, 
					no hay que documentarlo </decision> 
		  </propuesta> 
		  <propuesta aprobado="Si"> 
			 <textoPropuesta> Desarrollar un ejemplo con el Formato de Reunión
				Semanal de Ingenieria de Software </textoPropuesta> 
		  </propuesta> 
		</propuestas> 
	 </aspecto> 
	 <aspecto> 
		<descripcion> Practicar XSL </descripcion> 
		<propuestas> 
		  <propuesta aprobado="Si"> 
			 <textoPropuesta> Desarrollar un ejemplo con el XML del Formato de
				Reunión Semanal de Ingenieria de
     Software para presentación en html
			</textoPropuesta> 
		  </propuesta> 
		</propuestas> 
	 </aspecto> 
	 <aspecto> 
		<descripcion> Practicar DocBook </descripcion> 
		<propuestas> 
		  <propuesta aprobado="Si"> 
			 <textoPropuesta> Documentar el desarrollo del XML y el XSL del
				Formato de Reunión de Ingenieria de
     Software </textoPropuesta>
		  </propuesta> 
		</propuestas> 
	 </aspecto> </aspectos> 
  </agenda> 
  <informesPorRol> 

	 <informePorRol rol="planeacion"> 
		Se cumplió con las expectativas de las metas planeadas
	 </informePorRol> 
	 <informePorRol rol="soporte"> 
		Se dieron vinculos de Internet para poder tener ayudas en el desarrollo
		de los temas
	 </informePorRol> 
	 <informePorRol rol="desarrollo"> 
		El trabajo acordado es interesante y cumple con lo buscado
	 </informePorRol> 

  </informesPorRol> 

</reunionSemanal> 
    
    

A.4. XSL

XSL es el acrónimo de eXtensible Style Language (Lenguaje de Estilo eXtensible).


A.4.1. Algunos aspectos de XSL


A.4.1.4. Ejemplo de XSL con el formato de reunión semanal de Ingeniería de Software para salida en HTML

Para obtener el fuente XSL puede hacer click en este enlace.

Ejemplo A-3. Ejemplo de una XSL para el formato de reunión semanal


<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

	<xsl:template match="/reunionSemanal">
		<HTML>
			<HEAD>
				<TITLE>
					Acta <xsl:apply-templates
					select="informacionGeneral/fecha"/>
				</TITLE>
			</HEAD>
			<BODY text="#000000" vLink="#840084"
			aLink="#0000ff" link="#0000ff"
			bgColor="#ffffff">
				<B>
					<font size="6">
						Acta
						<xsl:apply-templates
						select="informacionGeneral/fecha"/>
					</font>
					<BR></BR>
					<BR></BR>
					<font size="4">
						<xsl:apply-templates
						select="informacionGeneral/secretario"/>
					</font>
					<BR></BR>
					<BR></BR>
					<HR></HR>
					<BR></BR>
					<BR></BR>
					Tabla de Contenido
				</B>
				<BR></BR>
				<UL>
					<A href="#items">Items a discutir</A>
					<BR></BR>
					<A href="#decisionesTomadas">Decisiones tomadas</A>
					<BR></BR>
					<A href="#reportesDeRol">Reportes de rol</A>
				</UL>
				<HR></HR>
				<BR></BR>
				<B>
					<FONT SIZE="6">
						<A name="#items">Items a discutir</A>
					</FONT>
				</B>

				<BR></BR>
				<xsl:apply-templates select="agenda/aspectos"/>

				<HR></HR>
				<B>
					<FONT SIZE="6">
						<BR></BR>
						<A
						name="#decisionesTomadas">Decisiones
						Tomadas</A>
					</FONT>
				</B>

				<BR></BR>

				<xsl:apply-templates
				select="agenda/aspectos/aspecto/propuestas/propuesta"/>


				<HR></HR>
				<B>
					<FONT SIZE="6">
						<BR></BR>
						<A name="#reportesDeRol">Reportes de rol</A>
					</FONT>
				</B>

				<xsl:apply-templates select="informesPorRol"/>

			</BODY>
		</HTML>
	</xsl:template>

	<xsl:template match="fecha">
		<xsl:value-of select='.'/>
	</xsl:template>

	<xsl:template match="secretario">
		<xsl:value-of select='.'/> 
	</xsl:template>

	<xsl:template match="aspectos">
		<xsl:apply-templates select="aspecto"/>
	</xsl:template>

	<xsl:template match="aspecto">
		<UL>
			<LI>
				<xsl:value-of select="descripcion"/>
			</LI>
		</UL>
	</xsl:template>

	<xsl:template match="propuesta">
		<xsl:choose>
			<xsl:when test='decision!=""'>
				<UL>
					<LI>
						<xsl:value-of select="decision"/>
					</LI>
				</UL>
			</xsl:when>
		</xsl:choose>
	</xsl:template>

	<xsl:template match="informesPorRol">
		<xsl:apply-templates select="informePorRol"/>
		<BR>
		</BR>
	</xsl:template>

	<xsl:template match="informePorRol">
		<UL>
			<LI>
				Reporte de 
					<xsl:value-of select="@rol"/>:  
					<xsl:value-of select='.'/>
			</LI>
		</UL>
	</xsl:template>

</xsl:stylesheet>