svg4you: Produktbildung aus Sequenz mit Einzelwerten

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

  1. Tach Forum,

    Dass es alternative Möglichkeiten über Summenformeln unter Verwendung von Potenzfunktionen und Fakultät gibt, ist mir bekannt.

    Mittlerweile habe ich Sinus und Cosinus für XSLT/XPath 2.0-Anwendungen unter Verwendung der Taylorreihe/Mc Laurinschen Reihe umgesetzt. Dabei benötigt die aufgerufene Potenzfunktion x^n noch die rekursive Produktbildung über xsl:call-template.

    Man liest sich,
    svg4you

    1. Tach Forum,

      Dabei benötigt die aufgerufene Potenzfunktion x^n noch die rekursive Produktbildung über xsl:call-template.

      Auch dieser Job kann natürlich in eine eigenständige Funktion ausgelagert werden, siehe erweiterte Fassung.

      Mit dieser wiederverwendbaren Funktion habe ich für das beschriebene Problem auch eine brauchbare Lösung gefunden.

      Man liest sich,
      svg4you

      1. Hallo,

        siehe erweiterte Fassung.

        Mit dieser wiederverwendbaren Funktion habe ich für das beschriebene Problem auch eine brauchbare Lösung gefunden.

        Danke für deine Lösungspostings!
        (Auf der anderen Seite ... es hat mir das Nachdenken "abgenommen".) :-)

        Grüße
        Thomas