Dynamic Document Generator

Overview

This version is for Appian 23.2 and above. Cloud customers on a lower version of Appian that want to install this plugin should open a support case. Self-managed customers can find the latest jar for Appian 23.1 and lower version in the folder pre-23.2

Convert, merge and generate DOCX, PDF and XML files automatically in an Appian process

Key Features & Functionality

  • PDF from single DOCX with Fonts
    • Convert multiple DOCX files into a single PDF. Please note that the translation from DOCX to PDF is not always 1:1. The template may need to be tweaked or simplified to achieve the desired results.
  • PDF from DOCX without Fonts
    • Convert multiple DOCX files into a single PDF. Please note that the translation from DOCX to PDF is not always 1:1. The template may need to be tweaked or simplified to achieve the desired results. This will not support fonts.
  • PDF from XSL-FO Transformation
    • Uses XSLT to convert an XML to XSL-FO which is then converted to PDF
  • PDF from HTML
    • Converts an HTML document into a single page PDF.
  • PDF from HTML Transformation
    • Uses XSLT to convert an XML to HTML which is then converted to PDF
  • Text Doc from XSLT
    • Uses XSLT to convert an XML to a plain text document (such as HTML, another XML doc, etc).
  • DOCX from XHTML With Styling
    • Converts a valid XHTML file into a DOCX, allowing you to provide your own template file for style reference. Useful for creating dynamic documents that are editable
  • DOCX Merge
    • Merges one or more DOCX files together. If a header or footer exists in any document, they will be removed during the merge process.
    • A configurable separator can be specified: none, line break or page break

Function: xsltransform - Transform source XML using XSL Transform

