执行XSLT时为何XPath认为max()的参数0是字符串?
问题根源与解决方案
首先,这个错误的核心是XSLT版本的语法不匹配,再加上你对max()函数的调用方式不符合对应版本的规范,导致处理器误判了参数类型。
为什么会出现这个错误?
这里分两种情况来看:
- 如果你在用XSLT 1.0:标准库的
max()函数只能处理节点集,根本不支持直接传入两个数值参数。你现在的写法max(0, $relationFieldRemainingBlanks)完全不符合1.0的语法规则,处理器无法识别这是标准的取最大值操作,反而可能把它误判为某个需要字符串参数的自定义/第三方函数,所以才会抛出“要求xs:string却提供xs:integer”的错误。 - 如果你在用XSLT 2.0及以上版本:标准的
max()函数只接受一个序列参数,而不是两个独立参数。你应该把要比较的值打包成一个序列(用括号包裹),比如max((0, $relationFieldRemainingBlanks))。直接传两个参数的写法会让处理器无法正确解析,进而触发类型检查错误。
另外你提到“0被解析为字符串”,其实这是对错误提示的小误解——错误说的是第二个参数(整数类型的$relationFieldRemainingBlanks)不符合某个函数要求的字符串类型,而非第一个参数0被当成字符串。
对应的解决办法
根据你使用的XSLT版本选择:
情况1:XSLT 1.0
因为1.0没有原生的数值取max函数,我们可以用xsl:choose逻辑来实现:
<xsl:variable name="spacesNeeded"> <xsl:choose> <xsl:when test="$relationFieldRemainingBlanks > 0"> <xsl:value-of select="$relationFieldRemainingBlanks"/> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:variable>
情况2:XSLT 2.0+
修正max()的调用方式,把参数改成序列形式即可:
<xsl:variable name="spacesNeeded" select="max((0, $relationFieldRemainingBlanks))"/>
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

