Saxon/XSLT尾调用优化失效:Oxygen中栈溢出问题求助
问题分析与解决方法
Saxon-EE 11.4完全支持XSLT尾递归优化(包括函数、命名模板、apply-templates的尾递归场景),你在命令行能正常执行的结果已经验证了这一点。问题根源确实出在Oxygen与Saxon的集成配置上,核心是优化设置未正确生效,以下是具体排查和解决步骤:
一、确认Oxygen中Saxon的优化配置是否生效
- 打开Oxygen的「转换场景(Transform Scenarios)」,选中你的XSLT运行场景。
- 切换到「Processor」标签页,确保已选择Saxon-EE 11.4作为处理器。
- 进入「Options」区域:
- 勾选「Enable optimizations」选项;
- 将优化级别设置为「Basic」或更高(尾递归优化属于Saxon核心基础优化项)。
- 额外验证:在「Parameters」标签页手动添加Saxon命令行参数
-opt:full,强制开启所有优化(部分Oxygen版本的图形化选项可能未正确映射到Saxon的优化参数)。
二、检查Oxygen的JVM栈配置(辅助排查)
虽然命令行正常运行说明栈大小不是核心问题,但Oxygen默认JVM栈可能偏小:
- 打开Oxygen的「Options > Preferences > Java Virtual Machine」;
- 在「VM arguments」中添加或调整
-Xss参数(例如-Xss2m),增大栈空间作为临时兜底方案。
三、快速确认尾递归代码的合规性
确保你的递归逻辑符合Saxon的尾递归判定标准:
- 函数中,递归调用必须是
return语句的直接返回值,无后续操作; - 模板中,递归调用是模板的最后执行步骤,无后续
xsl:apply-templates、xsl:value-of等节点。
示例合规尾递归函数:
<xsl:function name="kooks:pointlessLoop" as="xs:integer"> <xsl:param name="count" as="xs:integer"/> <xsl:sequence select="if ($count le 0) then 0 else kooks:pointlessLoop($count - 1)"/> </xsl:function>
四、重置Oxygen的Saxon配置(终极方案)
若以上步骤无效,可能是Oxygen配置缓存异常:
- 关闭Oxygen;
- 找到Oxygen配置目录(Windows下通常为
C:\Users\[用户名]\AppData\Roaming\com.oxygenxml); - 备份后删除
saxon相关配置文件,重启Oxygen后重新配置转换场景。
内容的提问来源于stack exchange,提问作者MrD at KookerellaLtd
相关产品推荐
相关产品推荐

