XSLT中空decimal标签无法接受空值报错问题咨询
嘿,这个问题我之前做XML映射的时候也踩过坑!咱们先把问题理清楚:
你遇到的错误核心不是XSLT“不能发送空decimal标签”,而是目标XML的Schema规则不允许<LineAmount>元素带着空字符串存在——虽然这个标签是可选的,但“可选”的意思是「这个标签可以完全不出现」,而不是「标签可以存在但值是空字符串」。当你输出了空的<LineAmount>标签时,XML解析器会尝试把空字符串转换成xs:decimal类型,这自然会失败,因为空字符串根本不是有效的十进制数值。
那怎么解决呢?给你两个常用的方案:
方案1:只在有有效值时输出标签
既然标签是可选的,那最简单的方式就是只有当LineAmount有非空(且有效)的值时,才生成这个标签。你之前的IsBlank检查可能没考虑到空白字符的情况(比如全空格的字符串),建议用normalize-space来做更严谨的判断:
<!-- 只在LineAmount有非空有效值时生成标签 --> <xsl:if test="normalize-space(LineAmount) != ''"> <LineAmount> <xsl:value-of select="LineAmount"/> </LineAmount> </xsl:if>
normalize-space会把字符串前后的空格去掉,中间的连续空格换成单个空格,这样全空格的情况也会被判定为空,避免解析器把空白当成无效的decimal值。
方案2:必须输出标签时,用xsi:nil标记空值
如果你的下游系统要求即使没有值也要保留<LineAmount>标签,那可以用XML Schema标准的xsi:nil="true"来标记这个元素是“空值”,而不是“无效的decimal字符串”。
首先要在XSLT的根节点声明xsi命名空间:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
然后处理LineAmount的时候,给空值的元素加上xsi:nil属性:
<LineAmount> <xsl:if test="normalize-space(LineAmount) = ''"> <xsl:attribute name="xsi:nil">true</xsl:attribute> </xsl:if> <xsl:value-of select="LineAmount"/> </LineAmount>
这样生成的XML会是<LineAmount xsi:nil="true"/>或者<LineAmount xsi:nil="true"></LineAmount>,解析器看到这个属性就会知道这个元素没有有效值,不会尝试把空字符串转换成decimal,自然就不会报错了。
最后再提醒一下:你之前的IsBlank检查失效,可能是因为判断逻辑只处理了完全空的字符串(''),但没处理全空格的情况,换成normalize-space的判断应该就能解决这个问题啦。
内容的提问来源于stack exchange,提问作者Leth

