Ok, so what am I missing here?
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/p">
<root>
<xsl:apply-templates select="node()[1]" mode="first"/>
<xsl:apply-templates select="div[1]"/>
</root>
</xsl:template>
<xsl:template match="node()" mode="first">
<p>
<xsl:copy/>
<xsl:apply-templates select="following-sibling::node()[1][not(self::div)]" mode="next"/>
</p>
</xsl:template>
<xsl:template match="node()" mode="next">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1][not(self::div)]" mode="next"/>
</xsl:template>
<xsl:template match="tag" mode="next">
<transformed-tag>
<xsl:apply-templates/>
</transformed-tag>
<xsl:apply-templates select="following-sibling::node()[1][not(self::div)]" />
</xsl:template>
<xsl:template match="div">
<xsl:copy-of select="."/>
<xsl:apply-templates select="following-sibling::node()[1][not(self::div)]" mode="first"/>
<xsl:apply-templates select="following::div[1]"/>
</xsl:template>
</xsl:stylesheet>