<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
  <xsl:output method="xml"/>

  <xsl:template name="CommonPrefix">
    <xsl:param name="a"/>
    <xsl:param name="b"/>

    <xsl:variable name="A" select="string-length($a)"/>
    <xsl:variable name="B" select="string-length($b)"/>

    <xsl:choose>
      <xsl:when test="$A &lt; $B">
        <xsl:call-template name="CommonPrefixRec">
          <xsl:with-param name="a" select="$a"/>
          <xsl:with-param name="b" select="substring($b,1,$A)"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="CommonPrefixRec">
          <xsl:with-param name="a" select="substring($a,1,$B)"/>
          <xsl:with-param name="b" select="$b"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="CommonPrefixRec">
    <xsl:param name="a"/>
    <xsl:param name="b"/>

    <xsl:variable name="mid" select="floor(string-length($a) div 2)"/>
    <xsl:variable name="a1" select="substring($a,1,$mid)"/>
    <xsl:variable name="b1" select="substring($b,1,$mid)"/>

    <xsl:choose>
      <xsl:when test="not(substring($a,1,1) = substring($b,1,1))"/>

      <xsl:when test="$a1 = $b1">
        <xsl:value-of select="$a1"/>
        <xsl:call-template name="CommonPrefixRec">
          <xsl:with-param name="a" select="substring($a,$mid + 1)"/>
          <xsl:with-param name="b" select="substring($b,$mid + 1)"/>
        </xsl:call-template>
      </xsl:when>

      <xsl:otherwise>
        <xsl:call-template name="CommonPrefixRec">
          <xsl:with-param name="a" select="substring($a,1,$mid)"/>
          <xsl:with-param name="b" select="substring($b,1,$mid)"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>


  <xsl:template match="/">
    <out>
      <xsl:call-template name="CommonPrefix">
        <xsl:with-param name="a" select="'abcdefghijklmnopqrstuvwxyz'"/>
        <xsl:with-param name="b" select="'abcdefghijklmnopqrstuvwxy0'"/>
      </xsl:call-template>
    </out>
  </xsl:template>

</xsl:stylesheet>

