xml - tutorial - xsl-fo to pdf
XSL-FO: Force Wrap en entradas de tabla (2)
Tengo un problema donde cuando publico mis modspecs a pdf (XSL-FO). Mis tablas tienen problemas, donde el contenido de una celda desbordará su columna en la siguiente. ¿Cómo fuerzo un descanso en el texto para que se cree una nueva línea?
No puedo insertar manualmente caracteres de espacio cero ya que las entradas de la tabla se ingresan programáticamente. Estoy buscando una solución simple que simplemente pueda agregar a docbook_pdf.xsl (ya sea como atributo xsl: param o xsl:)
EDITAR: Aquí es donde estoy actualmente:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:import href="urn:docbkx:stylesheet"/>
...(the beginning of my stylesheet for pdf generation, e.g. header and footer content stuff)
<xsl:template match="text()">
<xsl:call-template name="intersperse-with-zero-spaces">
<xsl:with-param name="str" select="."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="intersperse-with-zero-spaces">
<xsl:param name="str"/>
<xsl:variable name="spacechars">
	

      
     ​
</xsl:variable>
<xsl:if test="string-length($str) > 0">
<xsl:variable name="c1" select="substring($str, 1, 1)"/>
<xsl:variable name="c2" select="substring($str, 2, 1)"/>
<xsl:value-of select="$c1"/>
<xsl:if test="$c2 != '''' and
not(contains($spacechars, $c1) or
contains($spacechars, $c2))">
<xsl:text>​</xsl:text>
</xsl:if>
<xsl:call-template name="intersperse-with-zero-spaces">
<xsl:with-param name="str" select="substring($str, 2)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
¡Con esto, las palabras largas se dividen con éxito en las celdas de la tabla! Desafortunadamente, el efecto secundario es que el texto normal en otro lugar (como en una X sexción inferior) ahora divide las palabras para que aparezcan en líneas separadas. ¿Hay alguna manera de aislar el proceso anterior a solo tablas?
En las palabras largas, intente insertar un carácter de espacio de ancho cero entre los caracteres donde se permite un corte.
Puede usar XSLT para insertar un espacio de ancho cero entre cada carácter. Aquí hay una forma de hacerlo: http://groups.yahoo.com/neo/groups/XSL-FO/conversations/topics/1177 .
Aquí hay una lista de correo donde se tratan varios enfoques del problema: http://www.stylusstudio.com/xsllist/200201/post80920.html .
Las hojas de estilo de SourceForge DocBook incluyen una plantilla para dividir las URL largas en salida FO; vea http://www.sagehill.net/docbookxsl/Ulinks.html#BreakLongUrls . La plantilla (
hyphenate-url
) está en xref.xsl .
Dado que estás usando XSLT 2.0:
<xsl:template match="text()">
<xsl:value-of
select="replace(replace(., ''(/P{Zs})(/P{Zs})'', ''$1​$2''),
''([^/p{Zs}​])([^/p{Zs}​])'',
''$1​$2'')" />
</xsl:template>
Esto está usando escapes de categoría ( http://www.w3.org/TR/xmlschema-2/#nt-catEsc ) en lugar de una lista explícita de caracteres para que coincida, pero podrías hacerlo de esa manera. Necesita dos replace()
porque el interno replace()
solo puede insertar el caracter entre cada segundo caracter. El replace()
externo replace()
coincide con los caracteres que no son caracteres espaciales o el carácter agregado por el replace()
interno replace()
.
Insertar después de cada decimotercera carácter no espacial:
<xsl:template match="text()">
<xsl:value-of
select="replace(replace(., ''(/P{Zs}{13})'', ''$1​''),
''​(/p{Zs})'',
''$1'')" />
</xsl:template>
El replace()
interno replace()
inserta el carácter después de cada 13 caracteres que no son de espacio, y el replace()
externo replace()
arregla si el 14º carácter era un carácter de espacio.
Si está utilizando AH Formatter, puede usar axf:word-break="break-all"
para permitir que AH Formatter se rompa en cualquier lugar dentro de una palabra. Ver https://www.antennahouse.com/product/ahf64/ahf-ext.html#axf.word-break .