tags:

views:

128

answers:

2

So, I have an XSLT template which expects a node set as a parameter and uses this as display text. However, sometimes this node is empty in the XML and I want to pass default display text instead of the display text not showing up instead:

Works:

<xsl:call-template name="myTemplate">
    <xsl:with-param name="parm1" select="//element">
</xsl:call-template>

Doesn't work:

<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>

Any ideas as to how I could accomplish this? I've tried all sorts of things with no luck :(

It seems like all I need to do is create a new node with the display text I want, but I don't know if that is even possible?

Thanks

A: 

I'm guessing //element is a nodeset and using string-length() on it might not be valid. Try converting it to a string() first?

djc
`string-length()` is valid on a node set. It measures the string representation of the first node in the set.
Tomalak
+1  A: 

Implement the default handling in the template, because that's where it belongs. The calling side should be consistent and not have side-effects on the template behavior (i.e. you should not be able to "forget" passing in the default value).

<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>
Tomalak