所以, 我有一个XSLT模板,它希望将节点设置为参数并将其用作显示文本。但是,有时这个节点在XML中是空的,我想传递默认显示文本而不是显示文本而不是显示:
使用:
<xsl:call-template name="myTemplate">
<xsl:with-param name="parm1" select="//element">
</xsl:call-template>
不起作用:
<xsl:variable name="dispText">
<xsl:choose>
<xsl:when test="string-length(//element) = 0">
<xsl:value-of select="'Default Text'" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="//element" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="myTemplate">
<xsl:with-param name="parm1" select="$dispText">
</xsl:call-template>
关于如何实现这一目标的任何想法?我尝试了各种各样的事情,没有运气:(
似乎我需要做的就是使用我想要的显示文本创建一个新节点,但我不知道这是否可能?
由于
答案 0 :(得分:2)
在模板中实现默认处理,因为它就是它所属的位置。主叫方应该是一致的,不会对模板行为产生副作用(即你不应该“忘记”传递默认值)。
<xsl:template name="myTemplate">
<xsl:param name="parm1" /><!-- node set expected! -->
<!-- actual value or default -->
<xsl:variable name="value1">
<xsl:choose>
<xsl:when test="not($parm1 = '')">
<xsl:value-of select="$parm1" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$default1" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- work with $value1 from this point on -->
</xsl:template>
答案 1 :(得分:0)
我猜//元素是一个节点集,并且使用string-length()可能无效。尝试先将其转换为字符串()?