[xsl] Capitalising the first letter

Subject: [xsl] Capitalising the first letter
From: Kamal Bhatt <kbhatt@xxxxxxxxx>
Date: Wed, 18 Apr 2007 09:16:25 +1000
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

Current Thread