我正在创建XSLT文件。 我有一个从XML文件获取值的变量。但是可能会发生xml中没有值的引用,那时XSL变量将返回False / None(不知道)。我想要保持条件,如果变量没有值使用默认值。 怎么做 ?
答案 0 :(得分:25)
问题中提供的细节很少,您可以做的最简单的测试是:
<xsl:if test="$var">
...
</xsl:if>
如果您想为else-case提供输出,可以使用xsl:choose
:
<xsl:choose>
<xsl:when test="not($var)"> <!-- parameter has not been supplied -->
</xsl:when>
<xsl:otherwise> <!--parameter has been supplied --> </xsl:otherwise>
</xsl:choose>
第二个例子也将正确处理这个案例,即变量或参数没有提供实际值,即它等于空字符串。这有效,因为not('')
会返回true
。
答案 1 :(得分:14)
你没有解释“没有价值”的意思。 以下是通用解决方案:
not($v) and not(string($v))
此表达式的评估结果为true()
iff $v
“没有值”。
需要满足这两个条件,因为定义为$v
的字符串'0'
具有值,但not($v)
为true()
。< / p>
在XSLT 1.0中,如果“value”是节点集,或者值是标量(例如字符串,数字或布尔值),则可以使用不同的方式实现默认值。
@Alejandro提供了一种获取默认值的方法,如果应该包含节点集的变量为空。
如果变量应该包含标量,则以下表达式返回其值(如果有值)或(否则)返回所需的默认值:
concat($v, substring($default, 1 div (not($v) and not(string($v)))))
答案 2 :(得分:4)
答案 3 :(得分:0)
首先,所有变量都有值,因为XSLT属于声明范式:没有asignation指令,但是当你声明变量时,你也声明了它的值关系的表达式。
如果这个值是一个节点集数据类型(从你的问题看起来),那么你应该测试一个空节点集,以防没有选择任何东西。空节点集的有效布尔值为false。因此,@0xA3已回答:test="$node-set"
。
您写道:
如果变量没有值 使用默认值。怎么做?
那么,这取决于您要查找的数据类型。
假设节点设置数据类型:如果您想要$ node-set-1值,或者如果$ node-set-1为空,则为$ node-set-2,然后使用:
$node-set-1|$node-set-2[not($node-set-1)]
答案 4 :(得分:0)
我尝试了很多来自SO的解决方案,我的最后一个解决方案来自@ dimitre-novatchev,但是那个也没有每次都工作。最近我发现了随机谷歌搜索的另一个解决方案,想与社区分享。
为了检查空变量值,我们可以声明一个空变量并将其值与测试条件进行比较。这是代码片段:
<xsl:variable name="empty_string"/>
<xsl:if test="testVariableValue != $empty_string">
...
</xsl:if>
这里testVariableValue保存要测试为空的新变量的值 场景。 希望它有助于测试空变量状态。