Frontendplace Blog

Sharing Frontend developing ideas

  • Adds

Archive for August, 2009

Truncate text with ellipsis example with xslt

Posted by info on 2nd August 2009

This is an example I made for truncating text of an introduction text to a specified amount of characters. A new node variable is created and this node can be processed with the general xslt that processes the individual nodes inside this new created node.

see also http://p2p.wrox.com/xslt/75076-truncate-text-including-tags.html

Description:
        This template truncates the text of the introductie node until a maximum characters are reached. When the text is truncated
        an ellipsis is added to the truncated text. When the text is smaller than the maximum no ellipsis is added
        at the end of the introductie text a link will be added
       
        Parameters:
        * limit (optional) number of characters to limit by. Default 250 characters
        * suffix (optional) the suffix character string to use when the text is truncated. Default ‘…’
        * url (compulsary) the url on the ‘more’ link
        Example:
        <xsl:apply-templates select=”path/to/your/introductie” mode=”truncate”/>

<xsl:template match=“art:introductie” mode=“truncateTree”>
       
<xsl:param name=“limit” select=“250″/>
       
<xsl:param name=“suffix” select=“‘…’”/>
       
<xsl:param name=“url”/>
       
       
<!– copy introduction node to redesign the content and later process this copy–>
       
<xsl:variable name=“truncatedNode”>
           
<xsl:copy-of select=“*”/>
       
</xsl:variable>
       

       
<!– create new truncated node –>
       
<xsl:variable name=“truncatedNodeTree”>
           
<xsl:apply-templates mode=“truncate” select=“$truncatedNode/*”>
               
<xsl:with-param name=“limit” select=“$limit”/>
               
<xsl:with-param name=“suffix” select=“$suffix”/>
               
<xsl:with-param name=“url” select=“$url”/>
           
</xsl:apply-templates>
           
       
</xsl:variable>
       
       
<!–process new created truncated introduction tree with the general xslt–>
       
<xsl:apply-templates select=“$truncatedNodeTree/*”/>
       
   
</xsl:template>
   
   
<!– process each node –>
   
<xsl:template match=“*” mode=“truncate”>
       
<xsl:param name=“limit”/>
       
<xsl:param name=“suffix”/>
       
<xsl:param name=“url”/>
      
       
<xsl:variable name=“preceding-strings”>
           
<xsl:copy-of select=“preceding::text()”/>
       
</xsl:variable>
       
       
<!– precedingchar: number of characters up to the current node –>
       
<xsl:variable name=“precedingchar” select=“string-length(normalize-space($preceding-strings))”/>
       
       
<xsl:if test=“$precedingchar &lt; $limit”>
           
<xsl:element name=“{name()}”>
               
<xsl:copy-of select=“@*”/>
               
<xsl:apply-templates mode=“truncate”>
                   
<xsl:with-param name=“limit” select=“$limit”/>
                   
<xsl:with-param name=“suffix” select=“$suffix”/>
               
</xsl:apply-templates>
               
<!– only add link at end of first element this is the first node inside introductie–>
               
<xsl:if test=“position()=1″>
                   
<xsl:text> </xsl:text><link class=“actionLink” xlink:href=“{$url}” xlink:title=“More”>More</link>
               
</xsl:if>
           
</xsl:element>
       
</xsl:if>
   
</xsl:template>
   
   
<!– process each text node –>
   
<xsl:template match=“text()” mode=“truncate”>
       
<xsl:param name=“limit”/>
       
<xsl:param name=“suffix”/>
       
<xsl:variable name=“preceding-strings”>
           
<xsl:copy-of select=“preceding::text()”/>
       
</xsl:variable>
       
       
<!– precedingchar: number of characters up to the current node –>
       
<xsl:variable name=“precedingchar” select=“string-length(normalize-space($preceding-strings))”/>
       
       
<xsl:if test=“$precedingchar &lt; $limit”>
          
<!– totalchar: number of characters including current node –>
          
<xsl:variable name=“totalchar” select=“$precedingchar + string-length(.)”/>
          
          
<xsl:choose>
              
<xsl:when test=“$totalchar &gt; $limit “>
                  
<!– truncate until limit reached –>
                  
<xsl:value-of select=“substring(., 1, ($limit – $precedingchar))”/>
                  
<xsl:value-of select=“$suffix”/>
                  
<xsl:text> </xsl:text>
              
</xsl:when>
              
<xsl:otherwise>
                  
<!– dont have to truncate text –>
                  
<xsl:value-of select=“.”/>
              
</xsl:otherwise>
          
</xsl:choose>
       
</xsl:if>
       
   
</xsl:template> 

Posted in Scripting | 1 Comment »