<xsl:template match="composition">
    <h3><xsl:value-of select="title"/></h3>
    <ul>
     <xsl:if test="string(date)">
       <li><xsl:value-of select="date"/></li>
     </xsl:if>
     <xsl:if test="string(length)">
       <li><xsl:value-of select="length"/></li>
     </xsl:if>
     <xsl:if test="string(instruments)">
       <li><xsl:value-of select="instruments"/></li>
     </xsl:if>
     <xsl:if test="string(publisher)">
       <li><xsl:value-of select="publisher"/></li>
     </xsl:if>    
    </ul>
    <p><xsl:apply-templates select="description"/></p>    
    
  </xsl:template>
The string() function converts the value of the element to a string
The number() function converts the value of the element to a number
Zero length strings are false
There are all the <, >, =, !=, 
<= and >= operators you expect