It all depends on how you want to pick the children elements. There are many ways to do this - the way you have used equates to stating "select all 'p' elements that have a 'p' element following them" - i.e. it will select all apart from the last one - exactly what you don't want.
Far better to simply use the position() xpath function:
Code:
<xsl:template match="fn">
<fn><xsl:apply-templates/></fn>
</xsl:template>
<xsl:template match="p[1]">
<p><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="p[position() > 1]">
<block><xsl:apply-templates/></block>
</xsl:template>