Announcement

Collapse
No announcement yet.

Knotenübergreifende Gruppierung sortiert

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

  • Knotenübergreifende Gruppierung sortiert

    <root>
    <filiale id="1">
    &#0160;&#0160;<kunde id="4711">
    &#0160;&#0160;&#0160;&#0160;<umsatz stueck="5">2500</umsatz>
    &#0160;&#0160;</kunde
    &#0160;&#0160;<kunde id="4712">
    &#0160;&#0160;&#0160;&#0160;<umsatz stueck="4">1600</umsatz>
    &#0160;&#0160;</kunde>
    </filiale>
    <filiale id="2">
    &#0160;&#0160;<kunde id="4711">
    &#0160;&#0160;&#0160;&#0160;<umsatz stueck="2">1500</umsatz>
    &#0160;&#0160;</kunde
    &#0160;&#0160;<kunde id="4713">
    &#0160;&#0160;&#0160;&#0160;<umsatz stueck="7">3250</umsatz>
    &#0160;&#0160;</kunde>
    </filiale>
    </root>

    Ich möchte nun ein Ranking der Kunden Filialübergreifend absteigend nach Stück bzw. alternativ nach Summe:

    Versucht habe ich es mit:

    <xsl:apply-templates select="filiale/kunde">
    &#0160;&#0160;<xsl:sort select="sum(./filiale/kunde/umsatz/@stueck)" order="descending" data-type="number" />
    </xsl:apply-templates>
    bzw.
    <xsl:apply-templates select="filiale/kunde">
    &#0160;&#0160;<xsl:sort select="sum(./filiale/kunde/umsatz)" order="descending" data-type="number" />
    </xsl:apply-templates>

    Nur werden dabei in mehreren Filialen enthaltende Kunden doppelt aufgelistet und nicht gruppiert und summiert.

  • #2
    Fehler beseitig zum Testen


    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <filiale id="1">
        <kunde id="4711">
          <umsatz stueck="2">4000</umsatz>
        </kunde>
        <kunde id="4712">
          <umsatz stueck="4">1600</umsatz>
        </kunde>
      </filiale>
      <filiale id="2">
        <kunde id="4711">
          <umsatz stueck="2">1500</umsatz>
        </kunde>
        <kunde id="4713">
          <umsatz stueck="7">3250</umsatz>
        </kunde>
      </filiale>
    </root>
    mit param von aussen steuerbar mit String

    id nach kunden Nummer
    sum nach der Summe Einkauf Kunden
    st nach Stückzahl Kunden

    zum Testen kann aber auch mit param gesetzt werden noch ein todo
    order="descending"

    gesetzt wahl param auf sum

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:param name="wahl">sum</xsl:param>
    	<xsl:key match="//kunde" name="only" use="@id"/>
    	<xsl:output indent="yes" method="html"/>
    	<xsl:template match="/">
    		<html>
    			<xsl:apply-templates select="root"/>
    		</html>
    	</xsl:template>
    	<xsl:template match="root">
    		<table border="solid 2 px" bgcolor="ffaa00">
    			<tr>
    				<th>Filiale</th>
    				<th>Stueck</th>
    				<th>Betrag</th>
    			</tr>
    			<xsl:choose>
    				<xsl:when test="$wahl='id'">
    					<!--nach der id -->
    					<xsl:for-each select="//kunde[generate-id() = generate-id(key('only', @id)[1])]">
    						<xsl:sort data-type="number" order="descending" select="@id"/>
    						<xsl:call-template name="tab">
    							<xsl:with-param name="knnr" select="@id"/>
    						</xsl:call-template>
    					</xsl:for-each>
    				</xsl:when>
    				<xsl:when test="$wahl='st'">
    					<!--nach der stückzahl einer Bestellung -->
    					<xsl:for-each select="//kunde[generate-id() = generate-id(key('only', @id)[1])]">
    						<xsl:sort data-type="number" order="descending" select="sum(key('only',@id)/umsatz/@stueck)"/>
    						<xsl:call-template name="tab">
    							<xsl:with-param name="knnr" select="@id"/>
    						</xsl:call-template>
    					</xsl:for-each>
    				</xsl:when>
    				<xsl:when test="$wahl='sum'">
    					<!--nach der summe -->
    					<xsl:for-each select="//kunde[generate-id() = generate-id(key('only', @id)[1])]">
    						<xsl:sort data-type="number" order="descending" select="sum(key('only',@id))"></xsl:sort>
    						<xsl:call-template name="tab">
    							<xsl:with-param name="knnr" select="@id"/>
    						</xsl:call-template>
    					</xsl:for-each>
    				</xsl:when>
    			</xsl:choose>
    		</table>
    	</xsl:template>
    	<xsl:template name="ausgabe">
    		<xsl:for-each select="//filiale">
    			<xsl:param name="knnr"/>
    			<xsl:if test="./kunde[@id=$knnr]/umsatz/@stueck">
    				<tr>
    					<td>
    						<xsl:value-of select="@id"/>
    					</td>
    					<td>
    						<xsl:value-of select="./kunde[@id=$knnr]/umsatz/@stueck"/>
    					</td>
    					<td>
    						<xsl:value-of select="./kunde[@id=$knnr]"/>
    					</td>
    				</tr>
    			</xsl:if>
    		</xsl:for-each>
    	</xsl:template>
    	<xsl:template name="tab">
    		<xsl:param name="knnr" select="@id"/>
    		<tr>
    			<td>Kundenummer</td>
    			<td>
    				<xsl:value-of select="@id"/>
    			</td>
    		</tr>
    		<xsl:call-template name="ausgabe">
    			<xsl:with-param name="knnr" select="$knnr"/>
    		</xsl:call-template>
    		<tr>
    			<td>
    				<xsl:value-of select="concat(sum(key('only',$knnr)/umsatz/@stueck),' Stuecke ')"/>
    			</td>
    			<td>summe</td>
    			<td>
    				<xsl:value-of select="sum(key('only',$knnr))"/>
    			</td>
    		</tr>
    	</xsl:template>
    </xsl:stylesheet>

    ergebnis

    Code:
    <html>
      <table border="solid 2 px" bgcolor="ffaa00">
        <tr>
          <th>Filiale</th>
          <th>Stueck</th>
          <th>Betrag</th>
        </tr>
        <tr>
          <td>Kundenummer</td>
          <td>4711</td>
        </tr>
        <tr>
          <td>1</td>
          <td>2</td>
          <td>
          4000
        
          </td>
        </tr>
        <tr>
          <td>2</td>
          <td>2</td>
          <td>
          1500
        
          </td>
        </tr>
        <tr>
          <td>4 Stuecke </td>
          <td>summe</td>
          <td>5500</td>
        </tr>
        <tr>
          <td>Kundenummer</td>
          <td>4713</td>
        </tr>
        <tr>
          <td>2</td>
          <td>7</td>
          <td>
          3250
        
          </td>
        </tr>
        <tr>
          <td>7 Stuecke </td>
          <td>summe</td>
          <td>3250</td>
        </tr>
        <tr>
          <td>Kundenummer</td>
          <td>4712</td>
        </tr>
        <tr>
          <td>1</td>
          <td>4</td>
          <td>
          1600
        
          </td>
        </tr>
        <tr>
          <td>4 Stuecke </td>
          <td>summe</td>
          <td>1600</td>
        </tr>
      </table>
    </html>
    Helmut Hagemann

    Comment


    • #3
      Danke

      Vielen Dank für die ausführliche Beschreibung!!!

      Comment

      Working...
      X