Matze: Rekursiv aufrufen, dabei Werte addieren

Hallo!

Ich habe ein großes Problem!
Ich habe in einer XML Kunden und alte Stellen. Die Kunden haben dabei Gehalt bekommen für jede einzelne der alten Stellen!
Das Gehalt muss ich berechnen: Stundensatz*Stundenanzahl.
Diesen Wert lasse ich mir dann ausgeben!
Jetzt soll ich all das Gehalt addieren, was 1 Kunde insgesamt verdient hat.
Ich habe mittlerweile schon herausbekommen, dass das irgendwie mit xsl:call-template gehen muss, da ich ja keine flexiblen variablen habe. Aber wie mache ich das mit den Parametern / Variablen? Ich weiß nicht wo ich diese definiere, wie ich die wieder aufrufe, und zu guter letzt nicht, wie und wo ich diesen künstlichen rekursiven Ausdruck unterbringen soll?

Ich habe auf dieser Seite schon das dazugehörige Beispiel mit den Bildern gesehen, bin aber nicht weiter gekommen!

Danke
Matze

  1. hi,

    hab keine Ahnung von XML, aber ein rekursiever Aufruf einer Funktion ist relativ einfach umgesetzt:

    z.B.

      
    function AddZahl(i)  
    {  
       if (i==0)  
          return Array(i);  
       else  
          Ergebnis = Ergebnis + AddZahl(i-1);  
    }  
    
    

    vielleicht kannst du was in der Art benutzen um dein XML abzuarbeiten...

    Gruss
    Seppel

    1. Hm danke,
      so kenne ich die rekursiven aufrufe von JAVA etc. Aber bei XML geht damit leider nichts!!

      Danke
      Matze

  2. Tach Matze,

    Ich habe mittlerweile schon herausbekommen, dass das irgendwie mit xsl:call-template gehen muss, da ich ja keine flexiblen variablen habe.

    Vermutlich ist keine Rekursion erforderlich. Mit sum(Stundensatz * Stundenanzahl) über die entsprechende Knotenmenge sollte das auch machbar sein.

    Poste mal etwas relevanten XML-Code.

    Man liest sich,
    svg4you

    1. <kunde>
      <kundename>er</kundename>
      ...
       <historie>
        <stelle stellennr = '1'>
         <arbeitszeit>24</arbeitszeit>
         <stundensatz>19</stundensatz>
        </stelle>
        <stelle stellennr = '3'>
         <arbeitszeit>42</arbeitszeit>
         <stundensatz>34</stundensatz>
        </stelle>
        <stelle stellennr = '6'>
         <arbeitszeit>12</arbeitszeit>
         <stundensatz>19</stundensatz>
        </stelle>
       </historie>
      </kunde>

      <kunde>
      <kundename>sie</kundename>
      ...
       <historie>
        <stelle stellennr = '2'>
         <arbeitszeit>12</arbeitszeit>
         <stundensatz>21</stundensatz>
        </stelle>
        <stelle stellennr = '13'>
         <arbeitszeit>14</arbeitszeit>
         <stundensatz>20</stundensatz>
        </stelle>
        <stelle stellennr = '16'>
         <arbeitszeit>23</arbeitszeit>
         <stundensatz>43</stundensatz>
        </stelle>
       </historie>
      </kunde>
      und mehr kunden

      Und wie soll ich jetzt sagen: So lange du bei dem Kunden bist, suche alle alte Stellen der Historie heraus, ....
      V.a. kann ich das mit den variablen auch nicht, Da bringt er mir immer die komischten Werte

      Aber danke, wenn wir das hin bekommen flipp ich vor freude aus!!!!!!!!
      Matze

      1. Tach Matze,

        Und wie soll ich jetzt sagen: So lange du bei dem Kunden bist, suche alle alte Stellen der Historie heraus, ....

        Der naive Ansatz:

          
        <xsl:for-each select="kunde">  
          <tr>  
            <td><xsl:value-of select="kundename"/></td>  
            <td><xsl:value-of select="sum(historie/stelle/arbeitszeit * historie/stelle/stundensatz)"/></td>  
          </tr>  
        </xsl:for-each>
        

        funktioniert so nicht, weil sum() nur auf eine Knotenmenge und nicht auf den Audruck angewendet werden kann.

        Mit einem Wurzelelement kunden wäre das eine Möglichkeit mit rekursiver Summation:

          
        <?xml version="1.0" encoding="ISO-8859-1"?>  
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
          
          <xsl:template match="kunden">  
            <html>  
              <head>  
                <title>Test</title>  
              </head>  
              <body>  
                <table border="1">  
                  <tr>  
                    <th>Kunde</th>  
                    <th>Summe</th>  
                  </tr>  
                  <xsl:for-each select="kunde/historie">  
                    <tr>  
                      <td><xsl:value-of select="../kundename"/></td>  
                      <td>  
                        <xsl:call-template name="bilde_summe">  
                          <xsl:with-param name="stelle" select="stelle"/>  
                        </xsl:call-template>  
                      </td>  
                    </tr>  
                  </xsl:for-each>  
                </table>  
              </body>  
            </html>  
          </xsl:template>  
          
          <xsl:template name="bilde_summe">  
            <xsl:param name="stelle"/>  
            <xsl:choose>  
              <xsl:when test="$stelle">  
                <xsl:variable name="summe">  
                  <xsl:call-template name="bilde_summe">  
                    <xsl:with-param name="stelle" select="$stelle[position() > 1]"/>  
                  </xsl:call-template>  
                </xsl:variable>  
                <xsl:value-of select="$summe + $stelle/arbeitszeit * $stelle/stundensatz"/>  
              </xsl:when>  
              <xsl:otherwise>0</xsl:otherwise>  
            </xsl:choose>  
          </xsl:template>  
          
        </xsl:stylesheet>
        

        Ergebnis:

        Kunde Summe
        -----------
        er    2112
        sie   1521

        Man liest sich,
        svg4you