Kai: Summe von Werten, wo erst noch etwas abgeschnitten werden muss

Beitrag lesen

Hi Thomas,

vielen lieben Dank für deine Antwort. Habe sie leider durch den Feiertag erst heute gelesen.

Nein, (auch globale) Variablen lassen sich nach dem Festlegen nicht ändern, es sind quasi Konstanten. Man kann Variablen jedoch innerhalb von xsl:for-each, xsl:template usw. jeweils neu belegen.

Dass man globale Variablen nicht mehr ändern kann, ist natürlich schade

Dein eigentliches Summierungsproblem lässt sich mit XSLT 2.0 elegant lösen:

<xsl:template match="table">

<xsl:value-of select="fn:sum(for $cw in tgroup/colspec/@colwidth return fn:number(fn:substring-before($cw, '*')))"/>
</xsl:template>

Bisher verwende ich XSLT 1.0, ich denke wenn ich jetzt auf XSLT 2.0 umstelle, werde ich an vielen Stellen erstmal ein Problem bekommen oder? Habe nämlich an die 1000Zeilen in meiner XSLT-Datei, da wir verschiedene XML-Dateien (mit unterschiedener STruktur )haben. Oder unterstützt XSLT 2.0 alles von XSLT 1.0?  
  

>   
> Ergebnis: 3.02  
>   
> Mit den Mitteln von XSLT 1.0 kann das mit einem benannten Template und xsl:call-template sowie xsl:with-param und xsl:param etwas aufwändiger erreicht werden.  
  
Das habe ich auch schon probiert, aber bin leider zu keinem lauffähigen XSL gekommen :( vielleicht könntest du mir einen Tipp geben was ich falsch mache:  
<col>  
  <xsl:if test="@colwidth and substring(@colwidth, string-length(@colwidth), 1)='\*'">  
    <xsl:for-each select="..//@colwidth">  
      <xsl:variable name="width"><xsl:value-of select="number(substring(..//@colwidth, 0, string-length(..//@colwidth)))"/></xsl:variable>  
      <xsl:call-template name="bilde\_summe">  
        <xsl:with-param name="colwidth" select="$width"/>  
      </xsl:call-template>  
    </xsl:for-each>  
    <xsl:attribute name="width"><xsl:value-of select="$colwidth"/></xsl:attribute>  
  </xsl:if>	  
</col>  
  
  <xsl:template name="bilde\_summe">  
    <xsl:param name="colwidth"/>  
	<xsl:choose>  
      <xsl:when test="$colwidth">  
        <xsl:variable name="summe">  
          <xsl:call-template name="bilde\_summe">  
            <xsl:with-param name="colwidth" select="$colwidth"/>  
          </xsl:call-template>  
        </xsl:variable>  
        <xsl:value-of select="$summe + $colwidth"/>  
      </xsl:when>  
      <xsl:otherwise>0</xsl:otherwise>  
    </xsl:choose>  
  </xsl:template>  
  
Ich muss aber ehrlichgesagt sagen dass ich noch nie ein template geschrieben habe, das über with-param aufgerufen wird. Irgendwie müsste ich ja von for-each den aktuellen Wert $width übergeben und in bilde\_summe übergeben und addieren, aber das Problem ist, dass ich die Variable, in der die Summe gespeichert ist, ja nicht in sich selber aufrufen kann.  
  
Viele Grüße  
Kai