xsl-list
[Top] [All Lists]

[xsl] Capitalising the first letter

2007-04-17 16:10:38
Hi
I want to capitalise the first letter of a string in XSLT 1.0. Now, my solution to this seemingly simple problem is this:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:myns="uri.my.namespace"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

 <xsl:output method="text" />

 <xsl:template match="/">
   <xsl:call-template name="find_char_position">
<xsl:with-param name="in_string">abcdefghijklmnopqrstuvwxyz</xsl:with-param>
     <xsl:with-param name="char">A</xsl:with-param>
   </xsl:call-template>
   <xsl:text>
</xsl:text>
   <xsl:call-template name="find_char_position">
<xsl:with-param name="in_string">abcdefghijklmnopqrstuvwxyz</xsl:with-param>
     <xsl:with-param name="char"></xsl:with-param>
   </xsl:call-template>
   <xsl:text>
</xsl:text>
   <xsl:call-template name="capitalise">
     <xsl:with-param name="string">kamal</xsl:with-param>
</xsl:call-template> <xsl:text>
</xsl:text>
   <xsl:call-template name="capitalise">
     <xsl:with-param name="string">Kamal</xsl:with-param>
   </xsl:call-template>
   <xsl:text>
</xsl:text>
   <xsl:call-template name="capitalise">
     <xsl:with-param name="string"></xsl:with-param>
   </xsl:call-template>
   <xsl:text>
</xsl:text>
   <xsl:call-template name="capitalise">
     <xsl:with-param name="string">1amal</xsl:with-param>
   </xsl:call-template>
 </xsl:template>

 <xsl:template name="capitalise">
   <xsl:param name="string"/>
<xsl:variable name="lowercase_alphabet">
     <xsl:text>abcdefghijklmnopqrstuvwxyz</xsl:text>
   </xsl:variable>
   <xsl:variable name="uppercase_alphabet">
     <xsl:text>ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:text>
   </xsl:variable>
<xsl:variable name="letter_pos">
     <xsl:call-template name="find_char_position">
       <xsl:with-param name="in_string" select="$lowercase_alphabet"/>
       <xsl:with-param name="char" select="substring($string, '1', '1')"/>
     </xsl:call-template>
   </xsl:variable>
<xsl:choose> <xsl:when test="$letter_pos = -1"><xsl:value-of select="$string"/></xsl:when> <xsl:otherwise><xsl:value-of select="concat(substring($uppercase_alphabet, $letter_pos, 1), substring($string, 2))"/></xsl:otherwise> </xsl:choose> </xsl:template>

 <xsl:template name="find_char_position">
   <xsl:param name="in_string"/>
   <xsl:param name="char"/>
   <xsl:choose>
<xsl:when test="not(contains($in_string, $char)) or normalize-space($char) = ''">-1</xsl:when>
     <xsl:otherwise>
       <xsl:call-template name="find_char_position_rec">
<xsl:with-param name="pos">1</xsl:with-param> <xsl:with-param name="in_string" select="$in_string"/>
         <xsl:with-param name="char" select="$char"/>
</xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template>

 <xsl:template name="find_char_position_rec">
   <xsl:param name="pos"/>
   <xsl:param name="in_string"/>
   <xsl:param name="char"/>

   <xsl:choose>
<xsl:when test="starts-with(substring($in_string, $pos), $char)"><xsl:value-of select="$pos"/></xsl:when>
     <xsl:otherwise>
       <xsl:call-template name="find_char_position_rec">
         <xsl:with-param name="in_string" select="$in_string"/>
         <xsl:with-param name="pos" select="$pos + 1"/>
         <xsl:with-param name="char" select="$char"/>
</xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template>
</xsl:stylesheet>

Put aside the testing, this is just too long. Any ideas how I can simplify this solution? I have access to exslt functions.

Cheers.

--
Kamal Bhatt


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>