<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" encoding="ISO-8859-1"/>
  <xsl:strip-space elements="*"/>
  <xsl:variable name="upperAlphabet">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
  <xsl:variable name="lowerAlphabet">abcdefghijklmnopqrstuvwxyz</xsl:variable>
  <xsl:variable name="upperAndLowerAlphabet" select="concat($upperAlphabet,$lowerAlphabet)"/>

  <xsl:template name="toLowerCase">
    <xsl:param name="str"/>
    <xsl:value-of select="translate($str,$upperAlphabet,$lowerAlphabet)"/>
  </xsl:template>

  <xsl:template name="toUpperCase">
    <xsl:param name="str"/>
    <xsl:value-of select="translate($str,$lowerAlphabet,$upperAlphabet)"/>
  </xsl:template>

  <xsl:template name="trim-and-lower">
    <xsl:param name="str"/>
    <xsl:call-template name="toLowerCase">
      <xsl:with-param name="str" select="normalize-space($str)"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="capitalize">
    <xsl:param name="str1"/>
    <xsl:variable name="first_letter" select="substring($str1,1,1)"/>
    <xsl:variable name="first_letter_cap">
      <xsl:call-template name="toUpperCase">
        <xsl:with-param name="str" select="$first_letter"/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:value-of select="concat($first_letter_cap,substring($str1,2))"/>
  </xsl:template>

  <xsl:template name="decapitalize">
    <xsl:param name="str1"/>
    <xsl:variable name="first_letter" select="substring($str1,1,1)"/>
    <xsl:variable name="first_letter_decap">
      <xsl:call-template name="toLowerCase">
        <xsl:with-param name="str" select="$first_letter"/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:value-of select="concat($first_letter_decap,substring($str1,2))"/>
  </xsl:template>

  <xsl:template name="isLetter">
    <xsl:param name="char"/>
    <xsl:if test="contains($upperAndLowerAlphabet,$char)">
      <xsl:text>yes</xsl:text>
    </xsl:if>
  </xsl:template>

  <xsl:template name="isUpper">
    <xsl:param name="char"/>
    <xsl:if test="contains($upperAlphabet,$char)">
      <xsl:text>yes</xsl:text>
    </xsl:if>
  </xsl:template>

  <xsl:template name="isLower">
    <xsl:param name="char"/>
    <xsl:if test="contains($lowerAlphabet,$char)">
      <xsl:text>yes</xsl:text>
    </xsl:if>
  </xsl:template>

  <xsl:template name="areAllLettersUpper">
    <xsl:param name="str"/>
    <xsl:if test="normalize-space($str)">
      <xsl:choose>
        <xsl:when test="string-length($str) &gt; number(1)">
          <xsl:variable name="letter">
            <xsl:call-template name="isLetter">
              <xsl:with-param name="char" select="substring($str,1,1)"/>
            </xsl:call-template>
          </xsl:variable>
          <xsl:choose>
            <xsl:when test="normalize-space($letter)">
              <xsl:variable name="upper">
                <xsl:call-template name="isUpper">
                  <xsl:with-param name="char" select="substring($str,1,1)"/>
                </xsl:call-template>
              </xsl:variable>
              <xsl:if test="normalize-space($upper)">
                <xsl:call-template name="areAllLettersUpper">
                  <xsl:with-param name="str" select="substring($str,2)"/>
                </xsl:call-template>
              </xsl:if>
            </xsl:when>
            <xsl:otherwise>
              <xsl:call-template name="areAllLettersUpper">
                <xsl:with-param name="str" select="substring($str,2)"/>
              </xsl:call-template>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
          <xsl:variable name="letter">
            <xsl:call-template name="isLetter">
              <xsl:with-param name="char" select="substring($str,1,1)"/>
            </xsl:call-template>
          </xsl:variable>
          <xsl:choose>
            <xsl:when test="normalize-space($letter)">
              <xsl:variable name="upper">
                <xsl:call-template name="isUpper">
                  <xsl:with-param name="char" select="substring($str,1,1)"/>
                </xsl:call-template>
              </xsl:variable>
              <xsl:if test="normalize-space($upper)">
                <xsl:text>yes</xsl:text>
              </xsl:if>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>yes</xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
