You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

说明

  1. 这段模板会匹配所有文本节点,用xsl:analyze-string识别“普通字符+目标标点”的组合。
  2. 在两者之间插入的<fo:inline space-before="0.2cm"/>是一个空的内联元素,FOP会为它渲染出0.2厘米的前置空白,正好对应标点前的额外间距。
  3. 如果需要调整间距大小,直接修改space-before的值即可,支持FOP兼容的单位(如mm、pt等)。
  4. 若要添加更多需要处理的标点,只需在regex中的第二个括号内补充对应的符号即可。

内容的提问来源于stack exchange,提问作者CrazyEight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:20:17