Announcement

Collapse
No announcement yet.

Gruppierung und Addition

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Gruppierung und Addition

    Hallo,

    wer kann mir mal helfen, ich bekomme es nicht hin...

    Folgendes Problem:
    <Addon>
    <Addon code="01" name="Käse" amount="3,50" />
    <Addon code="01" name="Käse" amount="3,50" />
    <Addon code="02" name="Wurst" amount="3,50" />
    <Addon code="02" name="Wurst" amount="3,50" />
    <Addon code="02" name="Wurst" amount="3,50" />
    </Addon>

    und jetzt möchte ich folgendes herausbekommen...sprich eine gruppierung und addition ....

    <Addon>
    <Addon code="01" name="Käse" amount="7" />
    <Addon code="02" name="Wurst" amount="10,50" />
    </Addon>

    wie würde das xslt dazu aussehen können?

    Danke
    frolic123

  • #2
    HI,

    identifizierst du die Addon-Elemente über das Attribut code oder name?

    Guck mal im Forum die Addition, http://entwickler-forum.de/showthread.php?t=46480. Mußt du anpassen an deine Bedürfnisse!

    Für die Gruppierung würde ich for-each verwenden. Zum Bespiel:

    Code:
    <xsl:for-each select="//Addon[code='01']">
    <!--Hier die Addition-->
    </xsl:for-each>
    Das Beispiel ist statisch, mußt das dynamisch machen, dass du wirklich jeden Knoten addierst. Falls die Nummierung des Code-Attributes fortlaufen ist, kannst du bei 1 anfangen und dann hochzählen.

    Ich hoffe, dass hilft dir weiter.

    Gruß Jevo

    Comment


    • #3
      Hallo,

      ersteinmal vielen Dank...
      die identifikation soll über code passieren, leider ist es hier keine Aufzählung sondern eine beliebige Zeichenkette.
      Und wie würde dann die Addition genau aussehen. Hast du dafür vielleicht auch ein Beispiel.
      Danke
      frolic123
      Originally posted by Jevo View Post
      HI,

      identifizierst du die Addon-Elemente über das Attribut code oder name?

      Guck mal im Forum die Addition, http://entwickler-forum.de/showthread.php?t=46480. Mußt du anpassen an deine Bedürfnisse!

      Für die Gruppierung würde ich for-each verwenden. Zum Bespiel:

      Code:
      <xsl:for-each select="//Addon[code='01']">
      <!--Hier die Addition-->
      </xsl:for-each>
      Das Beispiel ist statisch, mußt das dynamisch machen, dass du wirklich jeden Knoten addierst. Falls die Nummierung des Code-Attributes fortlaufen ist, kannst du bei 1 anfangen und dann hochzählen.

      Ich hoffe, dass hilft dir weiter.

      Gruß Jevo

      Comment


      • #4
        Hast du in diesem Thread,http://entwickler-forum.de/showthread.php?t=46480, nicht bis unten gelesen?
        Dort seht im wesentlichen, was du brauchst!

        Code:
        <xsl:variable name="ergebnis" select="0" saxon:assignable="yes"/>
        <saxon:assign name="ergebnis" select="$Var1 + @amount"/>
        Gruß Jevo

        Comment


        • #5
          Hallo Jevo,

          hat funktioniert; nur jetzt gehen die Probleme weiter...
          vielleicht kannst du mir einen Tipp geben:

          das folgende XML Dokument habe ich
          Code:
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <?xml-stylesheet type="text/xsl" href="testgruppierung2.xsl"?>
          <journey>
          	<Market>
          		<SSRS>
          			<SSR 
          				code="ME01" 
          				name="Baguette Käse" 
          				amount="3,50">
          			</SSR>
          			<SSR 	
          				code="ME01" 
          				name="Baguette Käse" 
          				amount="3,50">
          			</SSR>
          			<SSR 
          				code="ME03" 
          				name="Baguette Snack XL Käse" 
          				amount="5,50">
          			</SSR>
          			<SSR 
          				code="ME03" 
          				name="Baguette Snack XL Käse" 
          				amount="5,50">
          			</SSR>
          			<SSR 
          				code="ME03" 
          				name="Baguette Snack XL Käse" 
          				amount="5,50">
          			</SSR>
          		</SSRS>
          	</Market>
          	<Market>
          		<SSRS>
          			<SSR 
          				code="ME01" 
          				name="Baguette Käse" 
          				amount="3,50">
          			</SSR>
          			<SSR 	
          				code="ME01" 
          				name="Baguette Käse" 
          				amount="3,50">
          			</SSR>
          			<SSR 
          				code="ME03" 
          				name="Baguette Snack XL Käse" 
          				amount="5,50">
          			</SSR>
          			<SSR 
          				code="ME03" 
          				name="Baguette Snack XL Käse" 
          				amount="5,50">
          			</SSR>
          			<SSR 
          				code="ME03" 
          				name="Baguette Snack XL Käse" 
          				amount="5,50">
          			</SSR>
          		</SSRS>
          	</Market>
          </journey>
          und so sieht momentan das XSLT Dokument aus...
          Code:
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <xsl:stylesheet version="1.0"
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          
          <xsl:key name="groupBy" match="Market/SSRS/SSR" use="@code" />
          
          <xsl:template match="journey">
            
          	<html>
          		<head>
          		<title>testgruppierung2.xsl</title>
          		</head>
          		<body>
          			
          		<!--	<xsl:for-each select="SSR[count(. | key('groupBy', code)[1]) = 1]">
          				 <xsl:sort select="code" />
          				 Extra:<xsl:value-of select="name" />
          				 Anzahl:<xsl:value-of select="count(key('groupBy', code))"/>
          				 Gesamt:<xsl:value-of select="count(key('groupBy', code))*translate(amount, ',', '.')"/>
          				 
          				 <br />
          				 <xsl:for-each select="key('groupBy', code)">
          				    <xsl:sort select="name" />
          				    <xsl:value-of select="name" /> 
          				    
          				    <xsl:value-of select="translate(amount, ',', '.')" /><br />
          				 </xsl:for-each>
          			      </xsl:for-each>
          			-->
          			
          		<xsl:for-each select="Market/SSRS/SSR[count(. | key('groupBy', @code)[1]) = 1]">
          				<!-- <xsl:sort select="code" />-->
          				 Position: <xsl:value-of select="position()"/><br/>
          				 Anzahl:<xsl:value-of select="count(key('groupBy', @code))"/>.
          				 Extra:<xsl:value-of select="@name" />
          				 Gesamt:<xsl:value-of select="count(key('groupBy', @code))*translate(@amount, ',', '.')"/>
          				 
          				 <br />
          				 <xsl:for-each select="key('groupBy', @code)">
          				    <xsl:sort select="@name" />
          				    <xsl:value-of select="@name" /> 
          				    
          				    <xsl:value-of select="translate(@amount, ',', '.')" /><br />
          				 </xsl:for-each>
          		
          		<br/>		
          		</xsl:for-each>
          		
          		</body>
          	</html>
          </xsl:template>
          </xsl:stylesheet>
          mein Problem ist das die Gruppierung nicht übergeordnet auf dem Attribut 'Market' läuft. Hat jemand ne Idee

          Comment


          • #6
            Der gepostete Code ergibt:

            Position: 1
            Anzahl:4. Extra:Baguette Käse Gesamt:14
            Baguette Käse3.50
            Baguette Käse3.50
            Baguette Käse3.50
            Baguette Käse3.50

            Position: 2
            Anzahl:6. Extra:Baguette Snack XL Käse Gesamt:33
            Baguette Snack XL Käse5.50
            Baguette Snack XL Käse5.50
            Baguette Snack XL Käse5.50
            Baguette Snack XL Käse5.50
            Baguette Snack XL Käse5.50
            Baguette Snack XL Käse5.50

            Welches Ergebnis ist denn gewünscht?

            Comment


            • #7
              Hallo Thomas,

              das Ergebnis sollte folgendermaßen aussehen:


              (Market) Position: 1
              Anzahl:2. Extra:Baguette Käse Gesamt:7
              Anzahl:3. Extra:Baguette Snack XL Käse Gesamt:16,50
              (Market) Position: 2

              Anzahl:3. Extra:Baguette Snack XL Käse Gesamt:16,50
              Anzahl:2. Extra:Baguette Käse Gesamt:7

              die Zwischenergebnisse sind nicht erforderlich.

              Vielen Dank
              Originally posted by Thomas Meinike View Post
              Der gepostete Code ergibt:

              Position: 1
              Anzahl:4. Extra:Baguette Käse Gesamt:14
              Baguette Käse3.50
              Baguette Käse3.50
              Baguette Käse3.50
              Baguette Käse3.50

              Position: 2
              Anzahl:6. Extra:Baguette Snack XL Käse Gesamt:33
              Baguette Snack XL Käse5.50
              Baguette Snack XL Käse5.50
              Baguette Snack XL Käse5.50
              Baguette Snack XL Käse5.50
              Baguette Snack XL Käse5.50
              Baguette Snack XL Käse5.50

              Welches Ergebnis ist denn gewünscht?

              Comment


              • #8
                Wie kommt "Gesamt:7" im letzten Beispiel zustande?

                Comment


                • #9
                  die 7 kommt durch den Addition der beiden Amount des zweiten Market Eintrags

                  code="ME01"
                  name="Baguette Käse"
                  amount="3,50">

                  Comment


                  • #10
                    Probiere es so:

                    Code:
                    <?xml version="1.0" encoding="ISO-8859-1"?>
                    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                    
                      <xsl:output method="html"/>
                      <xsl:key name="groupBy" match="SSR" use="@code"/>
                    
                      <xsl:template match="journey">
                        <html>
                          <head>
                            <title>Test</title>
                          </head>
                          <body>
                            <xsl:apply-templates select="Market"/>
                          </body>
                        </html>
                      </xsl:template>
                    
                      <xsl:template match="Market">
                        <p>(Market) Position: <xsl:value-of select="position()"/><br/>
                          <xsl:apply-templates select="SSRS"/>
                        </p>
                      </xsl:template>
                    
                      <xsl:template match="SSRS">
                        <xsl:for-each select="//SSR[generate-id() = generate-id(key('groupBy', @code)[1])]">
                          <xsl:variable name="code" select="@code"/>
                          <xsl:variable name="anzahl" select="count(../SSR[@code = $code])"/>
                          <xsl:text>Anzahl: </xsl:text><xsl:value-of select="$anzahl"/><xsl:text>. </xsl:text> 
                          <xsl:value-of select="../SSR[@code = $code]/@name"/>
                          <xsl:text> Gesamt: </xsl:text><xsl:value-of select="$anzahl * translate(../SSR[@code = $code]/@amount, ',', '.')"/>
                          <br/>
                        </xsl:for-each>
                      </xsl:template>
                      
                    </xsl:stylesheet>
                    Für "Gesamt" wäre sum(../SSR[@code = $code]/@amount) noch plausibler, aber dann müssten Dezimalpunkte bei den Preisen stehen [sum() kann nur Knotenmengen verarbeiten, infsofern kann man hier nicht translate() einbauen]. Ansonsten würden nur die ganzzahligen Anteile summiert.
                    Zuletzt editiert von Thomas Meinike; 12.03.2008, 15:45.

                    Comment

                    Working...
                    X