ThomasM: XSL-Transformation-Problem (XRTreeFrag cannot be cast to)

Beitrag lesen

Hallo Oli,

Normalerweise würde ich erwarten, dass das Ergebnis 260 ist, da er jede Zeile einzeln addiert und zum Schluss die Summe bildet.

Mit XSLT 2.0 wäre die Lösung ein Einzeiler:

<xsl:value-of select="sum(for $p in root/Ebene1/Ebene2/Position return $p/@netPrice * $p/@percent div 100)"/>  <!-- 260 -->

Für XSLT 1.0 kommt xsl:call-template ins Spiel:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="root/Ebene1/Ebene2">
    <xsl:call-template name="summe">
      <xsl:with-param name="p" select="Position"/>
      <xsl:with-param name="i" select="1"/>
      <xsl:with-param name="i_max" select="count(Position)"/>
      <xsl:with-param name="gesamt" select="0"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="summe">
    <xsl:param name="p"/>
    <xsl:param name="i"/>
    <xsl:param name="i_max"/>
    <xsl:param name="gesamt"/>

    <xsl:variable name="akt" select="$p[$i]/@netPrice * $p[$i]/@percent div 100"/>

    <xsl:choose>
      <xsl:when test="$i &lt; $i_max">
        <xsl:call-template name="summe">
          <xsl:with-param name="p" select="$p"/>
          <xsl:with-param name="i" select="$i + 1"/>
          <xsl:with-param name="i_max" select="$i_max"/>
          <xsl:with-param name="gesamt" select="$gesamt + $akt"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$gesamt + $akt"/> <!-- 260 -->
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

Grüße, Thomas