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

使用Oxygen XML更新XSL文件时遇Saxon-PE整数除零错误求助

解决Saxon-PE 9.9.1.7整数除法为零错误

问题背景

在Oxygen XML中更新一份三年未改动的XSL文件时,触发以下错误:

[Saxon-PE 9.9.1.7] Integer division by zero

三年前在线运行正常,现在即使使用旧版本执行转换,仍出现相同错误。数据XML文件未做修改,更新操作也与该报错代码无关。

报错相关代码

涉及整数运算的代码片段:

<xsl:value-of
    select="format-number(count(
       //$clanA-aff/key('name', @xml:id)[@cert]
       | //$clanA-aff/key('name-same', @xml:id)[@cert]
       | //$clanA-aff/key('w-ana', @xml:id)[@cert]
       | //$clanA-aff/key('w-same1', @xml:id)[@cert]
       | //$clanA-aff/key('w-same2', @xml:id)[@cert])
       div $count-all,
       '#.00%')"
     />

当前样式表头部信息

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:array="http://www.w3.org/2005/xpath-functions/array"
    xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml"
    xpath-default-namespace="http://www.tei-c.org/ns/1.0"
    exclude-result-prefixes="xs tei xsl math map array" version="3.0">
    <xsl:output method="html" encoding="utf-8" indent="yes" doctype-system="about:legacy-compat"/>
    <xsl:param name="f2" select="'KTU_XInclude.xml'"/>
    <xsl:param name="f3" select="'taxonomy.xml'"/>

    <xsl:mode on-no-match="shallow-copy"/>
    <xsl:strip-space elements="*"/>
    <!-- data -->
</xsl:stylesheet>

问题分析与解决

核心原因

报错直接指向div $count-all步骤,说明**$count-all变量的值为0**。可能的触发场景:

  1. $count-all的计算逻辑依赖外部资源(如$f2、$f3指向的文件),这些文件可能被意外修改或路径变动,导致计算结果为0;
  2. 旧版本运行环境中,Saxon对除法为零的处理更宽松(返回0或NaN而非报错),当前环境(即使旧版本)的配置被修改,触发了严格错误检查;
  3. key('name')等键值的定义存在隐性依赖,环境变动后匹配结果异常,间接影响$count-all的计算。

修复步骤

  1. 排查$count-all取值:临时添加输出语句确认变量值:
    <xsl:message>count-all value: <xsl:value-of select="$count-all"/></xsl:message>
    
  2. 检查外部依赖文件:验证KTU_XInclude.xml、taxonomy.xml的内容和路径是否与三年前一致;
  3. 添加除数防护逻辑:修改运算代码避免除以零:
    <xsl:value-of
        select="format-number(
            if ($count-all = 0) then 0
            else count(
                //$clanA-aff/key('name', @xml:id)[@cert]
                | //$clanA-aff/key('name-same', @xml:id)[@cert]
                | //$clanA-aff/key('w-ana', @xml:id)[@cert]
                | //$clanA-aff/key('w-same1', @xml:id)[@cert]
                | //$clanA-aff/key('w-same2', @xml:id)[@cert]
            ) div $count-all,
            '#.00%'
        )"
    />
    
  4. 验证键值定义:检查样式表中key元素的匹配规则,确认无异常变动。

关于样式表头部更新

当前样式表已使用XSLT 3.0规范,头部信息无需更新,重点放在除数为零的根源排查和防护逻辑添加。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:23:26