Wrap within table-cell with long word in FOP
Solution 1
One option would be for you to break up the long number/word in XSLT while you're transforming to FO. You'd have to decide where you want it to break.
See also: XSL-FO fop. Long text flows into adjacent cells/block, obscuring stuff there
Update (copied from comment):
There must be copy/paste errors in the stylesheet... there is an <xsl:param>
, which is only supposed to occur at the beginning of a template, in the middle of the template. The stylesheet is therefore invalid. Are there supposed to be two templates? Also, I don't yet see the template named intersperse-with-zero-spaces
; but maybe you're still adding it.
Update 2:
The above has been fixed in the Question.
I had assumed the second template couldn't be intersperse-with-zero-spaces
, since it was calling that template. It didn't occur to me that it was supposed to be a recursive template!
By the way, if you have the option of using XSLT 2.0, the intersperse-with-zero-spaces
template could be replaced by a much more efficient regexp replace.
Solution 2
<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>
calling place use to call like below:
<fo:block text-align="left">
<xsl:call-template name="intersperse-with-zero-spaces">
<xsl:with-param name="str" select="data4"/>
</xsl:call-template>
</fo:block>
I tested, it's working fine.
Thevagabond
Trying to get different languages to work and always improve my skills.
Updated on October 23, 2020Comments
-
Thevagabond over 3 years
I have a table in FOP and it is working nicely until I get a very long word. The word then overwrites the cell ending in the table. I tried the wrap-option="wrap" within the table-cell and/or the block of the cell but it doesn't work
**Total Edit**
since I guess it is to complicated to just show bits here is the complete xsl file:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo"> <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes" /> <xsl:param name="tableCell" select="'1.0'" /> <!-- Globale Variablen START --> <xsl:param name="tabbgcolor" select="'#EEEEEE'" /> <!-- Globale Variablen ENDE --> <xsl:template match="/datasheet"> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions"> <fo:layout-master-set> <fo:simple-page-master page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="1cm" margin-left="1.5cm" margin-right="1.5cm" master-name="first"> <fo:region-body margin-top="20mm" margin-bottom="20mm" /> <fo:region-before extent="15mm" /> <fo:region-after extent="15mcm" /> </fo:simple-page-master> <fo:simple-page-master master-name="new" margin-right="1.0cm" margin-left="1.0cm" margin-bottom="1cm" margin-top="1cm" page-height="21cm" page-width="29.7cm"> <fo:region-body margin-top="30mm" margin-bottom="20mm" /> <fo:region-before extent="30mm" /> <fo:region-after extent="15mm" /> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence language="de" country="DE" master-reference="new" initial-page-number="1"> <fo:static-content flow-name="xsl-region-before"> <fo:block text-align="center" font-size="12pt" padding="5pt" font-weight="bold"> <xsl:value-of select="title" /> </fo:block> <fo:block text-align="right" font-size="12pt" padding="5pt" font-weight="bold"> <xsl:value-of select="date" /> </fo:block> <fo:block text-align="right" font-size="12pt" padding="0pt" font-weight="bold"> <xsl:value-of select="time" /> </fo:block> <fo:block> <fo:leader leader-length="100%" leader-pattern="rule" rule-thickness="2pt" color="black" /> </fo:block> </fo:static-content> <fo:static-content flow-name="xsl-region-after"> <fo:block text-align="center"> Seite <fo:page-number /> von <fo:page-number-citation ref-id="TheVeryLastPage" /> </fo:block> </fo:static-content> <fo:flow flow-name="xsl-region-body"> <fo:block> <fo:leader /> </fo:block> <fo:block> <fo:leader /> </fo:block> <fo:block> <fo:leader /> </fo:block> <fo:block font-weight="bold" padding="5pt" padding-top="25pt"> Jahre <xsl:value-of select="fromYear" /> bis <xsl:value-of select="toYear" /> </fo:block> <fo:block text-align="center"> <xsl:choose> <xsl:when test="dataList != ''"> <fo:table table-layout="fixed" width="100%" border-style="solide" border-width="1pt"> <fo:table-column column-width="25%" border-style="solid" border-width="1pt" /> <fo:table-column column-width="25%" border-style="solid" border-width="1pt" /> <fo:table-column column-width="25%" border-style="solid" border-width="1pt" /> <fo:table-column column-width="25%" border-style="solid" border-width="1pt" /> <fo:table-header> <fo:table-row> <fo:table-cell border-style="solid" font-weight="bold" border-width="0pt"> <fo:block> Cell1 </fo:block> </fo:table-cell> <fo:table-cell border-style="solid" font-weight="bold" border-width="0pt"> <fo:block> Cell2 </fo:block> </fo:table-cell> <fo:table-cell border-style="solid" font-weight="bold" border-width="0pt"> <fo:block> Cell3 </fo:block> </fo:table-cell> <fo:table-cell border-style="solid" font-weight="bold" border-width="0pt"> <fo:block> Cell4 </fo:block> </fo:table-cell> </fo:table-row> </fo:table-header> <fo:table-body> <xsl:for-each select="dataList"> <fo:table-row> <fo:table-cell padding="5pt" border-style="solid" border-width="1pt"> <fo:block text-align="left"> <xsl:value-of select="data1" /> </fo:block> </fo:table-cell> <fo:table-cell padding="5pt" border-style="solid" border-width="1pt"> <fo:block text-align="left"> <xsl:value-of select="data2" /> </fo:block> </fo:table-cell> <fo:table-cell padding="5pt" border-style="solid" border-width="1pt"> <fo:block text-align="left"> <xsl:value-of select="data3" /> </fo:block> </fo:table-cell> <fo:table-cell padding="5pt" border-style="solid" border-width="1pt"> <fo:block text-align="left"> <xsl:call-template name="intersperse-with-zero-spaces"> <xsl:with-param name="str" select="data4"/> </xsl:call-template> </fo:block> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table> </xsl:when> <xsl:otherwise> <fo:block padding="6cm" text-align="center" font-weight="bold" font-size="16pt">No data. </fo:block> </xsl:otherwise> </xsl:choose> </fo:block> <fo:block id="TheVeryLastPage"> </fo:block> </fo:flow> </fo:page-sequence> <!-- ___________________________________________________________________________________________________________ --> </fo:root> </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>
The cell data4 is the one with the problems.... like 255 digits or characters at once with no hyphen oder space.
The input is from a database but could be like:
<datasheet> <dataList> <data1>intro</data1> <data2>section</data2> <data3>cutters</data3> <data4>743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348</data4> </dataList> </datasheet>
the result should be a table like:
|cell1 |cell2 |cell3 |cell4 | _________________________________ |intro |section|cutters|7435767| |4687635| |7467569| |3846576| _________________________________
and so on in cell 4
Now the above works