XSLT技术问题:如何检测变量是否设置/赋值?避免转换失败
嘿,我来帮你搞定XSLT里变量的测试和容错问题:
1. 如何测试一个变量是否已设置?
首先得明确:在XSLT里,只要你在当前作用域内声明了变量(不管有没有给它赋值),它就是“已设置”的状态。如果尝试引用一个完全没声明过的变量,XSLT处理器会直接在编译阶段报错,根本到不了运行时测试这一步。
所以你实际想问的应该是“如何测试变量是否有有效的值/节点”——这就是第二个问题的范畴啦。
2. 如何测试变量是否有值,避免转换失败?
先看你提到的两种变量声明情况:
<xsl:variable name="ID" select="//MessageID"/>:这个变量会匹配所有MessageID节点,如果没有找到任何节点,它的值是空节点集<xsl:variable name="ID" select=""/>:这个变量直接被赋值为空字符串
这两种情况里,直接用<xsl:value-of select="$ID"/>本身就会输出空字符串,不会导致转换失败。但如果你想确保属性始终存在(哪怕值为空),或者要区分“有值”和“无值”的场景,可以这么处理:
方式一:使用属性值模板(最简洁)
如果你是要给容器节点加ID属性,直接用属性值模板就行,不管$ID是空节点集还是空字符串,属性都会生成,值为空字符串:
<Container ID="{$ID}"/>
方式二:显式判断(更灵活)
如果需要做更复杂的逻辑(比如有值时用变量值,无值时用默认值),可以用<xsl:choose>或者XSLT 2.0+的if表达式:
<Container> <xsl:attribute name="ID"> <!-- XSLT 1.0及以上通用写法 --> <xsl:choose> <!-- 测试变量是否有有效值:空节点集/空字符串都会返回false --> <xsl:when test="$ID"> <xsl:value-of select="$ID"/> </xsl:when> <xsl:otherwise> <xsl:text></xsl:text> <!-- 明确返回空字符串 --> </xsl:otherwise> </xsl:choose> </xsl:attribute> </Container>
如果用XSLT 2.0或更高版本,可以简化成:
<Container> <xsl:attribute name="ID" select="if ($ID) then $ID else ''"/> </Container>
补充:精准测试变量类型
如果你需要精准区分变量是空节点集还是空字符串:
- 测试是否有节点(针对第一种变量声明):用
count($ID) > 0(XSLT 1.0)或exists($ID)(XSLT 2.0+) - 测试是否是非空字符串(针对第二种变量声明):用
$ID != ''
内容的提问来源于stack exchange,提问作者BDC
相关产品推荐
相关产品推荐

