Apache FOP 2.8+SaxonHE12环境下,如何用XSLT在标点前添加间距?
在Apache FOP 2.8中给标点符号前添加额外间距的实现方法
当然可以实现,结合你用到的SaxonHE12(支持XSLT 3.0),完全能通过XSLT处理文本,在指定标点前插入额外间距。下面是具体的可行方案:
核心思路
利用XSLT的字符串分析功能,匹配逗号、问号、感叹号、句号等目标标点,在这些符号和前一个字符之间插入一个带有指定间距的FO内联元素,让FOP渲染时生成对应空白。
具体XSLT代码示例
<xsl:template match="text()"> <!-- 匹配逗号、问号、感叹号、句号,可根据需要增减标点 --> <xsl:analyze-string select="." regex="([^\,\?\!\.])([\,\?\!\.])"> <xsl:matching-substring> <!-- 输出匹配到的非标点字符 --> <xsl:value-of select="regex-group(1)"/> <!-- 插入0.2厘米的前置间距 --> <fo:inline space-before="0.2cm"/> <!-- 输出匹配到的标点符号 --> <xsl:value-of select="regex-group(2)"/> </xsl:matching-substring> <!-- 输出未匹配到的文本内容(无标点的部分) --> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:template>
说明
- 这段模板会匹配所有文本节点,用
xsl:analyze-string识别“普通字符+目标标点”的组合。 - 在两者之间插入的
<fo:inline space-before="0.2cm"/>是一个空的内联元素,FOP会为它渲染出0.2厘米的前置空白,正好对应标点前的额外间距。 - 如果需要调整间距大小,直接修改
space-before的值即可,支持FOP兼容的单位(如mm、pt等)。 - 若要添加更多需要处理的标点,只需在
regex中的第二个括号内补充对应的符号即可。
内容的提问来源于stack exchange,提问作者CrazyEight
相关产品推荐
相关产品推荐

