2011-07-20 98 views
9

Intentando crear un archivo PDF basado en un XML y un archivo usando XMLSpy.¿Agregar salto de línea en un PDF con XSL-FO?

Estoy tratando de dividir un campo en dos líneas basadas en el contenido del campo.

Por ejemplo, si mi varialbe = "John Doe También conocido como Johnny D", Quiero ver así:

John Doe

Johnny D

Mi problema es que puede' t hacerlo funcionar incluso con todas las muestras en la red.

Aquí está mi código:

 <xsl:value-of disable-output-escaping="yes" select="concat(substring-before(//MyField,'AKA'),$newline,substring-after(//MyField,'AKA'))" /> 
    </xsl:when> 

Así que, básicamente, eveytime encuentro la cadena "AKA", quiero romper el campo en dos líneas. Así que mi código, encuentra la cadena, crea la nueva variable pero aún se muestra en una línea. He intentado crear una variable con una línea en blanco, utilizando todo tipo de técnicas, pero aún se muestra en una línea.

¿Alguna idea?

Respuesta

16

Consulte my answer here sobre el uso de una referencia a entidad hexadecimal y linefeed-treatment.


Editar

Tomé su código a partir de los comentarios y lo puse en plantilla en una hoja de estilo XSLT de muestra. Lo único que cambió fue:

  1. me cambió la variable de newline-&#xA;.
  2. He añadido linefeed-treatment="preserve" a su fo:block.

El uso de un archivo XML maniquí y la hoja de estilo XSLT, que produjo un documento XSL-FO que cuando se representa con FOP, produce "John Doe" y "Johnny D" en líneas separadas.

Aquí está el archivo XML:

<doc> 
    <MyField>John Doe AKA Johnny D</MyField> 
</doc> 

Aquí está la hoja de estilo XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/"> 
    <fo:root> 
     <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
      <fo:region-body margin="1in" margin-top="1.5in"/> 
     </fo:simple-page-master> 
     </fo:layout-master-set> 
     <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
      <xsl:apply-templates/> 
     </fo:flow> 
     </fo:page-sequence> 
    </fo:root> 
    </xsl:template> 

    <xsl:template match="doc"> 
    <xsl:variable name="newline" select="'&#xA;'"/>   
    <xsl:variable name="MyVar"> 
     <xsl:choose> 
     <xsl:when test="contains(//MyField,'AKA')"> 
      <xsl:value-of select="concat(substring-before(//MyField,'AKA'),$newline,substring-after(//MyField,'AKA'))"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="//MyField"/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <fo:block linefeed-treatment="preserve"> 
     <xsl:value-of select="$MyVar"/> 
    </fo:block> 
    </xsl:template> 

</xsl:stylesheet> 

Aquí es el resultado de XSL-FO:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
     <fo:region-body margin="1in" margin-top="1.5in"/> 
     </fo:simple-page-master> 
    </fo:layout-master-set> 
    <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:root> 
      <fo:layout-master-set> 
       <fo:simple-page-master page-height="11in" page-width="8.5in" master-name="my-page"> 
        <fo:region-body margin-top="1.5in" margin="1in"/> 
       </fo:simple-page-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="my-page"> 
       <fo:flow flow-name="xsl-region-body"> 
        <fo:block linefeed-treatment="preserve">John Doe 
Johnny D</fo:block> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

El PDF es una sola 8.5" x 11" página con este en él:

John Doe 
Johnny D 
+0

Simplemente no funciona para mí. He utilizado muchas muestras encontradas aquí pero nada parece funcionar. – Elkucho

+0

Su enlace no apareció. Además, ¿está utilizando Apache FOP para su procesador? –

+0

Lo siento, cuando dije, encontré aquí, quiero decir en este foro. ... y sí, estoy usando Apache FOP. – Elkucho

0

La respuesta por @ Daniel-Haley todavía produce un solo par de nombres cuando la fuente es:

<doc> 
    <MyField>John Doe AKA Johnny D</MyField> 
    <MyField>Johnny D AKA John Doe</MyField> 
    <MyField>John Smith</MyField> 
</doc> 

(En XPath 1.0, convirtiendo un conjunto de nodos en una cadena devuelve el valor de cadena de sólo el nodo en el conjunto de nodos que es el primero en el orden del documento. Ver https://www.w3.org/TR/xpath/#function-string.)

la hoja de estilo por debajo divide cualquier nodo de texto que contiene "AKA". Como el fo:block adjunto proviene del xsl:template para MyField, esta versión genera un fo:block vacío para causar el corte de línea.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:output indent="yes" /> 
<xsl:strip-space elements="*" /> 

<xsl:template match="/"> 
    <fo:root> 
     <fo:layout-master-set> 
      <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
       <fo:region-body margin="1in" margin-top="1.5in" /> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 
     <fo:page-sequence master-reference="my-page"> 
      <fo:flow flow-name="xsl-region-body"> 
       <xsl:apply-templates /> 
      </fo:flow> 
     </fo:page-sequence> 
    </fo:root> 
</xsl:template> 

<!-- Could change to match on 'MyField/text()[contains(., ' AKA ')]' 
    if necessary. --> 
<xsl:template match="text()[contains(., ' AKA ')]"> 
    <xsl:value-of select="substring-before(., ' AKA ')" /> 
    <fo:block /> 
    <xsl:value-of select="substring-after(., ' AKA ')" /> 
</xsl:template> 

<xsl:template match="MyField"> 
    <fo:block> 
     <xsl:apply-templates /> 
    </fo:block> 
</xsl:template> 

</xsl:stylesheet> 
Cuestiones relacionadas