Проблема в коде, который вы нам не показали.Это правильный способ создания цепочек / конвейеров, хотя я бы не рекомендовал (см. В конце этого ответа),
Это преобразование:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:call-template name="loop">
<xsl:with-param name="times" select="3"/>
<xsl:with-param name="output">
<xsl:call-template name="foo">
<xsl:with-param name="pN" select="5"/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="loop">
<xsl:param name="times" select="1"/>
<xsl:param name="output" select="2"/>
<xsl:choose>
<xsl:when test="not($times > 0)">
<xsl:value-of select="$output"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="loop">
<xsl:with-param name="times" select="$times -1"/>
<xsl:with-param name="output" select="2*$output"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="foo">
<xsl:param name="pN" select="1"/>
<xsl:value-of select="2*$pN"/>
</xsl:template>
</xsl:stylesheet>
при применении к любому XML (не используется), дает требуемый, правильный результат :
80
Стилистическая рекомендация :
Старайтесь избегать цепочки шаблоновтаким образом, поскольку это приводит к нечитаемому и не поддерживаемому коду.
Намного лучше получить промежуточные результаты в (правильно названные) переменные .Таким образом, код не только более читабелен и удобен в обслуживании, но и любой промежуточный результат может многократно использоваться повторно без необходимости его повторной оценки.
Это то же преобразование, но с учетом фактора соответствиярекомендуемые стилистические требования :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:variable name="vTwice">
<xsl:call-template name="twice">
<xsl:with-param name="pN" select="5"/>
</xsl:call-template>
</xsl:variable>
<xsl:call-template name="loop">
<xsl:with-param name="pTtimes" select="3"/>
<xsl:with-param name="pN" select="$vTwice"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="loop">
<xsl:param name="pTtimes" select="1"/>
<xsl:param name="pN" select="2"/>
<xsl:choose>
<xsl:when test="not($pTtimes > 0)">
<xsl:value-of select="$pN"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="loop">
<xsl:with-param name="pTtimes" select="$pTtimes -1"/>
<xsl:with-param name="pN" select="2*$pN"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="twice">
<xsl:param name="pN" select="1"/>
<xsl:value-of select="2*$pN"/>
</xsl:template>
</xsl:stylesheet>