XSLT多条件验证实现问题求助
解决XSLT多条件验证的逻辑问题
我来帮你排查下这两次尝试里的问题,然后给你正确的实现方案:
先说说你两次尝试里的错误
第一种尝试的问题
你的第一个变量定义里,test条件中的第二个CarTypeId没有写完整的节点路径:
<xsl:when test="(DocumentXML/ApplicationObject/Object/CarTypeId!='78') and (CarTypeId!='81')">
这里第二个CarTypeId的上下文和第一个不一致,XSLT找不到对应的节点,直接导致条件判断失效。必须保证两个条件里的节点路径完全一致才行。
第二种尝试的问题
这个写法有两个明显问题:
- 两个
test条件的括号都没闭合(!=78和!=81后面都缺了)),属于语法错误; - 逻辑完全搞反了:你写的是“不等于78就执行计算”或者“不等于81就执行计算”,但任何值都会满足其中一个条件(比如CarTypeId是78时,它不等于81会触发第二个
when;是81时不等于78会触发第一个when),导致永远走不到otherwise分支,完全不符合你的需求。
正确的实现代码
这里给你两种靠谱的写法,选哪种都可以:
写法一:用<xsl:choose>定义变量
<xsl:variable name="vatTerm"> <xsl:choose> <!-- 当CarTypeId是78或81时,直接返回$eptermfeetotalvat --> <xsl:when test="DocumentXML/ApplicationObject/Object/CarTypeId = '78' or DocumentXML/ApplicationObject/Object/CarTypeId = '81'"> <xsl:value-of select="$eptermfeetotalvat"/> </xsl:when> <!-- 其他情况执行指定计算 --> <xsl:otherwise> <xsl:value-of select="(($netterm + $termfee) * $vatrate) + $eptermfeetotalvat"/> </xsl:otherwise> </xsl:choose> </xsl:variable>
写法二:用XPath表达式直接计算(更简洁)
如果不需要把结果存到变量里,也可以直接用一行XPath表达式搞定:
<xsl:value-of select=" if (DocumentXML/ApplicationObject/Object/CarTypeId = '78' or DocumentXML/ApplicationObject/Object/CarTypeId = '81') then $eptermfeetotalvat else (($netterm + $termfee) * $vatrate) + $eptermfeetotalvat "/>
额外注意点
- 确认
CarTypeId的取值类型:如果是数字类型,把条件里的引号去掉(比如写成=78而不是='78'); - 确保
$netterm、$termfee、$vatrate、$eptermfeetotalvat这些变量在当前上下文里都能被正确访问到。
内容的提问来源于stack exchange,提问作者Hayat
相关产品推荐
相关产品推荐

