ben: Zusammenfassung bei gleicher Bedingung in einer Zeile

Hallo,

der Thementitel ist irgendwie unglücklich, mir fällt aber auch nix anderes ein.

ich habe folgendes Problem:

meine xml Datei sieht vereinfacht in etwa so aus:

  
<tables>  
  <table>  
   <name>Klaus</name>  
   <datum>01.03.2009</datum>  
  </table>  
  <table>  
   <name>Klaus</name>  
   <datum>03.03.2009</datum>  
  </table>  
  <table>  
   <name>Klaus</name>  
   <datum>03.03.2009</datum>  
  </table>  
  <table>  
   <name>Erwin</name>  
   <datum>01.03.2009</datum>  
   <senden>J</senden>  
  </table>  
  <table>  
   <name>Erwin</name>  
   <datum>01.03.2009</datum>  
   <senden>J</senden>  
  </table>  
  <table>  
   <name>Erwin</name>  
   <datum>02.03.2009</datum>  
   <senden>J</senden>  
  </table>  
...  
</tables>  

Ich möchte nun eine Tabelle erstellen, mit einer Zeile für Klaus und einer für Erwin usw. In der Tabelle soll mir angezeigt werden, wie oft Erwin und Klaus an einem Tag etwas gesendet haben:

Nutzer   1.3.  2.3.  3.3
Klaus     1     -     2
Erwin     2     1     -

Ich bin am verzweifeln. Ich bekomme die Tabelle leider nur so hin:
Nutzer   1.3   2.3   3.3
Klaus     1
Klaus                 1
Klaus                 1
Erwin     1
usw.

wie schaffe ich es diese Werte in eine Zeile zusammenzufügen?

