Darkgame: Feler hochzählen - recursive lösung?

Hallo zusammen,

ich versuche derzeit aus einem xml dokument verschiedene feldlängen auf zu addieren.

mein input hat folgende struktur:

<file name=input">
<gruppe name="gruppe1">
<feld name="feld1xx" laenge="3"/>
<feld name="feld2xs" laenge="18"/>
<feld name="feld3xd" laenge="5"/>

<gruppe name="gruppe2">
<feld name="feld1xx" laenge="3"/>
<feld name="feld2xy" laenge="3"/>
<feld name="feld3xg" laenge="17"/>
</gruppe>

</gruppe>
<gruppe name="gruppe3">
<feld name="feld1" laenge="3"/>
<feld name="feld2" laenge="18"/>
<feld name="feld3" laenge="5"/>
</gruppe>
</file>

herauskommen sollte eine aufstellung wie:

<file name=input">
<gruppe name="gruppe1" gesamtlaenge="26"/>
<gruppe name="gruppe2" gesamtlaenge="23"/>
<gruppe name="gruppe3" gesamtlaenge="26"/>
</file>

mein lösungsansatz war eine variable zum zählen zu verwenden - jedoch musste ich lernen das dies in XSL nciht möglich ist. also bleibt nur ein recursiver aufruf der elemente.
oder: ich könnte vielleicht über den count der felder gehen.

<xsl:template match="/">
<MyXML>
<xsl:for-each select="*/Group">

<xsl:call-template name="addieren">
<xsl:with-param name="a" select="0" />
<xsl:with-param name="c" select="0" />
</xsl:call-template>

</MyXML>
</xsl:template>

<xsl:template name="addieren">
 <xsl:param name="a" />
 <xsl:param name="c" />
<xsl:variable name="b" select="$a + number(Feld[$c]@length)" />
<xsl:variable name="i" select="$c + 1" />
<xsl:if test="$i < count(Feld)">
<xsl:call-template name="addieren">
<xsl:with-param name="a" select="$b" />
<xsl:with-param name="c" select="$i" />
</xsl:call-template>
</xsl:if>
</xsl:template>

Die lösung ist mir bisher auf papier eingefallen. Jedoch würde sie immer noch das problem aufwerfen wo ich den neuen Gruppentag erstellen kann.

Kann mir bitte jemand eine richtung weisen in die ich forschen könnte, oder hat jeamnd diese art problemstellung schonmal gelöst?
bzw. gibt es einen viel einfacheren lösungsweg den ich übersehen habe?
ich bin ein neuling in XSL und demenstsprechend stoße ich hier leider an meine grenzen.

vielen dank sollte sich jemand meiner problematik annehmen.

  1. Hallo Darkgame,

    </gruppe>

    </gruppe>

    Hier ist wohl ein schließendes Tag verrutscht.

    herauskommen sollte eine aufstellung wie:

    <file name=input">
    <gruppe name="gruppe1" gesamtlaenge="26"/>
    <gruppe name="gruppe2" gesamtlaenge="23"/>
    <gruppe name="gruppe3" gesamtlaenge="26"/>
    </file>

    Dazu reicht:

    <xsl:template match="file">  
      <file name="input">  
        <xsl:for-each select="gruppe">  
          <gruppe name="{@name}" gesamtlaenge="{sum(feld/@laenge)}"/>  
        </xsl:for-each>  
      </file>  
    </xsl:template>
    

    Grüße,
    Thomas

    1. DANKE!

      oje, aber da sieht man was rauskommt wenn man sich allein im kämmerchen den kopf zerbricht. und dann erst nach hilfe fragt.
      Bin froh das du eine lösung kanntest und geantwortet hast.
      dank dir

      Dazu reicht:

      <xsl:template match="file">

      <file name="input">
          <xsl:for-each select="gruppe">
            <gruppe name="{@name}" gesamtlaenge="{sum(feld/@laenge)}"/>
          </xsl:for-each>
        </file>
      </xsl:template>

      
      >   
      > Grüße,  
      > Thomas