如何知道变量在XSLT中是否有价值

时间:2010-11-18 19:44:34

标签: xslt

我正在创建XSLT文件。 我有一个从XML文件获取值的变量。但是可能会发生xml中没有值的引用,那时XSL变量将返回False / None(不知道)。我想要保持条件,如果变量没有值使用默认值。 怎么做 ?

5 个答案:

答案 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)

如果名为<a>的变量包含任何内容,则可以使用string-length进行检查。

$reference

如有必要,也可以使用normalize-space

答案 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保存要测试为空的新变量的值 场景。 希望它有助于测试空变量状态。