svg4you: Produktbildung aus Sequenz mit Einzelwerten

Beitrag lesen

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