Tach Forum,
im folgenden Code geht es um die Arbeit mit Sequenzen unter XSLT bzw. XPath 2.0. Mittels "for $i in (1 to $arg) return number($i div 3)" wird eine Sequenz von Einzelwerten erzeugt, welche später fortlaufend multipliziert werden sollen. Dazu bemühe ich noch ein separates rekursives Template (seq_prod).
Hat jemand eine Anregung parat, wie sich das nur mittels einer xsl:function ohne xsl:call-template vereinfachen lässt?
<xsl:function name="my:test">
<xsl:param name="arg"/>
<xsl:variable name="num_seq" select="for $i in (1 to $arg) return number($i div 3)"/>
<xsl:call-template name="seq_prod">
<xsl:with-param name="seq" select="$num_seq"/>
<xsl:with-param name="p" select="1"/>
<xsl:with-param name="pmax" select="count($num_seq)"/>
</xsl:call-template>
</xsl:function>
<xsl:template name="seq_prod">
<xsl:param name="seq"/>
<xsl:param name="p"/>
<xsl:param name="pmax"/>
<xsl:choose>
<xsl:when test="$pmax > 0">
<xsl:variable name="p_i" select="$p * $seq[$pmax]"/>
<xsl:call-template name="seq_prod">
<xsl:with-param name="seq" select="$seq"/>
<xsl:with-param name="p" select="$p_i"/>
<xsl:with-param name="pmax" select="$pmax - 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$p"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Beispielaufruf (1/3 * 2/3 * ... * 9/3 * 10/3):
<xsl:value-of select="my:test(10)"/><!-- 61.4540466392318 -->
Zum Hintergrund: Die Produktbildung kommt im Rahmen einer Reihenentwicklung zur näherungsweisen Berechnung der Sinus- bzw. Cosinus-Funktionswerte zum Einsatz. Dass es alternative Möglichkeiten über Summenformeln unter Verwendung von Potenzfunktionen und Fakultät gibt, ist mir bekannt.
Man liest sich,
svg4you