Ace*_*Ace 3 xml pdf xslt xsl-fo
当我将modspecs发布到pdf(XSL-FO)时,我遇到了一个问题.我的表存在问题,其中单元格的内容会将其列溢出到下一个列中.如何强制中断文本以便创建新行?
我无法手动插入零空格字符,因为以编程方式输入表条目.我正在寻找一个简单的解决方案,我只需添加到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, e.g. 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) > 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>
Run Code Online (Sandbox Code Playgroud)
有了这个,长单词在表格单元格中成功分解!不幸的是,副作用是其他地方的正常文本(比如在性别不足X中)现在分解单词,使它们出现在单独的行上.有没有办法将上述过程与表格隔离开来?
mzj*_*zjn 17
您可以使用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.template(hyphenate-url)位于xref.xsl中.
由于您使用的是XSLT 2.0:
<xsl:template match="text()">
<xsl:value-of
select="replace(replace(., '(\P{Zs})(\P{Zs})', '$1​$2'),
'([^\p{Zs}​])([^\p{Zs}​])',
'$1​$2')" />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
这是使用类别转义(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​'),
'​(\p{Zs})',
'$1')" />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
内部replace()在每13个非空格字符后插入字符,replace()如果第14个字符是空格字符,则外部固定它.
如果您使用AH Formatter,那么您可以使用axf:word-break="break-all"AH Formatter来破坏单词中的任何位置.请参阅https://www.antennahouse.com/product/ahf64/ahf-ext.html#axf.word-break.