«Переменные» в XSL на самом деле являются константами - вы не можете изменить их значение.Это:
<xsl:value-of select="$counter + 1"/>
просто выведет значение $counter+1
Для создания циклов вы должны использовать рекурсию - например:
<xsl:stylesheet
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="loop">
<xsl:param name="i"/>
<xsl:param name="limit"/>
<xsl:if test="$i <= $limit">
<div>
<xsl:value-of select="$i"/>
</div>
<xsl:call-template name="loop">
<xsl:with-param name="i" select="$i+1"/>
<xsl:with-param name="limit" select="$limit"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:call-template name="loop">
<xsl:with-param name="i" select="0"/>
<xsl:with-param name="limit" select="10"/>
</xsl:call-template>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
хотя это лучшестараться избегать циклов - в большинстве случаев XSL может быть написан, чтобы избежать этого, но я недостаточно понимаю, чего вы пытаетесь достичь, чтобы дать вам полное решение.