XSL-FO:强制换行表项

当我将我的modspecs发布为pdf(XSL-FO)时,我遇到了一个问题。 我的表格有问题,一个单元格的内容将溢出到下一个列。 如何在文本上强制中断以便创build新行?

我无法手动插入零空格字符,因为表项是以编程方式input的。 我正在寻找一个简单的解决scheme,我可以简单地添加到docbook_pdf.xsl(无论是作为xsl:param或xsl:属性)

编辑:这是我目前在哪里:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:import href="urn:docbkx:stylesheet"/> ...(the beginning of my stylesheet for pdf generation, eg header and footer content stuff) <xsl:template match="text()"> <xsl:call-template name="intersperse-with-zero-spaces"> <xsl:with-param name="str" select="."/> </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) &gt; 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> 

有了这个,长单词在表格单元格中成功分解了! 不幸的是,其副作用是其他地方的正常文本(如在X之下)现在分解了单词,使它们出现在单独的行中。 有没有办法将上述过程隔离到表格?

在长词中,尝试在允许中断的字符之间插入零宽度的空格字符 。

  • 您可以使用XSLT在每个字符之间插入零宽度的空格。 这是一种方法: http : //groups.yahoo.com/neo/groups/XSL-FO/conversations/topics/1177 。

  • 这里是一个邮件列表线程,讨论了这个问题的各种方法: http : //www.stylusstudio.com/xsllist/200201/post80920.html 。

  • SourceForge DocBook样式表包含一个用于分解FO输出中的长URL的模板; 请参阅http://www.sagehill.net/docbookxsl/Ulinks.html#BreakLongUrls 。 模板( hyphenate-url )位于xref.xsl中 。

由于您使用的是XSLT 2.0:

 <xsl:template match="text()"> <xsl:value-of select="replace(replace(., '(\P{Zs})(\P{Zs})', '$1&#x200B;$2'), '([^\p{Zs}&#x200B;])([^\p{Zs}&#x200B;])', '$1&#x200B;$2')" /> </xsl:template> 

这是使用类别转义( http://www.w3.org/TR/xmlschema-2/#nt-catEsc ),而不是一个明确的字符列表来匹配,但你可以这样做,而不是。 它需要两个replace()因为内部的replace()只能在每个第二个字符之间插入字符。 外部的replace()匹配不是空格字符的字符,也不是由内部的replace()添加的字符。


插入每十三个非空格字符之后:

 <xsl:template match="text()"> <xsl:value-of select="replace(replace(., '(\P{Zs}{13})', '$1&#x200B;'), '&#x200B;(\p{Zs})', '$1')" /> </xsl:template> 

内部replace()插入每13个非空格字符后面的字符,如果第14个字符是空格字符,则外部replace()会将其修复。


如果您使用的是AH Formatter,那么您可以使用axf:word-break="break-all"来允许AH格式化程序在一个单词内的任何地方断开。 请参阅https://www.antennahouse.com/product/ahf64/ahf-ext.html#axf.word-break