如果节点不存在,则应用默认值

时间:2012-03-01 16:09:29

标签: xml xslt

如果提供的XML文档中不存在某个节点,我目前正在使用此构造来指定默认值。是否有更简洁的方式陈述同样的事情?

<xsl:choose>
  <xsl:when test="var_name"><xsl:value-of select="var_name"/></xsl:when>
  <xsl:otherwise>default</xsl:otherwise>
</xsl:choose>

1 个答案:

答案 0 :(得分:2)

<强>予。 XPath 2.0

使用

concat($yourVar, 'default'[not($yourVar)])

这是一个完整的XSLT 2.0转换

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="yourVar" select="'something'"/>
 <xsl:variable name="yourVar2" select="''"/>

 <xsl:template match="/">
  <xsl:sequence select="concat($yourVar, 'default'[not($yourVar)])"/>
  <xsl:text>&#xA;</xsl:text>
  <xsl:sequence select="concat($yourVar2, 'default'[not($yourVar2)])"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于任何XML文档(未使用)时,将为两个变量生成并输出所需的字符串

something
default

<强> II。 XPath 1.0

使用

concat($yourNodeExpr, 
       substring('default', 1 + 7*boolean($yourNodeExpr)))

如果字符串值包含至少一个节点,则生成字符串值$yourNodeExpr,否则生成字符串"default"

<强>解释

我们使用以下事实:

在XPath 1.0中,只要布尔值是算术运算符的操作数,该值就会转换为数字:number(false()) = 0number(true()) = 1。因此,如果boolean($yourNodeExpr)true(),则第二个参考substring above will become 1 + 7 = 8`,子字符串将为空字符串。

另一方面,如果boolean($yourNodeExpr)false(),则substring()的第二个参数为1+0 = 1,子字符串为字符串"default"

更通用的表达

concat(substring($val1, 1 div $cond1),
       substring($val1, 1 div $cond2)
       )

假设两个条件$cond1$cond2 互斥($cond1 and $cond2) = false()($cond1 or $cond2) = true()),那么以上表达式在$val1$cond1时生成字符串true(),并在$val2$cond2时生成字符串true()