Danke schonmal im Voraus!

  1. Hallo,

    der Thementitel ist irgendwie unglücklich, mir fällt aber auch nix anderes ein.

    ich habe folgendes Problem:

    Ich möchte nun eine Tabelle erstellen, mit einer Zeile für Klaus und einer für Erwin usw. In der Tabelle soll mir angezeigt werden, wie oft Erwin und Klaus an einem Tag etwas gesendet haben:

      
    <?xml version="1.0" encoding="UTF-8"?>  
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
    	<xsl:key name="datum" match="tables/table" use="datum"/>  
    	<xsl:key name="name" match="tables/table" use="name"/>  
    	<xsl:key name="dn" match="tables/table" use="concat(name,datum)"/>  
    	<xsl:template match="/">  
    		<html>  
    			<head>  
    				<title>Gruppierung</title>  
    			</head>  
    			<body>  
    				<table>  
    					<tr>  
    						<td>Nutzer</td>  
    						<xsl:for-each select="tables/table[generate-id() = generate-id(key('datum', datum)[1])]">  
    							<td>  
    								<xsl:value-of select="datum"/>  
    							</td>  
    						</xsl:for-each>  
    					</tr>  
    					<xsl:for-each select="tables/table[generate-id() = generate-id(key('name', name)[1])]">  
    						<tr>  
    							<td>  
    								<xsl:value-of select="name"/>  
    							</td>  
    							<xsl:for-each select="key('name', name)">  
    								<xsl:variable name="n" select="name"/>  
    								<td>  
    									<xsl:choose>  
    										<xsl:when test="current()[generate-id() = generate-id(key('dn', concat(name,datum)))]">  
    											<xsl:value-of select="count(key('datum', datum)[name = $n])"/>  
    										</xsl:when>  
    										<xsl:otherwise>-</xsl:otherwise>  
    									</xsl:choose>  
    								</td>  
    							</xsl:for-each>  
    						</tr>  
    					</xsl:for-each>  
    				</table>  
    			</body>  
    		</html>  
    	</xsl:template>  
    </xsl:stylesheet>  
      
    
    

    ausgabe ist:
    Nutzer  01.03.2009   03.03.2009   02.03.2009
    Klaus 1 2 -
    Erwin 2 - 1

    Was du damit nicht machen kannst, ist eine Sortierung nach Datum und/oder Name

    Grüße
    Thomas

    1. Hallo,

      ausgabe ist:
      Nutzer  01.03.2009   03.03.2009   02.03.2009
      Klaus 1 2 -
      Erwin 2 - 1

      Was du damit nicht machen kannst, ist eine Sortierung nach Datum und/oder Name

      Grüße
      Thomas

      Hallo Thomas,

      danke für den Code, leider funktioniert er nur für das angezeigte Beispiel. Sobald ich mehr Daten in meiner XML Datei habe stimmt die Anzahl nicht mit den Tagen überein und er schreibt die Daten z.T. einfach hinter die Tabelle..

      Ich kann meine XML Datei bei der Ausgabe nach dem Datum sortieren, das wäre nicht das Problem. Es ist außerdem nachezu sicher, dass jeden Tag etwas gesendet wird (über 60 Nutzer von denen mindestens 10 täglich etwas senden). Es würde mir reichen (falls das einfacher ist), dass an den Tagen, an denen etwas gesendet wurde, nur ein X eingetragen wird. Die Anzahl ist nicht zwingend erforderlich.

      Leider bin ich mit der generate-id und key Funktion nicht vertraut.. Ich weiß also nicht, wie ich da selber ansetzen kann :(

      Danke schonmal für deine Hilfe!
      Ben

      1. Hallo,

        danke für den Code, leider funktioniert er nur für das angezeigte Beispiel. Sobald ich mehr Daten in meiner XML Datei habe stimmt die Anzahl nicht mit den Tagen überein und er schreibt die Daten z.T. einfach hinter die Tabelle..

        ehmm ... ja, das habe ich übersehen.

        hier der coee dann mal nach Datum/Namen sortiert, mit Zählung von User/Tag usw.

          
        <?xml version="1.0" encoding="UTF-8"?>  
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
        	<xsl:key name="datum" match="tables/table" use="datum"/>  
        	<xsl:key name="name" match="tables/table" use="name"/>  
        	<xsl:template match="/">  
        		<html>  
        			<head>  
        				<title>Gruppierung</title>  
        			</head>  
        			<body>  
        				<table border="1">  
        					<tr>  
        						<td>Nutzer</td>  
        						<xsl:for-each select="tables/table[generate-id() = generate-id(key('datum', datum)[1])]">  
        							<xsl:sort select="datum" />  
        							<td>  
        								<xsl:value-of select="datum"/>  
        							</td>  
        						</xsl:for-each>  
        					</tr>  
        					<xsl:for-each select="tables/table[generate-id() = generate-id(key('name', name)[1])]">  
        						<xsl:sort select="name"/>  
        						<xsl:variable name="n" select="name"/>  
        						<tr>  
        							<td>  
        								<xsl:value-of select="name"/>  
        							</td>  
        							<xsl:for-each select="/tables/table[generate-id() = generate-id(key('datum', datum)[1])]">  
        								<xsl:sort select="datum" />  
        								<xsl:choose>  
        									<xsl:when test="key('datum', datum)[name = $n]">  
        										<td>  
        											<xsl:value-of select="count(key('datum', datum)[name = $n])"/>  
        										</td>  
        									</xsl:when>  
        									<xsl:otherwise>  
        										<td>-</td>  
        									</xsl:otherwise>  
        								</xsl:choose>  
        							</xsl:for-each>  
        						</tr>  
        					</xsl:for-each>  
        				</table>  
        			</body>  
        		</html>  
        	</xsl:template>  
        </xsl:stylesheet>  
        
        

        Grüße
        Thomas

        1. ehmm ... ja, das habe ich übersehen.

          hier der coee dann mal nach Datum/Namen sortiert, mit Zählung von User/Tag usw.

          Grüße
          Thomas

          Astrein! Allerbesten Dank!! Funktioniert prima