XSL Stylesheet para transformar documento XML a PDF Acrobat ( Mediante FOP )

Vea la sección sobre Ant para transformar XML vía "XSL Stylesheets" para aplicar este "XSL Stylesheet" al documento XML.

Esta transformación genera un documento intermedio FOP productos.fo.

Si desea observar el documento PDF final productos.pdf solo abra Acrobat Reader de su ambiente.

<?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>

Menú Curso

XML y sus Orígenes

Manipulación y Proceso de XML

DOM, SAX y JDOM

Namespaces, Schemas y DTD's

XSL: XSLT, XPath y TraX

XMLRPC y SOAP (Web Services)

Diseño con XMLRPC

Diseño con SOAP .

Apéndice "A" (Procesando XML con parsers).

Apéndice "B" (Validando XML con Schemas y DTD's).

Apéndice "C" (XSL: XPath y "XSL Stylesheets").

Apéndice "D" (XMLRPC: Diseño).

Apéndice "E" (SOAP, WSDL, UDDI y WSIL : Diseño).