Apache FOP中调用XSL自定义函数失败的问题求助
问题原因及解决建议
核心原因:FOP对XSLT自定义函数的支持限制
Apache FOP 2.x默认使用的Xalan处理器仅支持XSLT 1.0,而xsl:function是XSLT 2.0及以上版本才引入的特性,直接使用会导致处理器无法识别,进而报错。
具体排查与解决步骤
替换为XSLT 1.0兼容写法
若你的XSLT声明了version="2.0",可将自定义函数替换为XSLT 1.0支持的xsl:template+xsl:call-template组合。
示例替换:
原自定义函数:<xsl:function name="my:numberFromMm" as="xs:decimal"> <xsl:param name="mm" as="xs:string"/> <xsl:sequence select="xs:decimal($mm) * 0.352778"/> </xsl:function>改为模板实现:
<xsl:template name="numberFromMm"> <xsl:param name="mm"/> <xsl:value-of select="number($mm) * 0.352778"/> </xsl:template>调用时使用:
<xsl:call-template name="numberFromMm"> <xsl:with-param name="mm" select="your-target-value"/> </xsl:call-template>配置支持XSLT 2.0的处理器
给FOP搭配Saxon处理器(如Saxon-HE 9.x),即可支持XSLT 2.0的自定义函数。需将Saxon的jar包放入FOP的类路径,调用时指定使用该处理器。
示例命令(假设Saxon jar在当前目录):java -cp "fop.jar;saxon-he-9.9.1-7.jar" org.apache.fop.cli.Main -xsl test.xsl -xml source.xml -pdf output.pdf检查命名空间绑定正确性
确认自定义函数的my命名空间在XSLT根元素中正确声明,例如:<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://example.com/custom-functions" exclude-result-prefixes="my">命名空间URI可为任意有效标识(无需是真实网址),但需保证定义和调用函数时命名空间一致。
排查函数内部语法兼容性
若函数使用了XPath 2.0专属语法(如xs:decimal类型转换),在XSLT 1.0环境下需替换为兼容写法,比如用number()替代xs:decimal()。
内容的提问来源于stack exchange,提问作者Ambidex
相关产品推荐
相关产品推荐

