<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version="1.0">
<!-- La declaración anterior indica que se trata de un documento XML
utilizando el Namespace para XSL y Fop
-->
<!-- Este primer template para el elemento raíz
declara tres elementos de la librería FOP, el primero
fo:root indica el uso de FOP, el elemento fo:layout-master-set
es empleado para definir el formato de diversas paginas para el
documento pdf, en este caso solo se define
simple-page-master y es dentro de este elemento que
se declara el tamaño y características de la pagina
Posteriormente se da inicio al flujo (fo:flow )
de la pagina, la cual inicialmente define un bloque que
contiene un titulo con la características definidas
dentro del mismo elemento
Antes de terminar el flujo (fo:flow ) de la
página se llaman el resto de los templates para
el documento XML en cuestión.
-->
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="first"
page-height="29.7cm"
page-width="21cm"
margin-top="1cm"
margin-bottom="2cm"
margin-left="2.5cm"
margin-right="2.5cm">
<fo:region-body margin-top="3cm"/>
<fo:region-before extent="3cm"/>
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="first">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="18pt"
font-family="sans-serif"
line-height="24pt"
space-after.optimum="15pt"
background-color="black"
color="white"
text-align="center"
padding-top="3pt"
>
Información de Productos
</fo:block>
<xsl:apply-templates/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<!-- Al encontrarse el elemento productos dentro del
documento XML se generan los elementos FOP de una tabla (fo:table )
Dentro de este elemento deben ser definidos el número
y características de las columnas a utilizarse.
Posteriormente se define un renglón
(fo:table-row ) el cual contiene 5 celdas (fo:table-cell )
las cuales a su vez definen 5 bloques (fo:block )
con los títulos de la tabla.
Una vez cerrado el renglón (fo:table-row ) pero
antes de terminar la table (fo:table ) deben ser
aplicados el resto de los template 's
-->
<xsl:template match="productos">
<fo:table border-collapse="separate" border-width="0.5mm"
border-style="solid">
<fo:table-column column-width="3.2cm"/>
<fo:table-column column-width="3.2cm"/>
<fo:table-column column-width="3.2cm"/>
<fo:table-column column-width="3.2cm"/>
<fo:table-column column-width="3.2cm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell ><fo:block>Nombre</fo:block>
</fo:table-cell>
<fo:table-cell ><fo:block>Ubicación</fo:block>
</fo:table-cell>
<fo:table-cell ><fo:block>Disponibilidad</fo:block>
</fo:table-cell>
<fo:table-cell ><fo:block>Tiempo de Entrega</fo:block>
</fo:table-cell>
<fo:table-cell ><fo:block>Costo</fo:block>
</fo:table-cell>
</fo:table-row>
<xsl:apply-templates/>
</fo:table-body>
</fo:table>
</xsl:template>
<!-- En el siguiente template se inicia un renglón
table-row , el cual se mantiene abierto
hasta que son aplicados el resto de los template 's
-->
<xsl:template match="producto">
<fo:table-row>
<xsl:apply-templates/>
</fo:table-row>
</xsl:template>
<!-- El elemento nombre genera un bloque (fo:block )
el cual esta incluido dentro de una celda (fo:table-cell )
-->
<xsl:template match="nombre">
<fo:table-cell ><fo:block>
<xsl:value-of select="."/>
</fo:block></fo:table-cell>
</xsl:template>
<!-- El siguiente template también extrae el
valor del elemento en cuestión colocándolo en un bloque
(fo:block ) el cual a su vez esta incluido en una celda
(fo:table-cell )
También es generado un valor através de condicionales
el cual despliega un valor en color rojo através fo:inline
en dado caso de ser negativo el atributo disponible
-->
<xsl:template match="ubicacion">
<fo:table-cell><fo:block>
<xsl:value-of select="."/>
</fo:block></fo:table-cell>
<fo:table-cell>
<xsl:if test="@disponible='si'">
<fo:block>
Si
</fo:block>
</xsl:if>
<xsl:if test="@disponible='no'">
<fo:block>
<fo:inline color="red"> No </fo:inline>
</fo:block>
</xsl:if>
</fo:table-cell>
</xsl:template>
<!-- El elemento tiempoentrega genera un bloque
que se encuentra dentro de una celda (fo:table-cell)
-->
<xsl:template match="tiempoentrega">
<fo:table-cell ><fo:block>
<xsl:value-of select="."/>
</fo:block></fo:table-cell>
</xsl:template>
<!-- El elemento costo también genera un
bloque que se encuentra dentro de una celda
(fo:table-cell)
-->
<xsl:template match="costo">
<fo:table-cell ><fo:block>
<xsl:value-of select="."/>
</fo:block></fo:table-cell>
</xsl:template>
<!-- Se cierra el elemento raíz del documento XML -->
</xsl:stylesheet>
|