Camel Case strings in XSLT
The solution looks near optimal to me. If performance is an issue I would suggest the two following minor modifications:


The cleaning of the string regarding the special characters (&amp;nbsp; and &amp;#160;) is done at every calling level. You could introduce a third template called CamelCaseRecursive which would look like CamelCase but it would not contain the cleaning methods. So, CamelCase would be official external interface which would call CamelCaseRecursive which would call itself recursively. This change may save the more time the more words a text has on the average.
In CamelCaseWord you could contract the two &lt;xsl:value-of&gt; tags into one by using the concat() function: 

&lt;xsl:value-of 
    select="concat(translate(substring($text,1,1),
                             'abcdefghijklmnopqrstuvwxyz',
                             'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 
                   ' ',
                   translate(substring($text,2,string-length($text)-1), 
                             'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                             'abcdefghijklmnopqrstuvwxyz')
                   )" /&gt;



I would assume that the performance gains will be minimal with today's highly optimized XSLT processors. However, if this actually helps it would be great to learn about it!