【问题标题】:fo:data-cell overflowfo:数据单元溢出
【发布时间】:2010-10-10 00:33:06
【问题描述】:

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

当列中的文本超过列的大小并且文本中没有空格时 - 文本会延伸到下一个单元格或表格之外。

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

提前感谢, 斯韦莎

【问题讨论】:

    标签: java xslt pdf-generation xsl-fo


    【解决方案1】:

    可以通过插入零宽空格字符(U+200B,HTML实体​)将文本拆分成单词,那么这些位置会出现换行:

    <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>
    

    【讨论】:

    • 你能告诉我如何在我的值中插入这些零宽度空格吗?我的值是一个数量,例如:23456789087 像这样。
    • 感谢 Juris。我用零宽度空间方法解决了我的问题。
    【解决方案2】:

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

    【讨论】:

    • 但在我的情况下,我无法截断多余的字母。
    • 也许你可以从前面的文本列中截断一些东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    相关资源
    最近更新 更多