Hilfe, mach dir das Leben doch nicht so schwer. Es wuerde doch einfach reichen (vorausgesetzt ich habe deine xml struktur verstanden:
<xsl:template match="headline">
<xsl:element name="{concat('h',count(ancestor::*[preceding-sibling::headline]) + 1)}">
<xsl:for-each select="ancestor::*[preceding-sibling::headline]">
<xsl:value-of select="count(preceding-sibling::headline)"/>
<xsl:text>.</xsl:text>
</xsl:for-each>
<xsl:value-of select="count(preceding-sibling::headline) + 1"/>
</xsl:element>
</xsl:template>