XSL-FO 在 table 个单元格内包装长文本
XSL-FO wrapping long text inside table cells
我正在将在 Oracle APEX 运行 时生成的 table 导出为 pdf,使用 XSL-FO 作为报告查询模板。不幸的是,单元格内的长单词没有换行,它们与相邻的单元格重叠,使报告变得非常难看和无用。如何解决?
注意:我知道这个问题已经被问过很多次了。我的问题是 none 我找到的解决方案似乎有效。
特别是,我正在实施我在这里发现的内容:
XSL-FO: Force Wrap on Table Entries
使用此解决方案,不会发生任何事情。我尝试在模板中插入一个红色文本命令,以检查它是否有效,但答案是否定的。您可以看到我也尝试使用 "hyphenate" 和 "wrap-option",正如问题的其他答案中所见,但没有成功。我怎样才能解决这个问题? "intersperse-with-zero-spaces" 的模板是否放在正确的位置?
这是我的代码:
<xsl:stylesheet xmlns:fox="http://xml.apache.org/fop/extensions" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon" >
<xsl:variable name="_XDOFOPOS" select="''"/>
<xsl:variable name="_XDOFOPOS2" select="number(1)"/>
<xsl:variable name="_XDOFOTOTAL" select="number(1)"/>
<xsl:variable name="_XDOFOOSTOTAL" select="number(0)"/>
<!-- VARIOUS OTHER ATTRIBUTES HERE -->
<xsl:attribute-set name="cell">
<xsl:attribute name="background-color">#BODY_BG_COLOR#</xsl:attribute>
<xsl:attribute name="color">#BODY_FONT_COLOR#</xsl:attribute>
<xsl:attribute name="padding-start">5.15pt</xsl:attribute>
<xsl:attribute name="vertical-align">top</xsl:attribute>
<xsl:attribute name="padding-top">0.0pt</xsl:attribute>
<xsl:attribute name="padding-end">5.15pt</xsl:attribute>
<xsl:attribute name="number-columns-spanned">1</xsl:attribute>
<xsl:attribute name="height">0.0pt</xsl:attribute>
<xsl:attribute name="padding-bottom">0.0pt</xsl:attribute>
<xsl:attribute name="font-style">italic</xsl:attribute>
<xsl:attribute name="color">blue</xsl:attribute>
<xsl:attribute name="hyphenate">true</xsl:attribute>
<xsl:attribute name="wrap-option">wrap</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="header-color">
<xsl:attribute name="background-color">#HEADER_BG_COLOR#</xsl:attribute>
<xsl:attribute name="color">#HEADER_FONT_COLOR#</xsl:attribute>
</xsl:attribute-set>
<!-- Trying this to wrap long words -->
<xsl:template match="text()">
<xsl:call-template name="intersperse-with-zero-spaces">
<xsl:with-param name="str" select="."/>
<xsl:attribute name="color">red</xsl:attribute>
</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>
<!-- long word wrap end -->
<xsl:template match="DOCUMENT">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<!-- OTHER STUFF AND THE TABLE ... -->
</fo:root>
</xsl:template>
</xsl:stylesheet>
要查看是否使用了模板,请更改:
<xsl:value-of select="$c1"/>
至:
<fo:inline color="red"><xsl:value-of select="$c1"/></fo:inline>
要查看模板的效果,请将 <xsl:text>​</xsl:text>
中的 ​
更改为打印字符,例如 .
。你会得到更多溢出 table 单元格,但你会知道为什么。
我正在将在 Oracle APEX 运行 时生成的 table 导出为 pdf,使用 XSL-FO 作为报告查询模板。不幸的是,单元格内的长单词没有换行,它们与相邻的单元格重叠,使报告变得非常难看和无用。如何解决? 注意:我知道这个问题已经被问过很多次了。我的问题是 none 我找到的解决方案似乎有效。 特别是,我正在实施我在这里发现的内容: XSL-FO: Force Wrap on Table Entries
使用此解决方案,不会发生任何事情。我尝试在模板中插入一个红色文本命令,以检查它是否有效,但答案是否定的。您可以看到我也尝试使用 "hyphenate" 和 "wrap-option",正如问题的其他答案中所见,但没有成功。我怎样才能解决这个问题? "intersperse-with-zero-spaces" 的模板是否放在正确的位置?
这是我的代码:
<xsl:stylesheet xmlns:fox="http://xml.apache.org/fop/extensions" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon" >
<xsl:variable name="_XDOFOPOS" select="''"/>
<xsl:variable name="_XDOFOPOS2" select="number(1)"/>
<xsl:variable name="_XDOFOTOTAL" select="number(1)"/>
<xsl:variable name="_XDOFOOSTOTAL" select="number(0)"/>
<!-- VARIOUS OTHER ATTRIBUTES HERE -->
<xsl:attribute-set name="cell">
<xsl:attribute name="background-color">#BODY_BG_COLOR#</xsl:attribute>
<xsl:attribute name="color">#BODY_FONT_COLOR#</xsl:attribute>
<xsl:attribute name="padding-start">5.15pt</xsl:attribute>
<xsl:attribute name="vertical-align">top</xsl:attribute>
<xsl:attribute name="padding-top">0.0pt</xsl:attribute>
<xsl:attribute name="padding-end">5.15pt</xsl:attribute>
<xsl:attribute name="number-columns-spanned">1</xsl:attribute>
<xsl:attribute name="height">0.0pt</xsl:attribute>
<xsl:attribute name="padding-bottom">0.0pt</xsl:attribute>
<xsl:attribute name="font-style">italic</xsl:attribute>
<xsl:attribute name="color">blue</xsl:attribute>
<xsl:attribute name="hyphenate">true</xsl:attribute>
<xsl:attribute name="wrap-option">wrap</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="header-color">
<xsl:attribute name="background-color">#HEADER_BG_COLOR#</xsl:attribute>
<xsl:attribute name="color">#HEADER_FONT_COLOR#</xsl:attribute>
</xsl:attribute-set>
<!-- Trying this to wrap long words -->
<xsl:template match="text()">
<xsl:call-template name="intersperse-with-zero-spaces">
<xsl:with-param name="str" select="."/>
<xsl:attribute name="color">red</xsl:attribute>
</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>
<!-- long word wrap end -->
<xsl:template match="DOCUMENT">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<!-- OTHER STUFF AND THE TABLE ... -->
</fo:root>
</xsl:template>
</xsl:stylesheet>
要查看是否使用了模板,请更改:
<xsl:value-of select="$c1"/>
至:
<fo:inline color="red"><xsl:value-of select="$c1"/></fo:inline>
要查看模板的效果,请将 <xsl:text>​</xsl:text>
中的 ​
更改为打印字符,例如 .
。你会得到更多溢出 table 单元格,但你会知道为什么。