Вы не можете «удалить» CDATA, но вы можете получить желаемый результат несколько грубо:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Detail>
<xsl:variable name="before" select="substring-before(//Detail,'<div class="heading">')" />
<xsl:variable name="afteropen" select="substring-after(//Detail,'<div class="heading">')" />
<xsl:variable name="body" select="substring-before($afteropen, '</div>')" />
<xsl:variable name="after" select="substring-after($afteropen, '</div>')" />
<xsl:value-of select="concat($before, '<h1>', $body, '</h1>',$after)"
disable-output-escaping="yes" />
</Detail>
</xsl:template>
</xsl:stylesheet>
Это будет работать для первого типа div, который вы пытаетесь проанализировать, и вы можете следовать чему-то похожему со вторым. Это может быть сделано более общим с некоторыми усилиями.