将字符串传递给期望节点的模板参数?

时间:2010-02-16 19:55:07

标签: xslt xpath

所以, 我有一个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>

关于如何实现这一目标的任何想法?我尝试了各种各样的事情,没有运气:(

似乎我需要做的就是使用我想要的显示文本创建一个新节点,但我不知道这是否可能?

由于

2 个答案:

答案 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()可能无效。尝试先将其转换为字符串()?