在 FOP 中用长字包裹在表格单元中
Posted
技术标签:
【中文标题】在 FOP 中用长字包裹在表格单元中【英文标题】:Wrap within table-cell with long word in FOP 【发布时间】:2013-06-23 10:41:47 【问题描述】:我在 FOP 中有一张桌子,它工作得很好,直到我得到一个很长的词。然后该单词会覆盖表格中结尾的单元格。我在表格单元格和/或单元格块中尝试了 wrap-option="wrap" 但它不起作用
**Total Edit**
因为我想在这里只显示位很复杂,所以这里是完整的 xsl 文件:
<?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- page- 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- page->
<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" border-style="solide" border->
<fo:table-column column- border-style="solid" border- />
<fo:table-column column- border-style="solid" border- />
<fo:table-column column- border-style="solid" border- />
<fo:table-column column- border-style="solid" border- />
<fo:table-header>
<fo:table-row>
<fo:table-cell border-style="solid" font-weight="bold" border->
<fo:block>
Cell1
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" font-weight="bold" border->
<fo:block>
Cell2
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" font-weight="bold" border->
<fo:block>
Cell3
</fo:block>
</fo:table-cell>
<fo:table-cell border-style="solid" font-weight="bold" border->
<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->
<fo:block text-align="left">
<xsl:value-of select="data1" />
</fo:block>
</fo:table-cell>
<fo:table-cell padding="5pt" border-style="solid" border->
<fo:block text-align="left">
<xsl:value-of select="data2" />
</fo:block>
</fo:table-cell>
<fo:table-cell padding="5pt" border-style="solid" border->
<fo:block text-align="left">
<xsl:value-of select="data3" />
</fo:block>
</fo:table-cell>
<fo:table-cell padding="5pt" border-style="solid" border->
<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>
单元格 data4 是有问题的单元格.... 像一次 255 个数字或字符,没有连字符或空格。
输入来自数据库,但可能类似于:
<datasheet>
<dataList>
<data1>intro</data1>
<data2>section</data2>
<data3>cutters</data3>
<data4>743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348</data4>
</dataList>
</datasheet>
结果应该是这样的表格:
|cell1 |cell2 |cell3 |cell4 |
_________________________________
|intro |section|cutters|7435767|
|4687635|
|7467569|
|3846576|
_________________________________
在单元格 4 中以此类推
现在上述工作
【问题讨论】:
为了帮助您的模板尝试穿插零空格,请显示您已放入模板的<xsl:template>
开始标记(开头),以及名为“intersperse”的模板- 零空格”。然后最好显示示例输入(至少一个带有长字符串的块)、预期输出(FO)和实际输出。
感谢您发布示例数据和更多样式表。样式表中一定有复制/粘贴错误...有一个<xsl:param>
,它应该只出现在模板的开头,在模板的中间。因此样式表无效。应该有两个模板吗?另外,我还没有看到名为 intersperse-with-zero-spaces 的模板;但也许你还在添加它。最后,您使用的是什么 XSLT 处理器 - Xalan? XSLT 1.1 是一个废弃的版本。
xsl 参数被删除了我使用newes FOP bin 的C&P 错误
就是这样你得到了解决方案... 需要添加到 需要删除上面的参数并且需要关闭第一个模板...现在它可以工作了(已修复见上文)
好。我很惊讶你的 XSLT 处理器没有给你一个错误。我会将评论的“解决方案”部分放入我的答案中,以便您接受它(单击复选标记)。 :-)
【参考方案1】:
<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>
调用地点使用如下调用:
<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>
我测试过,效果很好。
【讨论】:
【参考方案2】:您可以在转换为 FO 时拆分 XSLT 中的长数字/单词。您必须决定要在哪里中断。
另请参阅: XSL-FO fop. Long text flows into adjacent cells/block, obscuring stuff there
更新(从评论复制):
样式表中一定有复制/粘贴错误...有一个<xsl:param>
,它应该只出现在模板的开头,在模板的中间。因此样式表无效。应该有两个模板吗?另外,我还没有看到名为intersperse-with-zero-spaces
的模板;但也许你还在添加它。
更新 2:
上述问题已在问题中修复。
我假设第二个模板不可能是intersperse-with-zero-spaces
,因为它正在调用那个模板。我没想到它应该是一个递归模板!
顺便说一句,如果您可以选择使用 XSLT 2.0,intersperse-with-zero-spaces
模板可以替换为更有效的正则表达式替换。
【讨论】:
我试过这个,但它对我不起作用。我现在正在尝试零宽度空间方法,但不是很幸运.. 请参阅上面的编辑 前面的评论指的是第一次Update上面的部分答案。【参考方案3】:添加 hyphenate="true",然后它会自动调整表格单元格中的空格。
<fo:table-cell border-bottom- border-left-
border-right- border-top- font-size="9px"
padding-left="0px" border-style="solid" border-
border-color="white" padding-start="0px" padding-end="2px"
padding-before="0px" padding-after="0px" display-align="center"
text-align="start" hyphenate="true">
【讨论】:
连字符与“调整空格”无关,它通常不适用于导致问题的长数字字符串。以上是关于在 FOP 中用长字包裹在表格单元中的主要内容,如果未能解决你的问题,请参考以下文章
在EXCEL中用VBA操作WORD表格:怎样选择一个表格中除第一行以外的任意连续行(比如第2到4行)?
React.Fragment解决return中用div包裹的问题