XSLT使用for-each检查节点值更新变量实现pass/fail判定遇阻
解决XSLT中整体Pass/Fail判定变量未正确更新的问题
问题根源
XSLT是声明式函数式语言,变量一旦定义就不可修改。你在<xsl:for-each>内部重新定义的overallPassFail是局部变量,仅在当前<xsl:if>的作用域内有效,完全不会影响外部的同名变量。循环结束后,外部的overallPassFail始终保持初始值'true',这就是判定结果不符合预期的核心原因。
原代码的其他问题
- 节点选择错误:在
<xsl:for-each select="MsmtValueNode">的上下文里,当前节点已经是单个MsmtValueNode,此时select="MsmtValueNode"会选取当前节点的子MsmtValueNode,而非当前节点的值,正确写法应为select="."。 - 逻辑矛盾:循环内的判断会被后续节点覆盖(比如先遇到一个>2.5的节点设为
false,接着遇到<2.5的节点又设为true),无法实现“只要有一个失败就整体失败”的需求;同时未处理节点值等于2.5的情况。
正确实现方式
不需要用循环赋值,直接通过XPath集合判断即可实现需求,以下是几种常见场景的代码:
场景1:只要有一个MsmtValueNode的值>2.5则整体失败
<xsl:variable name="overallPassFail" select="not(exists(MsmtValueNode[. > 2.5]))" /> <xsl:choose> <xsl:when test="$overallPassFail"> <div class="status_label_overview status_label_passed_overview"> Passed </div> </xsl:when> <xsl:otherwise> <div class="status_label_overview status_label_failed_overview"> Failed </div> </xsl:otherwise> </xsl:choose>
场景2:只要有一个MsmtValueNode的值<2.5则整体失败
<xsl:variable name="overallPassFail" select="not(exists(MsmtValueNode[. < 2.5]))" /> <xsl:choose> <xsl:when test="$overallPassFail"> <div class="status_label_overview status_label_passed_overview"> Passed </div> </xsl:when> <xsl:otherwise> <div class="status_label_overview status_label_failed_overview"> Failed </div> </xsl:otherwise> </xsl:choose>
场景3:所有MsmtValueNode的值必须等于2.5才算通过(大于/小于都失败)
<xsl:variable name="overallPassFail" select="not(exists(MsmtValueNode[. != 2.5]))" /> <xsl:choose> <xsl:when test="$overallPassFail"> <div class="status_label_overview status_label_passed_overview"> Passed </div> </xsl:when> <xsl:otherwise> <div class="status_label_overview status_label_failed_overview"> Failed </div> </xsl:otherwise> </xsl:choose>
内容的提问来源于stack exchange,提问作者dyrov
相关产品推荐
相关产品推荐

