使用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**。可能的触发场景:
$count-all的计算逻辑依赖外部资源(如$f2、$f3指向的文件),这些文件可能被意外修改或路径变动,导致计算结果为0;- 旧版本运行环境中,Saxon对除法为零的处理更宽松(返回0或NaN而非报错),当前环境(即使旧版本)的配置被修改,触发了严格错误检查;
key('name')等键值的定义存在隐性依赖,环境变动后匹配结果异常,间接影响$count-all的计算。
修复步骤
- 排查$count-all取值:临时添加输出语句确认变量值:
<xsl:message>count-all value: <xsl:value-of select="$count-all"/></xsl:message> - 检查外部依赖文件:验证
KTU_XInclude.xml、taxonomy.xml的内容和路径是否与三年前一致; - 添加除数防护逻辑:修改运算代码避免除以零:
<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%' )" /> - 验证键值定义:检查样式表中
key元素的匹配规则,确认无异常变动。
关于样式表头部更新
当前样式表已使用XSLT 3.0规范,头部信息无需更新,重点放在除数为零的根源排查和防护逻辑添加。
内容的提问来源于stack exchange,提问作者Vanessa
相关产品推荐
相关产品推荐