Anonymous
Parents
  • Hello,

    I am looking for a recommendation with a solution we are bulding using the smart service PDF from XSL FO Transformation With Fonts, to get text justified when there is no space on it, but keeping words together correctly when text has proper spaces.

    We have found two different solutions that help us with part of the incident, but we are looking for another one to join both of them:

    1st Soultion: correct text (spaces or urls) are wrapping correctly but texts without spaces are going out of the border:

    <fo:block margin-left="0mm" margin-top="3mm" margin-bottom="0mm" linefeed-treatment='preserve' >
    <xsl:value-of select="descripcion_txt" />
    </fo:block>

    Result: 

    2nd Solutioncorrect text (spaces or urls) are being cut when "x" number of characters are reaching the border, but texts without spaces are shown correct.

    For this solution we are using 2 templates:

    <xsl:template name="zero_width_space_1">
    <xsl:param name="data"/>
    <xsl:param name="counter" select="0"/>
    <xsl:choose>
    <xsl:when test="$counter &lt; string-length($data)">
    <xsl:value-of select='concat(substring($data,$counter,1),"&#8203;")'/>
    <xsl:call-template name="zero_width_space_2">
    <xsl:with-param name="data" select="$data"/>
    <xsl:with-param name="counter" select="$counter+1"/>
    </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:template>

    <xsl:template name="zero_width_space_2">
    <xsl:param name="data"/>
    <xsl:param name="counter"/>
    <xsl:value-of select='concat(substring($data,$counter,1),"&#8203;")'/>
    <xsl:call-template name="zero_width_space_1">
    <xsl:with-param name="data" select="$data"/>
    <xsl:with-param name="counter" select="$counter+1"/>
    </xsl:call-template>
    </xsl:template>

    Block:

    <fo:block margin-left="0mm" margin-top="3mm" margin-bottom="0mm" linefeed-treatment='preserve' >
    <xsl:call-template name="zero_width_space_1">
    <xsl:with-param name="data" select="descripcion_txt"/>
    </xsl:call-template>
    </fo:block>

    Here is an example of the xml and xsl we are using:

    XML

    <doc>
    	<prefijo>
    		<nombre>Example</nombre>
    		<fecha>2023-03-16z</fecha>
    	</prefijo>
    	<seccion_campos>
    		<titulo_txt>DESCRIPCIÓN DEL ACTO O MOTIVO:</titulo_txt>
    		<descripcion_txt>Peropueden surgir empresas tecnológicas en países con legislaciones que hacen difícil cualquier emprendimiento? No hay duda de que un mal clima de negocios, burocracias infernales y la corrupción son grandes trabas. Es difícil crear una empresa innovadora en Venezuela, donde según los estudios del Banco Mundial de los que hablábamos en el prólogo hacen falta 17 trámites legales para registrar una nueva empresa, o en Argentina, donde se requieren 14, o en Brasil y Colombia, donde hacen falta 13, y que por lo general tardan varios meses en completarse.
    		
    I cannot find that it is an error from an XSLFO standpoint this surprises me, so maybe I just missed it, but from an implementation standpoint in other words, from within FOP, there really is no way to process hyphenation without knowing which language (and therefore which hyphenation dictionary to use. Probably what is happening is that FOP jumps to a default dictionary no doubt English or U.S. English. If you are using that default language your result is ok, but it is only by accident the FOP developers could just as easily have chosen Turkish as the default.	
    	
    		LOS INNOVADORES QUIEREN VIVIR EN LUGARES VIBRANTES </descripcion_txt>
    	</seccion_campos>
    	<seccion_campos>
    		<titulo_txt>EFECTO SOBRE LOS TENEDORES:</titulo_txt>
    		<descripcion_txt>efaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecto</descripcion_txt>
    	</seccion_campos>
    	<seccion_campos>
    		<titulo_txt>NOTA COMPARATIVA RESPECTO A LAS DIFERENCIAS MÁS RELEVANTES:</titulo_txt>
    		<descripcion_txt>find that it is an error from an XSLFO standpoint this surprises me, so maybe I just missed it, but from an implementation standpoint in other words, from within FOP, there really is no way to process hyphenation without knowing which language (and therefore which hyphenation dictionary to use. Probably what is happening is that FOP jumps to a default dictionary no doubt English or U.S. English. If you are using that default language your result is ok, but it is https://bmv-test.appiancloud.com/suite/design/lMBfe49_FfR7AnMpoon-ShAtibjpv4wDQFXudCPCREuKKkRzDRcUEpwDURnyVjx6t5Id2ExlrieqaqxXUWH2p-p8UnK2B1i6V-dwFn5rL-hfDlzgQ
    https://bmv-dev.appiancloud.com/suite/design/ksBCPzGojqGmiD_JHPtxO7RCAQ-3vL2745szbJZQQ8SUhuzlQk7uOeJCGKZaLcUdUNjeq78ZzD3wC_HeaHmkRH4V2TqtAoPkovRsTk
    
    
    </descripcion_txt>
    	</seccion_campos>
    	<seccion_campos>
    		<titulo_txt>URL:</titulo_txt>
    		<descripcion_txt>find that it is an error from an XSLFO standpoint this surprises me, so maybe I just missed it, but from an implementation standpoint in other words, from within FOP, there really is no way to process hyphenation without knowing which language (and therefore which hyphenation dictionary to use. Probably what is happening is that FOP jumps to a default dictionary no doubt English or U.S. English. If you are using that default language your result is ok, but it is https://grupovass.sharepoint.com/:x:/r/teams/BMV-Emisnet/_layouts/15/Doc.aspx?sourcedoc=%7B491E1B70-8EE3-4C32-B1B2-8EFAAC1E1713%7D&file=Incidentes%20reportados%20por%20BMV.xlsx&action=default&mobileredirect=true&clickparams=eyJBcHBOYW1lIjoiVGVhbXMtRGVza3RvcCIsIkFwcFZlcnNpb24iOiIyNy8yMzAyMDUwMTQyMSIsIkhhc0ZlZGVyYXRlZFVzZXIiOmZhbHNlfQ%3D%3D&cid=b21dabe8-a8cf-432e-a4bd-844b12946b5e</descripcion_txt>
    	</seccion_campos>
    </doc>

    XSL

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
    
     <xsl:template name="zero_width_space_1">
    	<xsl:param name="data"/>
    	<xsl:param name="counter" select="0"/>
    	<xsl:choose>
    		<xsl:when test="$counter < string-length($data)">
    			<xsl:value-of select='concat(substring($data,$counter,1),"​")'/>
    			<xsl:call-template name="zero_width_space_2">
    				<xsl:with-param name="data" select="$data"/>
    				<xsl:with-param name="counter" select="$counter+1"/>
    			</xsl:call-template>
    		</xsl:when>
    		<xsl:otherwise>
    		</xsl:otherwise>
    	</xsl:choose>
     </xsl:template>
     
     <xsl:template name="zero_width_space_2">
    	<xsl:param name="data"/>
    	<xsl:param name="counter"/>
    	<xsl:value-of select='concat(substring($data,$counter,1),"​")'/>
    	<xsl:call-template name="zero_width_space_1">
    		<xsl:with-param name="data" select="$data"/>
    		<xsl:with-param name="counter" select="$counter+1"/>
    	</xsl:call-template>
     </xsl:template>
     
      <xsl:template name="getDateBy">
       <xsl:param name="date_dt"/>
       <xsl:value-of select="concat('',substring($date_dt,9,2),'/',substring($date_dt,6,2),'/',substring($date_dt,1,4))" />
      </xsl:template>
      
    	<xsl:template match="doc">
    		<fo:root  xml:lang="es" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    			<fo:layout-master-set>
    				<fo:simple-page-master master-name="A4" page-width="220mm" page-height="280mm" margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
    					<fo:region-body margin-top="6cm" margin-bottom="1cm" margin-left="0mm" margin-right="5mm" />
    					<fo:region-before margin-top="0cm" margin-bottom="20cm" margin-left="0cm" margin-right="0cm" />
    					<fo:region-after margin-top="0cm" margin-bottom="1cm" margin-left="0cm" margin-right="3cm" />
    				</fo:simple-page-master>
    			</fo:layout-master-set>
    	
    			<fo:page-sequence master-reference="A4">
    			
    				<!-- HEADER -->
    				<fo:static-content flow-name="xsl-region-before" >
    					<fo:block-container height="0cm" background-color="white" margin-top="-20mm" margin-left="-10mm" margin-right="43mm" >
    					
    					<!-- NOMBRE DEL PREFIJO -->
    					<fo:block text-align="left" font-size="13pt" margin-top="25mm" margin-left="20mm" color="black" font-weight="bold" >
    						<xsl:value-of select="prefijo/nombre" />                 
    					</fo:block> 
    					<!-- TERMINA EL NOMBRE DEL PREFIJO -->
    					 
    					 <!-- LOGO -->
    					 <fo:block margin-left="135mm" margin-top="-15mm">
    					  <fo:external-graphic 
    						src = "url('data:image/png;base64,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')"
    						height="10.5cm" 
    						content-width="8.5cm" />     
    					 </fo:block>
    					<!-- TERMINA EL LOGO -->
    							
    					<!-- FECHA -->
    					<fo:block margin-left="15mm" margin-bottom="-30mm" margin-top="-63mm" >
    						<fo:table table-layout="fixed" width="100%" >
    							<fo:table-column column-width="249mm" />
    								<fo:table-body>
    									<fo:table-row>
    									<fo:table-cell>
    										<fo:block-container font-size="11pt" border-bottom-style="solid" border-color="black" >
    											<fo:block margin-left="-5mm" color="black" >Fecha:  
    												 <xsl:call-template name="getDateBy">
    													 <xsl:with-param name="date_dt" select="prefijo/fecha"/>
    												 </xsl:call-template>
    											</fo:block>
    										</fo:block-container>
    									</fo:table-cell>
    								</fo:table-row>
    							</fo:table-body>
    						</fo:table>
    					</fo:block>
    					<!-- TERMINA LA FECHA -->
    					
    				 </fo:block-container>
    				</fo:static-content>
    				<!-- TERMINA EL HEADER -->
    				
    				<!-- FOOTER -->
    				<fo:static-content flow-name="xsl-region-after" height="10cm">
    					<fo:block text-align="left" font-size="9pt" border-bottom-style="solid" border-top-style="solid" border-color="black" >
    						<fo:table table-layout="fixed" width="100%" >
    							<fo:table-column column-width="198mm" />
    							<fo:table-column column-width="2mm" />
    							<fo:table-body>
    								<fo:table-row>
    									<fo:table-cell>
    										<fo:block-container >
    											<fo:block margin-left="0mm" margin-top="1mm" margin-bottom="0.5mm" >
    												 Customer
    											</fo:block>
    										</fo:block-container>
    									</fo:table-cell>
    									<fo:table-cell>
    										<fo:block-container >
    											<fo:block margin-left="0mm" margin-top="1mm" margin-bottom="0.5mm" >
    												 <fo:page-number/>
    											</fo:block>
    										</fo:block-container>
    									</fo:table-cell>
    								</fo:table-row>
    							</fo:table-body>
    						</fo:table>
    					</fo:block>
    				</fo:static-content>
    				<!-- TERMINA EL FOOTER -->
    				
    				<!-- BODY -->
    				<fo:flow flow-name="xsl-region-body" >
    					<fo:block text-align="justify" font-size="9pt" >
    						<fo:table table-layout="fixed" width="100%" >
    							<fo:table-column column-width="200mm" />
    							<fo:table-body>
    								
    								<!-- SECCION DE CAMPOS DINAMICOS -->
    								<fo:table-row>
    									<fo:table-cell>
    										<fo:block font-size="11pt" >
    											<fo:table table-layout="fixed" width="100%" >
    												<fo:table-column column-width="200mm" />
    												<fo:table-column column-width="200mm" />
    												<fo:table-body>
    													<xsl:for-each select="seccion_campos">
    														<fo:table-row>
    															<fo:table-cell>
    																<fo:block-container >
    																	<fo:block margin-left="0mm" margin-top="6mm" margin-bottom="0mm" font-weight="bold" >
    																		 <xsl:value-of select="titulo_txt" />    
    																	</fo:block>
    																</fo:block-container>
    															</fo:table-cell>
    														</fo:table-row>
    														<fo:table-row>
    															<fo:table-cell>
    																<fo:block-container >
    																	<fo:block margin-left="0mm" margin-top="3mm" margin-bottom="0mm" linefeed-treatment='preserve' >
    																		<!-- 	 <xsl:value-of select="descripcion_txt" />			 -->
    																		<xsl:call-template name="zero_width_space_1">
    																				<xsl:with-param name="data" select="descripcion_txt"/>
    																			</xsl:call-template>
    																	</fo:block>
    																</fo:block-container>
    															</fo:table-cell>
    														</fo:table-row>
    													</xsl:for-each>
    												</fo:table-body>
    											</fo:table>
    										</fo:block>
    									</fo:table-cell>
    								</fo:table-row>
    								<!-- TERMINA SECCION DE CAMPOS DINAMICOS -->
    								
    							</fo:table-body>
    						</fo:table>
    					</fo:block>
    				<fo:block id="TheVeryLastPage"> </fo:block>
    				</fo:flow>
    				<!-- TERMINA EL BODY -->
    				
    			</fo:page-sequence>
    		</fo:root>
    	</xsl:template>
    </xsl:stylesheet>

Comment
  • Hello,

    I am looking for a recommendation with a solution we are bulding using the smart service PDF from XSL FO Transformation With Fonts, to get text justified when there is no space on it, but keeping words together correctly when text has proper spaces.

    We have found two different solutions that help us with part of the incident, but we are looking for another one to join both of them:

    1st Soultion: correct text (spaces or urls) are wrapping correctly but texts without spaces are going out of the border:

    <fo:block margin-left="0mm" margin-top="3mm" margin-bottom="0mm" linefeed-treatment='preserve' >
    <xsl:value-of select="descripcion_txt" />
    </fo:block>

    Result: 

    2nd Solutioncorrect text (spaces or urls) are being cut when "x" number of characters are reaching the border, but texts without spaces are shown correct.

    For this solution we are using 2 templates:

    <xsl:template name="zero_width_space_1">
    <xsl:param name="data"/>
    <xsl:param name="counter" select="0"/>
    <xsl:choose>
    <xsl:when test="$counter &lt; string-length($data)">
    <xsl:value-of select='concat(substring($data,$counter,1),"&#8203;")'/>
    <xsl:call-template name="zero_width_space_2">
    <xsl:with-param name="data" select="$data"/>
    <xsl:with-param name="counter" select="$counter+1"/>
    </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:template>

    <xsl:template name="zero_width_space_2">
    <xsl:param name="data"/>
    <xsl:param name="counter"/>
    <xsl:value-of select='concat(substring($data,$counter,1),"&#8203;")'/>
    <xsl:call-template name="zero_width_space_1">
    <xsl:with-param name="data" select="$data"/>
    <xsl:with-param name="counter" select="$counter+1"/>
    </xsl:call-template>
    </xsl:template>

    Block:

    <fo:block margin-left="0mm" margin-top="3mm" margin-bottom="0mm" linefeed-treatment='preserve' >
    <xsl:call-template name="zero_width_space_1">
    <xsl:with-param name="data" select="descripcion_txt"/>
    </xsl:call-template>
    </fo:block>

    Here is an example of the xml and xsl we are using:

    XML

    <doc>
    	<prefijo>
    		<nombre>Example</nombre>
    		<fecha>2023-03-16z</fecha>
    	</prefijo>
    	<seccion_campos>
    		<titulo_txt>DESCRIPCIÓN DEL ACTO O MOTIVO:</titulo_txt>
    		<descripcion_txt>Peropueden surgir empresas tecnológicas en países con legislaciones que hacen difícil cualquier emprendimiento? No hay duda de que un mal clima de negocios, burocracias infernales y la corrupción son grandes trabas. Es difícil crear una empresa innovadora en Venezuela, donde según los estudios del Banco Mundial de los que hablábamos en el prólogo hacen falta 17 trámites legales para registrar una nueva empresa, o en Argentina, donde se requieren 14, o en Brasil y Colombia, donde hacen falta 13, y que por lo general tardan varios meses en completarse.
    		
    I cannot find that it is an error from an XSLFO standpoint this surprises me, so maybe I just missed it, but from an implementation standpoint in other words, from within FOP, there really is no way to process hyphenation without knowing which language (and therefore which hyphenation dictionary to use. Probably what is happening is that FOP jumps to a default dictionary no doubt English or U.S. English. If you are using that default language your result is ok, but it is only by accident the FOP developers could just as easily have chosen Turkish as the default.	
    	
    		LOS INNOVADORES QUIEREN VIVIR EN LUGARES VIBRANTES </descripcion_txt>
    	</seccion_campos>
    	<seccion_campos>
    		<titulo_txt>EFECTO SOBRE LOS TENEDORES:</titulo_txt>
    		<descripcion_txt>efaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecto</descripcion_txt>
    	</seccion_campos>
    	<seccion_campos>
    		<titulo_txt>NOTA COMPARATIVA RESPECTO A LAS DIFERENCIAS MÁS RELEVANTES:</titulo_txt>
    		<descripcion_txt>find that it is an error from an XSLFO standpoint this surprises me, so maybe I just missed it, but from an implementation standpoint in other words, from within FOP, there really is no way to process hyphenation without knowing which language (and therefore which hyphenation dictionary to use. Probably what is happening is that FOP jumps to a default dictionary no doubt English or U.S. English. If you are using that default language your result is ok, but it is https://bmv-test.appiancloud.com/suite/design/lMBfe49_FfR7AnMpoon-ShAtibjpv4wDQFXudCPCREuKKkRzDRcUEpwDURnyVjx6t5Id2ExlrieqaqxXUWH2p-p8UnK2B1i6V-dwFn5rL-hfDlzgQ
    https://bmv-dev.appiancloud.com/suite/design/ksBCPzGojqGmiD_JHPtxO7RCAQ-3vL2745szbJZQQ8SUhuzlQk7uOeJCGKZaLcUdUNjeq78ZzD3wC_HeaHmkRH4V2TqtAoPkovRsTk
    
    
    </descripcion_txt>
    	</seccion_campos>
    	<seccion_campos>
    		<titulo_txt>URL:</titulo_txt>
    		<descripcion_txt>find that it is an error from an XSLFO standpoint this surprises me, so maybe I just missed it, but from an implementation standpoint in other words, from within FOP, there really is no way to process hyphenation without knowing which language (and therefore which hyphenation dictionary to use. Probably what is happening is that FOP jumps to a default dictionary no doubt English or U.S. English. If you are using that default language your result is ok, but it is https://grupovass.sharepoint.com/:x:/r/teams/BMV-Emisnet/_layouts/15/Doc.aspx?sourcedoc=%7B491E1B70-8EE3-4C32-B1B2-8EFAAC1E1713%7D&file=Incidentes%20reportados%20por%20BMV.xlsx&action=default&mobileredirect=true&clickparams=eyJBcHBOYW1lIjoiVGVhbXMtRGVza3RvcCIsIkFwcFZlcnNpb24iOiIyNy8yMzAyMDUwMTQyMSIsIkhhc0ZlZGVyYXRlZFVzZXIiOmZhbHNlfQ%3D%3D&cid=b21dabe8-a8cf-432e-a4bd-844b12946b5e</descripcion_txt>
    	</seccion_campos>
    </doc>

    XSL

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
    
     <xsl:template name="zero_width_space_1">
    	<xsl:param name="data"/>
    	<xsl:param name="counter" select="0"/>
    	<xsl:choose>
    		<xsl:when test="$counter < string-length($data)">
    			<xsl:value-of select='concat(substring($data,$counter,1),"​")'/>
    			<xsl:call-template name="zero_width_space_2">
    				<xsl:with-param name="data" select="$data"/>
    				<xsl:with-param name="counter" select="$counter+1"/>
    			</xsl:call-template>
    		</xsl:when>
    		<xsl:otherwise>
    		</xsl:otherwise>
    	</xsl:choose>
     </xsl:template>
     
     <xsl:template name="zero_width_space_2">
    	<xsl:param name="data"/>
    	<xsl:param name="counter"/>
    	<xsl:value-of select='concat(substring($data,$counter,1),"​")'/>
    	<xsl:call-template name="zero_width_space_1">
    		<xsl:with-param name="data" select="$data"/>
    		<xsl:with-param name="counter" select="$counter+1"/>
    	</xsl:call-template>
     </xsl:template>
     
      <xsl:template name="getDateBy">
       <xsl:param name="date_dt"/>
       <xsl:value-of select="concat('',substring($date_dt,9,2),'/',substring($date_dt,6,2),'/',substring($date_dt,1,4))" />
      </xsl:template>
      
    	<xsl:template match="doc">
    		<fo:root  xml:lang="es" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    			<fo:layout-master-set>
    				<fo:simple-page-master master-name="A4" page-width="220mm" page-height="280mm" margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
    					<fo:region-body margin-top="6cm" margin-bottom="1cm" margin-left="0mm" margin-right="5mm" />
    					<fo:region-before margin-top="0cm" margin-bottom="20cm" margin-left="0cm" margin-right="0cm" />
    					<fo:region-after margin-top="0cm" margin-bottom="1cm" margin-left="0cm" margin-right="3cm" />
    				</fo:simple-page-master>
    			</fo:layout-master-set>
    	
    			<fo:page-sequence master-reference="A4">
    			
    				<!-- HEADER -->
    				<fo:static-content flow-name="xsl-region-before" >
    					<fo:block-container height="0cm" background-color="white" margin-top="-20mm" margin-left="-10mm" margin-right="43mm" >
    					
    					<!-- NOMBRE DEL PREFIJO -->
    					<fo:block text-align="left" font-size="13pt" margin-top="25mm" margin-left="20mm" color="black" font-weight="bold" >
    						<xsl:value-of select="prefijo/nombre" />                 
    					</fo:block> 
    					<!-- TERMINA EL NOMBRE DEL PREFIJO -->
    					 
    					 <!-- LOGO -->
    					 <fo:block margin-left="135mm" margin-top="-15mm">
    					  <fo:external-graphic 
    						src = "url('data:image/png;base64,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')"
    						height="10.5cm" 
    						content-width="8.5cm" />     
    					 </fo:block>
    					<!-- TERMINA EL LOGO -->
    							
    					<!-- FECHA -->
    					<fo:block margin-left="15mm" margin-bottom="-30mm" margin-top="-63mm" >
    						<fo:table table-layout="fixed" width="100%" >
    							<fo:table-column column-width="249mm" />
    								<fo:table-body>
    									<fo:table-row>
    									<fo:table-cell>
    										<fo:block-container font-size="11pt" border-bottom-style="solid" border-color="black" >
    											<fo:block margin-left="-5mm" color="black" >Fecha:  
    												 <xsl:call-template name="getDateBy">
    													 <xsl:with-param name="date_dt" select="prefijo/fecha"/>
    												 </xsl:call-template>
    											</fo:block>
    										</fo:block-container>
    									</fo:table-cell>
    								</fo:table-row>
    							</fo:table-body>
    						</fo:table>
    					</fo:block>
    					<!-- TERMINA LA FECHA -->
    					
    				 </fo:block-container>
    				</fo:static-content>
    				<!-- TERMINA EL HEADER -->
    				
    				<!-- FOOTER -->
    				<fo:static-content flow-name="xsl-region-after" height="10cm">
    					<fo:block text-align="left" font-size="9pt" border-bottom-style="solid" border-top-style="solid" border-color="black" >
    						<fo:table table-layout="fixed" width="100%" >
    							<fo:table-column column-width="198mm" />
    							<fo:table-column column-width="2mm" />
    							<fo:table-body>
    								<fo:table-row>
    									<fo:table-cell>
    										<fo:block-container >
    											<fo:block margin-left="0mm" margin-top="1mm" margin-bottom="0.5mm" >
    												 Customer
    											</fo:block>
    										</fo:block-container>
    									</fo:table-cell>
    									<fo:table-cell>
    										<fo:block-container >
    											<fo:block margin-left="0mm" margin-top="1mm" margin-bottom="0.5mm" >
    												 <fo:page-number/>
    											</fo:block>
    										</fo:block-container>
    									</fo:table-cell>
    								</fo:table-row>
    							</fo:table-body>
    						</fo:table>
    					</fo:block>
    				</fo:static-content>
    				<!-- TERMINA EL FOOTER -->
    				
    				<!-- BODY -->
    				<fo:flow flow-name="xsl-region-body" >
    					<fo:block text-align="justify" font-size="9pt" >
    						<fo:table table-layout="fixed" width="100%" >
    							<fo:table-column column-width="200mm" />
    							<fo:table-body>
    								
    								<!-- SECCION DE CAMPOS DINAMICOS -->
    								<fo:table-row>
    									<fo:table-cell>
    										<fo:block font-size="11pt" >
    											<fo:table table-layout="fixed" width="100%" >
    												<fo:table-column column-width="200mm" />
    												<fo:table-column column-width="200mm" />
    												<fo:table-body>
    													<xsl:for-each select="seccion_campos">
    														<fo:table-row>
    															<fo:table-cell>
    																<fo:block-container >
    																	<fo:block margin-left="0mm" margin-top="6mm" margin-bottom="0mm" font-weight="bold" >
    																		 <xsl:value-of select="titulo_txt" />    
    																	</fo:block>
    																</fo:block-container>
    															</fo:table-cell>
    														</fo:table-row>
    														<fo:table-row>
    															<fo:table-cell>
    																<fo:block-container >
    																	<fo:block margin-left="0mm" margin-top="3mm" margin-bottom="0mm" linefeed-treatment='preserve' >
    																		<!-- 	 <xsl:value-of select="descripcion_txt" />			 -->
    																		<xsl:call-template name="zero_width_space_1">
    																				<xsl:with-param name="data" select="descripcion_txt"/>
    																			</xsl:call-template>
    																	</fo:block>
    																</fo:block-container>
    															</fo:table-cell>
    														</fo:table-row>
    													</xsl:for-each>
    												</fo:table-body>
    											</fo:table>
    										</fo:block>
    									</fo:table-cell>
    								</fo:table-row>
    								<!-- TERMINA SECCION DE CAMPOS DINAMICOS -->
    								
    							</fo:table-body>
    						</fo:table>
    					</fo:block>
    				<fo:block id="TheVeryLastPage"> </fo:block>
    				</fo:flow>
    				<!-- TERMINA EL BODY -->
    				
    			</fo:page-sequence>
    		</fo:root>
    	</xsl:template>
    </xsl:stylesheet>

Children
No Data