如何在使用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> </xsl:text> <!-- 添加换行符 --> </xsl:result-document> </xsl:template> </xsl:stylesheet>
3. 执行转换流程
通过命令行分两步执行:
- 用Saxon处理XSLT,生成FO文件和TXT文件
- 用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> </xsl:text> </xsl:for-each> </xsl:result-document>
内容的提问来源于stack exchange,提问作者Pooja
相关产品推荐
相关产品推荐

