I think you may have to escape these characters. Here's a sample template that you can build upon and modify to suit your needs.
Code:
<xsl:template name="FixAmpersands">
<xsl:param name="StringValue"/>
<xsl:variable name="Ampersand" select="'&'" />
<xsl:choose>
<xsl:when test="contains($StringValue, $Ampersand)">
<xsl:value-of select="concat(substring-before($StringValue, $Ampersand), '&amp;', substring-after($StringValue, $Ampersand))"/>
<xsl:when>
<xsl:otherwise>
<xsl:value-of select="$StringValue"/>
<xsl:otherwise>
<xsl:choose>
<xsl:template>
Also, if you come up with something you'd like to share, post it over to the
SPXSLT project.