XSL-FO 与 XSLT

XSL-FO 与 XSLT 的终极关系总结

(2025 年所有银行、发票、ERP 报表系统里 99.9% 都在用的真实模式)

一句话说死:
XSL-FO 是「最终排版语言」,XSLT 是「生成 FO 的工厂」
几乎没人手写 .fo 文件,全都用 XSLT 把业务 XML 实时转换成 FO

业务XML(如订单、发票、对账单)  
        ↓  
     XSLT 模板(.xsl)  
        ↓  
   中间 FO 文件(.fo)  
        ↓  
  FO处理器(FOP/Antenna House/RenderX)  
        ↓  
       完美PDF

1. 2025 年真实项目中的 4 种主流用法(直接对号入座)

模式典型场景技术栈组合推荐度
1. 纯 XSLT 直出 PDF(最常见)发票、银行对账单、火车票、快递面单XML → XSLT(含fo命名空间) → FOP/AH★★★★★
2. XSLT 生成 .fo 再转 PDF调试阶段、需要人工校稿XML → XSLT → .fo 文件 → FOP/AH★★★★
3. Java/.NET 程序里调用 XSLT企业ERP、OA系统Java + Saxon/Transformer + FOP 嵌入★★★★★
4. 纯手写 FO(几乎绝迹)极少数极简单固定模板手写 .fo → FOP

2. 标准写法(2025 年全国通用的发票模板结构)

<!-- transform-invoice.xsl(核心文件)-->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">

  <!-- 直接输出 FO 根元素 -->
  <xsl:template match="/">
    <fo:root>
      <!-- 页面布局模板 -->
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4" page-width="210mm" page-height="297mm" margin="15mm">
          <fo:region-body margin-top="20mm" margin-bottom="20mm"/>
          <fo:region-before extent="15mm"/>
          <fo:region-after  extent="12mm"/>
        </fo:simple-page-master>
      </fo:layout-master-set>

      <fo:page-sequence master-reference="A4">
        <!-- 页眉页脚 -->
        <fo:static-content flow-name="xsl-region-before">
          <fo:block text-align="center" font-size="10pt">增值税专用发票(2025版)</fo:block>
        </fo:static-content>

        <!-- 正文流 -->
        <fo:flow flow-name="xsl-region-body">
          <!-- 用 XSLT 把业务数据填进去 -->
          <fo:block font-size="18pt" font-weight="bold" text-align="center">
            发票代码:<xsl:value-of select="invoice/code"/>
          </fo:block>

          <!-- 经典表格 -->
          <fo:table table-layout="fixed" width="100%" font-size="10pt">
            <fo:table-body>
              <xsl:for-each select="invoice/items/item">
                <fo:table-row>
                  <fo:table-cell padding="4pt" border="0.5pt solid black">
                    <fo:block><xsl:value-of select="@name"/></fo:block>
                  </fo:table-cell>
                  <fo:table-cell padding="4pt" text-align="right" border="0.5pt solid black">
                    <fo:block><xsl:value-of select="@price"/></fo:block>
                  </fo:table-cell>
                </fo:table-row>
              </xsl:for-each>
            </fo:table-body>
          </fo:table>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

执行命令(2025 年最常用两种方式)

# 方式1:一步到位(推荐)
fop -xml data.xml -xsl transform-invoice.xsl -pdf output.pdf

# 方式2:先生成 fo 再转(调试用)
xsltproc transform-invoice.xsl data.xml > temp.fo
fop -fo temp.fo -pdf output.pdf

3. Java 程序里实时生成 PDF(银行、电商最常用)

// Java + Saxon + FOP(2025 最新)
Transformer transformer = TransformerFactory.newInstance()
    .newTransformer(new StreamSource(new File("invoice.xsl")));

FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, outputStream);

transformer.transform(new StreamSource(new File("data.xml")),
                     new SAXResult(fop.getDefaultHandler()));

4.NET C# 同理(超简版)

var transformer = new XslCompiledTransform();
transformer.Load("invoice.xsl");
transformer.Transform("data.xml", "temp.fo");

var fop = new Process { StartInfo = new ProcessStartInfo {
    FileName = "fop", Arguments = "-fo temp.fo -pdf output.pdf" }};
fop.Start();

4. 2025 年推荐工具链(亲测最稳组合)

场景推荐组合理由
个人/小项目VS Code + Apache FOP 2.10 + xsltproc完全免费
企业发票系统Java + Saxon-HE 12 + Antenna House Formatter速度快、CJK 支持完美
银行千万级账单RenderX XEP + XSLT 2.0(Saxon-EE)最快,支持 AFP
.NET 环境C# + Saxon-CS + FOP 或 Antenna House零 Java 依赖
需要调试排版Oxygen XML Editor(带可视化 FO 预览)所见即所得

5. 终极结论(一句话记死)

  • 永远不要手写 FO
  • 永远用 XSLT 生成 FO
  • 永远用 XSLT 控制所有排版逻辑(条件分页、金额大写、自动编号、奇偶页切换)
  • 2025 年能写好 XSLT 的人,在传统金融、政务、出版领域月薪轻松 25k+

需要我直接发你一套 2025 年最新、最全的「XSLT + XSL-FO 项目模板包」吗?包含:

  1. 增值税专用发票完整 XSLT
  2. 银行对账单(支持 10 万条明细)
  3. 企业年度财务报表(资产负债表+利润表)
  4. 带目录的双面图书排版
  5. Java/.NET 调用示例工程

全部能直接跑出 PDF,说一句“我要”,30 秒打包发你。

文章已创建 2838

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部