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

Saxon 9升级至10后XSL参数类型解析差异咨询

Saxon 9升级至10后XSL参数类型默认行为变化导致结果不同,是否为预期行为?

将Saxon从9版本升级到10版本后,运行相同的XSL代码得到不同结果:Saxon 10默认将输入参数识别为字符串类型,而Saxon 9默认识别为数值类型。请问这是预期行为还是输入问题?

相关代码、输入数据及输出

XSL代码

<xsl:output method="xml" encoding="UTF-8"/>    
<xsl:param name="var.variable1"/>    
<xsl:template match="/">     
<result>       
<xsl:choose>         
<xsl:when test="(/TestData/amount &lt; number($var.variable1) or /TestData/amount = number($var.variable1))">           
<CompValue>true</CompValue>         
</xsl:when>          
<xsl:otherwise>           
<CompValue>false</CompValue>         
</xsl:otherwise>       
</xsl:choose>        
<amount>         
<xsl:value-of select="/TestData/amount/text()"/>       
</amount>        
 <var1>         
<xsl:value-of select="number($var.variable1)"/>      
</var1>    
</result> 
</xsl:template> 
</xsl:stylesheet>

输入数据

<?xml version="1.0" encoding="UTF-8"?>
<TestData><amount>555</amount></TestData>

Saxon 9输出

<?xml version="1.0" encoding="UTF-8"?>
<result><CompValue>false</CompValue><amount>555</amount><var1>NaN</var1></result>

Saxon 10输出

<?xml version="1.0" encoding="UTF-8"?>
<result><CompValue>true</CompValue><amount>555</amount><var1>NaN</var1></result>

解答

这是预期行为,根源在于Saxon 10对未声明类型的外部参数处理逻辑的调整,以更好地对齐XSLT 3.0规范:

  1. Saxon 9的处理逻辑:未指定类型的外部参数默认被视为item()类型,若未传入参数,会被初始化为空序列()。调用number(())返回NaN,此时测试表达式中555 < NaN和555 = NaN的结果均为false,因此进入otherwise分支输出false。

  2. Saxon 10的处理逻辑:未指定类型的外部参数默认被视为xs:string类型,若未传入参数,会被初始化为空字符串""。调用number("")同样返回NaN,但在比较时,Saxon 10对节点与NaN的类型转换逻辑发生变化:节点值(字符串"555")与NaN转换后的字符串"NaN"进行字符串比较,"555" < "NaN"的结果为true,因此条件成立输出true。

要避免这种版本差异,建议显式声明参数的类型(如<xsl:param name="var.variable1" as="xs:decimal?"/>),并确保传入参数的类型符合预期,或在代码中明确处理空值/非数值的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:43:10