OK, jeg havde ikke lige fanget din problemstilling. Det du bare skal gøre er at benytte <xsl:for-each> til at gennemløbe alle MenuCont-elementerne og så stadig benytte <xsl:call-template> som du gjorde fra starten. Altså noget i stil med dette:
<xsl:for-each select="Data/Menulist/Menu[Index=$p]/MenuCont">
<xsl:call-template name="linkparser">
<xsl:with-param name="input" select="." />
</xsl:call-template>
</xsl:for-each>
<xsl:template name="linkparser">
<xsl:param name="input" />
<xsl:choose>
<xsl:when test ="contains($input,'[link]')">
<xsl:variable name="txtBefore" select="substring-before($input,'[link]')" />
<xsl:variable name="txtAfter" select="substring-after($input,'[/link]')" />
<xsl:variable name="url" select="substring-before(substring-after($input, '[link]'), '[linktekst]')" />
<xsl:variable name="tekst" select="substring-before(substring-after($input, '[linktekst]'), '[/linktekst]')" />
<xsl:variable name="returnValue">
<xsl:value-of select="$txtBefore" /><a href="
http://{$url}" target="_blank"><xsl:value-of select="$tekst" /></a><xsl:value-of select="$txtAfter" />
</xsl:variable>
<xsl:call-template name="linkparser">
<xsl:with-param name="input" select="$returnValue" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$input" disable-output-escaping="yes" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Bemærk at jeg har lavet dit link om (<a href=...>), da din ændring gjorde syntaksen invalid igen (eller rettere ikke funktionel). Prøv det lige og se om det skulle være bedre nu...