Прежде всего, контекстный узел не изменяется при вызове шаблона, вам не нужно передавать параметр в вашей ситуации.
<xsl:template match="Foo">
<xsl:variable name="varName">
<xsl:call-template name="getVarName" />
</xsl:variable>
<xsl:value-of select="$varName"/> = <xsl:value-of select="@value"/>
</xsl:template>
<xsl:template name="getVarName">
<xsl:choose>
<xsl:when test="@name != ''">
<xsl:value-of select="@name"/>
</xsl:when>
<xsl:otherwise>
<!-- position() is sequential and unique to the batch -->
<xsl:value-of select="concat('unnamed', position())" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Может быть, это все, что тебе сейчас нужно. Выходные данные для неназванных узлов не будут строго пронумерованы последовательно (без имени1, без имени2 и т. Д.). Вы получите это:
item1 = 100
item2 = 200
unnamed3 = 300