Please try this stylesheet:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:redirect="http://xml.apache.org/xalan/redirect"
extension-element-prefixes="redirect">
<xsl:output method="xml" />
<xsl:template match="/">
<xsl:apply-templates select="topic" />
<xsl:apply-templates select="//topic[count(ancestor::topic) = 1]" />
</xsl:template>
<xsl:template match="topic">
<xsl:variable name="filename" select="concat(@id,'.xml')"/>
<redirect:write select="$filename">
<topic>
<xsl:copy-of select="@*" />
<xsl:apply-templates mode="x"/>
</topic>
</redirect:write>
</xsl:template>
<xsl:template match="topic[count(ancestor::topic) = 1]">
<xsl:variable name="filename" select="concat(@id,'.xml')"/>
<redirect:write select="$filename">
<xsl:copy-of select="." />
</redirect:write>
</xsl:template>
<xsl:template match="*" mode="x">
<xsl:if test="not(self::topic)">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates mode="x" />
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>