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 < 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规范:
Saxon 9的处理逻辑:未指定类型的外部参数默认被视为
item()类型,若未传入参数,会被初始化为空序列()。调用number(())返回NaN,此时测试表达式中555 < NaN和555 = NaN的结果均为false,因此进入otherwise分支输出false。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
相关产品推荐
相关产品推荐

