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

Saxon/XSLT尾调用优化失效:Oxygen中栈溢出问题求助

问题分析与解决方法

Saxon-EE 11.4完全支持XSLT尾递归优化(包括函数、命名模板、apply-templates的尾递归场景),你在命令行能正常执行的结果已经验证了这一点。问题根源确实出在Oxygen与Saxon的集成配置上,核心是优化设置未正确生效,以下是具体排查和解决步骤:

一、确认Oxygen中Saxon的优化配置是否生效

  1. 打开Oxygen的「转换场景(Transform Scenarios)」,选中你的XSLT运行场景。
  2. 切换到「Processor」标签页,确保已选择Saxon-EE 11.4作为处理器。
  3. 进入「Options」区域:
    • 勾选「Enable optimizations」选项;
    • 将优化级别设置为「Basic」或更高(尾递归优化属于Saxon核心基础优化项)。
  4. 额外验证:在「Parameters」标签页手动添加Saxon命令行参数 -opt:full,强制开启所有优化(部分Oxygen版本的图形化选项可能未正确映射到Saxon的优化参数)。

二、检查Oxygen的JVM栈配置(辅助排查)

虽然命令行正常运行说明栈大小不是核心问题,但Oxygen默认JVM栈可能偏小:

  1. 打开Oxygen的「Options > Preferences > Java Virtual Machine」;
  2. 在「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配置缓存异常:

  1. 关闭Oxygen;
  2. 找到Oxygen配置目录(Windows下通常为C:\Users\[用户名]\AppData\Roaming\com.oxygenxml);
  3. 备份后删除saxon相关配置文件,重启Oxygen后重新配置转换场景。

内容的提问来源于stack exchange,提问作者MrD at KookerellaLtd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:19:52