XSLT中otherwise代码块无法执行问题技术求助
咱们来一步步排查你的XSLT中otherwise块不执行的问题,结合你提供的XML和部分代码,我整理了几个最可能的原因和解决办法:
1. 分支逻辑覆盖了所有可能场景
首先检查你的<xsl:choose>下的<xsl:when>条件是不是把所有可能的情况都包含了,导致otherwise永远没有触发机会。比如如果你的逻辑是这样:
<xsl:choose> <xsl:when test="$openCloseValidation = 'open'">...</xsl:when> <xsl:when test="$openCloseValidation = 'close'">...</xsl:when> <xsl:otherwise>...</xsl:otherwise> </xsl:choose>
而你的XML中link的值只有open或close,那otherwise自然不会执行。
解决办法:
- 故意给XML的
link节点设一个非open/close的值(比如test),测试otherwise是否触发; - 检查是否存在空值、拼写错误的字符串等未覆盖的场景。
2. 变量取值包含隐形空白字符
你用<xsl:value-of select="link"/>赋值变量时,XML中的link节点可能包含换行、空格或制表符,导致变量值不是严格的open或close。比如XML如果是:
<link> open </link>
变量值会带有换行和空格,和'open'字符串不匹配。
解决办法:
用normalize-space()处理变量值,自动去除前后空白和内部多余空格:
<!-- 更简洁的写法 --> <xsl:variable name="openCloseValidation" select="normalize-space(link)" /> <xsl:variable name="holidayValidation" select="normalize-space(link1)" />
3. <xsl:choose>语法或嵌套错误
检查你的<xsl:choose>结构是否合规:
- 所有
<xsl:when>必须直接放在<xsl:choose>内部; - 有没有遗漏闭合标签(比如
<xsl:when>没写</xsl:when>); - 有没有嵌套错误(比如在
<xsl:when>里又嵌套了<xsl:choose>但没闭合)。
语法错误可能导致逻辑异常,让otherwise无法被识别。
4. 调试变量实际值
很多时候问题出在变量值和预期不符,你可以在<xsl:choose>前先输出变量的实际内容,确认是否符合预期:
<xsl:template match="category"> <xsl:variable name="openCloseValidation" select="normalize-space(link)" /> <xsl:variable name="holidayValidation" select="normalize-space(link1)" /> <!-- 调试输出 --> <p>Debug: openCloseValidation = '<xsl:value-of select="$openCloseValidation"/>'</p> <p>Debug: holidayValidation = '<xsl:value-of select="$holidayValidation"/>'</p> <xsl:choose> <!-- 你的分支逻辑 --> </xsl:choose> </xsl:template>
完整测试示例
这里给你一个可直接运行的测试代码,结合你的XML,确保otherwise能正常触发:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:template match="/"> <xsl:apply-templates select="Categories/category"/> </xsl:template> <xsl:template match="category"> <xsl:variable name="openCloseValidation" select="normalize-space(link)" /> <xsl:variable name="holidayValidation" select="normalize-space(link1)" /> <xsl:choose> <xsl:when test="$openCloseValidation = 'open' and $holidayValidation = 'close'"> <p>✅ 门店营业,非节假日</p> </xsl:when> <xsl:when test="$openCloseValidation = 'close'"> <p>❌ 门店关闭</p> </xsl:when> <xsl:otherwise> <p>⚠️ 未知状态:营业状态=<xsl:value-of select="$openCloseValidation"/>, 节假日状态=<xsl:value-of select="$holidayValidation"/></p> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
用你的原始XML测试会触发第一个<xsl:when>;如果把XML的link改成unknown,就会触发otherwise分支。
内容的提问来源于stack exchange,提问作者user2628187
相关产品推荐
相关产品推荐

