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

如何在使用XSLT处理XML时生成TXT对账日志(基于Apache FOP)

实现Apache FOP转换PDF同时生成对账TXT日志的方法

核心思路

利用XSLT 2.0及以上版本的xsl:result-document功能,在现有生成PDF的XSLT转换流程中,额外输出一份符合要求的TXT文件。

具体实现步骤

1. 确认XSLT处理器版本

Apache FOP默认搭配的Xalan是XSLT 1.0处理器,不支持多文档输出。需更换为支持XSLT 2.0的处理器(如Saxon-HE)。

2. 修改现有XSLT文件

在生成FO(PDF格式描述)的XSLT中,添加生成TXT的逻辑:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <!-- 主模板:同时生成FO和TXT -->
    <xsl:template match="/">
        <!-- 原有生成PDF的FO内容逻辑 -->
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm">
                    <fo:region-body margin="2cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="A4">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block>PDF内容:<xsl:value-of select="Details/Name"/></fo:block>
                    <fo:block>国家:<xsl:value-of select="Details/Country"/></fo:block>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>

        <!-- 生成对账TXT文件 -->
        <xsl:result-document method="text" href="reconciliation.txt">
            <!-- 提取XML标签值,按逗号分隔 -->
            <xsl:value-of select="Details/Name"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="Details/Country"/>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="Details/OtherInfo"/>
            <xsl:text>&#10;</xsl:text> <!-- 添加换行符 -->
        </xsl:result-document>
    </xsl:template>

</xsl:stylesheet>

3. 执行转换流程

通过命令行分两步执行:

  1. 用Saxon处理XSLT,生成FO文件和TXT文件
  2. 用Apache FOP将FO文件转换为PDF
# 第一步:生成FO和TXT
java -jar saxon-he.jar -s:input.xml -xsl:transform.xsl -o:output.fo

# 第二步:生成PDF
java -jar fop.jar -fo output.fo -pdf output.pdf

多Details节点的处理

如果XML包含多个<Details>节点,只需在TXT生成逻辑中添加循环:

<xsl:result-document method="text" href="reconciliation.txt">
    <xsl:for-each select="//Details">
        <xsl:value-of select="Name"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="Country"/>
        <xsl:text>,</xsl:text>
        <xsl:value-of select="OtherInfo"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:result-document>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:10:10