fo:数据单元溢出

时间:2009-02-26 07:17:10

标签: java xslt pdf-generation xsl-fo

我正在使用XSLT - > FO生成PDF。

如果列中的文本超出列的大小且文本中没有空格 - 则文本将跳转到下一个单元格或表格外部。

我希望文本在同一个单元格中占用。

Thanx in Advance, Swetha

2 个答案:

答案 0 :(得分:4)

您可以通过插入零宽度空格字符(U + 200B,HTML实体和#x200b)将文本拆分为单词,然后在这些位置会出现换行符:

<xsl:template name="split_value">
    <xsl:param name="value"/>
    <xsl:param name="max_length"/>
    <xsl:variable name="ret">
        <xsl:value-of select="substring($value, 1, $max_length)"/>
        <xsl:if test="string-length($value) &gt; $max_length">
            <xsl:value-of select="'&#x200b;'"/>
            <xsl:call-template name="split_value">
                <xsl:with-param
                    name="value"
                    select="substring($value, $max_length + 1)"
                />
                <xsl:with-param
                    name="max_length"
                    select="$max_length"
                />
            </xsl:call-template>
        </xsl:if>
    </xsl:variable>
    <xsl:value-of select="$ret"/>
</xsl:template>

注意:您可能希望增强模板,使其仅拆分$ max_length连续字符之间不存在空格的文本片段。


这是一个测试案例。

输入XML:

<data>0123456789</data>

样式表(生成HTML):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="xsl"
>
<xsl:template match="/">
    <html>
        <body
            style="font-family: Arial; font-size: 12pt; font-weight: normal"
        >
            <table width="4cm">
            <xsl:for-each select="/data">
                <tr><td>
                <xsl:call-template name="split_value">
                    <xsl:with-param
                        name="value"
                        select="text()"
                    />
                    <xsl:with-param
                        name="max_length"
                        select="number(4)"
                    />
                </xsl:call-template>
                </td>
                </tr>
            </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

如果可能,请截断多余的字母。使用xslt的length()和substring()函数。如果截断它,您还可以提供工具提示或显示整个文本的内容