I would do something like this:
<xsl:template match="text()">
<RICHTEXT>
<xsl:apply-templates select="ancestor::*" mode="text-ancestor"/>
<xsl:value-of select="."/>
</RICHTEXT>
</xsl:template>
<xsl:template match="u" mode="text-ancestor">
<xsl:attribute name="UNDERLINE">true</xsl:attribute>
</xsl:template>
<xsl:template match="b" mode="text-ancestor">
<xsl:attribute name="BOLD">true</xsl:attribute>
</xsl:template>
<xsl:template match="i" mode="text-ancestor">
<xsl:attribute name="ITALIC">true</xsl:attribute>
</xsl:template>
<xsl:template match="*" mode="text-ancestor">
</xsl:template>
etc
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference