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

Beitrag lesen

Hallo,

so langsam weiß ich echt nicht mehr weiter. Ich möchte die Spaltenbreite einer Tabelle aus dem XML auslesen, und es mit XSL darstellen. Das Problem hierbei ist, dass die Spaltenbreiten von dem Programm, mit dem die XML erstellt werden, prozentual im Vergleich zu vorher gespeichert werden. WEnn man also eine Tabelle mit 3 Spalten hat, bekommt jede den gleichen Platz, verkleinere ich die Spalte wird zB 0.8* draus oder beim Vergrößern zB 1.3*.

Hier ein Ausschnitt der Tabelle aus dem XML:

<table><title>materials</title>  
<tgroup cols="3"><colspec colwidth="1.36*"/>  
<colspec colwidth="1.16*"/><colspec colwidth="0.50*"/>  
<thead>  
<row>  
<entry>D</entry>  
<entry>P</entry>  
<entry>M</entry>  
</row>  
</thead>  
<tbody>  
<row>  
<entry>A</entry>  
<entry>5</entry>  
<entry>1</entry>  
</row></tbody></table>

Ich dachte, dass ich die Spaltenbreite bekomme, wenn ich alle colwidth aufsummiere, anschließend 100 durch den Wert teile und diesen anschließend mit den einzelnen Werten von colwidth multipliziere um den Spaltenbreitenwert in % angeben zu können.

Ich habe gelesen dass man Variablen nicht nach der Initialisierung in XSL verändern kann. Anfangs dachte ich wenn ich eine globale Variable nehme, vielleicht kann ich sie dann selbst verändern. Denn ich wollte eine Variable anlegen, dann die for-each-schleife in der ich bei allen colwidth das * abschneide und dann addiere. Allerdings ist das Problem dass ich dann die einzelnen WErte in einer Variablen stehe habe und sum möchte ja Knoten haben. Knoten kann ich aber nicht nehmen, da das * beim Summieren stört. Dann dachte ich wenn ich die einzelnen Werte in eine Variable mit Semikolon abgetrennt schreiben lasse und diese an javascript übergebe und dort summiere, das müsste gehen. Aber dann hab ich das Problem wie kann ich mit dem Ergebnis in XSL weitermachen.

Mein Versuch bisher:
<xsl:template match="tgroup">
  <xsl:apply-templates select="*"/>
</xsl:template>

<xsl:template match="colspec">
  <col>
    <xsl:if test="@colwidth and substring(@colwidth, string-length(@colwidth), 1)='*'">
      <xsl:variable name="test">
<xsl:for-each select="..//@colwidth">
  <xsl:variable name="width"><xsl:value-of select="number(substring(..//@colwidth, 0, string-length(..//@colwidth)))"/></xsl:variable>
          <xsl:value-of select="$width"/>;
        </xsl:for-each>
      </xsl:variable>
<!--<script type="text/javascript">Javascript:var summe = parent.frames[1].addieren('<xsl:value-of select="$test"/>');</script>-->
<!--<xsl:variable name="widthALL"><xsl:value-of select="javascript:parent.frames[1].addieren('$test');"/>);</xsl:variable>-->
      <xsl:attribute name="width"><xsl:value-of select="round($test)"/></xsl:attribute>
    </xsl:if>
  </col>
</xsl:template>

Jetz werden natürlich nur die Werte hinteinander mit einem Semikolon getrennt in width hineingeschrieben, an der Stelle wo <xsl:value-of select="$width"/>; steht hatte ich mal <xsl:value-of select="sum($width)"/> stehen, aber das geht nicht, weil er Knoten erwartet.

Vielen Dank im Voraus
Viele Grüße
Kai