XSL生成500份HTML收据时最后两份报错XPTY0004求解决
解决XSLT生成收据时的XPTY0004类型错误
错误原因分析
你遇到的XPTY0004错误核心是:XSLT的*乘法运算符要求两个操作数都是单个数值,但你的表达式中第一个操作数返回了多个<unitats>节点组成的序列(比如最后两份收据的XML数据源里存在多个<unitats>元素),导致乘法运算无法执行。
前面498份能正常生成,说明这些收据的XML中<unitats>是单个节点,而最后两份的结构异常触发了隐藏逻辑问题——增加内存堆完全没用,因为这是代码逻辑错误,不是内存不足。
修复方案
找到llista_factures.xsl第17行的xsl:value-of的@select表达式,针对两种常见场景修改:
场景1:计算所有<unitats>总和 × 单价
如果需求是把所有<unitats>的数值相加后乘以单价,把原表达式中直接引用<unitats>的部分用sum()包裹:
<!-- 原错误示例表达式 --> <xsl:value-of select="unitats * preu" /> <!-- 修改后 --> <xsl:value-of select="sum(unitats) * preu" />
sum(unitats)会将所有<unitats>节点的数值求和,返回单个数值,再和preu执行乘法,符合运算符要求。
场景2:每个<unitats>分别×单价后求和
如果需求是每个<unitats>对应乘以单价,再累加结果,直接用sum()包裹整个乘法表达式:
<!-- 修改后 --> <xsl:value-of select="sum(unitats * preu)" />
这里会自动遍历每个<unitats>节点,分别和preu相乘,再将所有乘积求和。
额外检查
最后建议核对最后两份收据的XML数据源:如果多<unitats>是业务不允许的异常数据,需要在数据源层面做校验;如果是合法的多数量场景,上面的修改就能兼容单/多<unitats>两种情况。
内容的提问来源于stack exchange,提问作者AvilCavill
相关产品推荐
相关产品推荐

