Daniel_83: Selektion verschiedener Felder in einem XML Script

Hi, ich habe ein Problem und hoffe, das Ihr mir helfen könnt.
Kurz die Eckdaten für das Verständnis:
Ich lese aus einer Tabelle (MSSQL) Fahrzeugdaten heraus.

Die Tablle liefert mir folgende Felder: CountID, Year, Month, Name, ClickType, Clicks, ObjectID, DealerID

Es ist so ne Art Clickcounter, der für ein bestimmtes Fahrzeug eines Händlers die Clicks zählt und zwar: View, Print, TellAFriend und Request..

Diese Felder lasse ich durch ein Script in XML formatieren:

<stats>
  <statsitem>
    <CountID>1</CountID>
    <Year>2005</Year>
    <Month>1</Month>
    <Name>Fiat UNO</Name>
    <ClickType>View</ClickType>
    <Clicks>1</Clicks>
    <ObjectID>1234567</ObjectID>
    <DealerID>12345</DealerID>
  </statsitem>
  <statsitem>
    <CountID>1</CountID>
    <Year>2005</Year>
    <Month>1</Month>
    <Name>Fiat UNO</Name>
    <ClickType>Print</ClickType>
    <Clicks>15</Clicks>
    <ObjectID>1234567</ObjectID>
    <DealerID>12345</DealerID>
  </statsitem>
</stats>
.
.
.
Wenn ich das nun durch ein XSL Stylesheet jage, bekomme ich eine HTML Tabelle, die mir die autos mit den Clicktypes und so untereinander ausgibt. Ich möchte aber eine Tabelle die mir eine Zeile Pro vorhandenem Fahrzeug generiert, also quasi so:

Name        Year        Month        Print        View ...
----------------------------------------------------------
Fiat Uno    2005        1            15           1

und nicht

Name        Year        Month        ClickType        Clicks ...
----------------------------------------------------------------
Fiat Uno    2005        1            Print            15
Fiat Uno    2005        1            View             1

Mein Problem ist die Selection der einzelnen ClickTypes für die Fahrzeuge, referenziert über die ObjectID und den Monat.

Ich dachte an ein XSL, welches mir folgenden XML Code erzeugt.
<stats>
<statsitem>
    <CountID>1</CountID>
    <Year>2005</Year>
    <Month>1</Month>
    <Name>Fiat UNO</Name>
    <View>1</View>
    <Print>15</Print>
    <TellAFriend>0</TellAFriend>
    <Request>0</Request>
    <ObjectID>1234567</ObjectID>
    <DealerID>12345</DealerID>
</statsitem>
</stats>
Habe aber keine genaue Vorstellung ,wie man das realisieren kann.

Ich hoffe ich konnte mein Problem verdeutlichen

Schon mal vielen Dank im Voraus !!

Daniel

  1. Hallo,

    Hi, ich habe ein Problem und hoffe, das Ihr mir helfen könnt.
    Wenn ich das nun durch ein XSL Stylesheet jage, bekomme ich eine HTML Tabelle, die mir die autos mit den Clicktypes und so untereinander ausgibt. Ich möchte aber eine Tabelle die mir eine Zeile Pro vorhandenem Fahrzeug generiert, also quasi so:

    Name        Year        Month        Print        View ...

    Fiat Uno    2005        1            15           1

    und nicht

    Name        Year        Month        ClickType        Clicks ...

    Fiat Uno    2005        1            Print            15
    Fiat Uno    2005        1            View             1

    Mein Problem ist die Selection der einzelnen ClickTypes für die Fahrzeuge, referenziert über die ObjectID und den Monat.

    Ich dachte an ein XSL, welches mir folgenden XML Code erzeugt.
    <stats>
    <statsitem>
        <CountID>1</CountID>
        <Year>2005</Year>
        <Month>1</Month>
        <Name>Fiat UNO</Name>
        <View>1</View>
        <Print>15</Print>
        <TellAFriend>0</TellAFriend>
        <Request>0</Request>
        <ObjectID>1234567</ObjectID>
        <DealerID>12345</DealerID>
    </statsitem>
    </stats>
    Habe aber keine genaue Vorstellung ,wie man das realisieren kann.

    Ich hoffe ich konnte mein Problem verdeutlichen

    Willst du jetzt XML erzeugen oder HTML??

    Beispiel mit folgendem Dummy XML:
    ----------------------------------
    <?xml version="1.0" encoding="iso-8859-1"?>
    <stats>
      <statsitem>
        <CountID>1</CountID>
        <Year>2005</Year>
        <Month>1</Month>
        <Name>Fiat UNO</Name>
        <ClickType>View</ClickType>
        <Clicks>1</Clicks>
        <ObjectID>1234567</ObjectID>
        <DealerID>12345</DealerID>
      </statsitem>
      <statsitem>
        <CountID>1</CountID>
        <Year>2005</Year>
        <Month>1</Month>
        <Name>Fiat UNO</Name>
        <ClickType>Print</ClickType>
        <Clicks>15</Clicks>
        <ObjectID>1234567</ObjectID>
        <DealerID>12345</DealerID>
      </statsitem>
      <statsitem>
        <CountID>2</CountID>
        <Year>2005</Year>
        <Month>12</Month>
        <Name>Trabi</Name>
        <ClickType>View</ClickType>
        <Clicks>12</Clicks>
        <ObjectID>12345678</ObjectID>
        <DealerID>12345</DealerID>
      </statsitem>
      <statsitem>
        <CountID>2</CountID>
        <Year>2005</Year>
        <Month>12</Month>
        <Name>Trabi</Name>
        <ClickType>Print</ClickType>
        <Clicks>150</Clicks>
        <ObjectID>12345678</ObjectID>
        <DealerID>12345</DealerID>
      </statsitem>
      <statsitem>
        <CountID>1</CountID>
        <Year>2005</Year>
        <Month>3</Month>
        <Name>Fiat UNO</Name>
        <ClickType>View</ClickType>
        <Clicks>13</Clicks>
        <ObjectID>1234567</ObjectID>
        <DealerID>12345</DealerID>
      </statsitem>
      <statsitem>
        <CountID>1</CountID>
        <Year>2005</Year>
        <Month>3</Month>
        <Name>Fiat UNO</Name>
        <ClickType>Print</ClickType>
        <Clicks>10</Clicks>
        <ObjectID>1234567</ObjectID>
        <DealerID>12345</DealerID>
      </statsitem>
    </stats>
    -------------------------------

    XSL so wie du deine Tabelle beschrieben hast:
    (wobei hier nur der Monat das ausschlaggebende Kriterium ist.)
    --------------------------------
    <?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="fahrzeugtypMonat" match="statsitem" use="Month" />

    <xsl:template match="/">
    <html>
    <head>
     <title>Click und View</title>
    </head>
    <body>
     <xsl:apply-templates />
    </body>
    </html>
    </xsl:template>

    <xsl:template match="stats">
     <table width="600" border="1">
      <tr>
       <td>Name</td>
       <td>Year</td>
       <td>Month</td>
       <td>Print</td>
       <td>View</td>
      </tr>
      <xsl:for-each select="statsitem[generate-id() = generate-id(key('fahrzeugtypMonat', Month)[1])]">
       <xsl:sort select="Name" />
        <tr>
         <td><xsl:value-of select="Name" /></td>
         <td><xsl:value-of select="Year" /></td>
         <td><xsl:value-of select="Month" /></td>
         <xsl:for-each select="key('fahrzeugtypMonat', Month)">
          <td><xsl:value-of select="Clicks" /></td>
         </xsl:for-each>
        </tr>
      </xsl:for-each>
     </table>
    </xsl:template>

    </xsl:stylesheet>
    -------------------------------

    Ausgabe in HTML:

    -------------------------------
    <html>
    <head>
    <META http-equiv="Content-Type" content="text/html; charset=UTF-16">
    <title>Click und View</title>
    </head>
    <body>
    <table width="600" border="1">
    <tr>
    <td>Name</td>
    <td>Year</td>
    <td>Month</td>
    <td>Print</td>
    <td>View</td>
    </tr>
    <tr>
    <td>Fiat UNO</td>
    <td>2005</td>
    <td>1</td>
    <td>1</td>
    <td>15</td>
    </tr>
    <tr>
    <td>Fiat UNO</td>
    <td>2005</td>
    <td>3</td>
    <td>13</td>
    <td>10</td>
    </tr>
    <tr>
    <td>Trabi</td>
    <td>2005</td>
    <td>12</td>
    <td>12</td>
    <td>150</td>
    </tr>
    </table>
    </body>
    </html>
    --------------------------------------

    Für die Erklärung vom key und key() knsultiere bitte den Thread http://forum.de.selfhtml.org/archiv/2004/3/t74824/ im Archiv.

    Rückfragen dann gerne hier.

    Grüße
    Thomas

    1. Hallo,

      Im XSL habe ich etwas nicht berücksichtigt.
      Untenstehend eine korrigierte Version.

      Grüße
      Thomas

      <?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="fahrzeugtypMonat" match="statsitem" use="concat(Month, '+', ObjectID)" />
      <xsl:key name="fahrzeugtyp" match="statsitem" use="ObjectID" />

      <xsl:template match="/">
      <html>
      <head>
       <title>Click und View</title>
      </head>
      <body>
       <xsl:apply-templates />
      </body>
      </html>
      </xsl:template>

      <xsl:template match="stats">
       <table width="600" border="1">
        <tr>
         <td>Name</td>
         <td>Year</td>
         <td>Month</td>
         <td>Print</td>
         <td>View</td>
        </tr>
        <xsl:for-each select="statsitem[generate-id() = generate-id(key('fahrzeugtyp', ObjectID)[1])]">
         <xsl:sort select="Name" />
         <xsl:variable name="current" select="." />
          <xsl:for-each select="key('fahrzeugtyp', ObjectID)[generate-id(.) = generate-id(key('fahrzeugtypMonat', concat(Month, '+', ObjectID))[1])]">
           <xsl:sort select="Month" data-type="number" />
             <tr>
              <td><xsl:value-of select="Name" /></td>
              <td><xsl:value-of select="Year" /></td>
              <td><xsl:value-of select="Month" /></td>
              <xsl:for-each select="key('fahrzeugtypMonat', concat(Month, '+', ObjectID))">
               <td><xsl:value-of select="Clicks" /></td>
              </xsl:for-each>
             </tr>
          </xsl:for-each>
        </xsl:for-each>
       </table>
      </xsl:template>

      </xsl:stylesheet>

      -----------------------

      Ausgabe z.B.:
      -----------------------
      <html>
      <head>
      <META http-equiv="Content-Type" content="text/html; charset=UTF-16">
      <title>Click und View</title>
      </head>
      <body>
      <table width="600" border="1">
      <tr>
      <td>Name</td>
      <td>Year</td>
      <td>Month</td>
      <td>Print</td>
      <td>View</td>
      </tr>
      <tr>
      <td>Fiat UNO</td>
      <td>2005</td>
      <td>1</td>
      <td>1</td>
      <td>15</td>
      </tr>
      <tr>
      <td>Fiat UNO</td>
      <td>2005</td>
      <td>3</td>
      <td>13</td>
      <td>10</td>
      </tr>
      <tr>
      <td>Trabi</td>
      <td>2005</td>
      <td>1</td>
      <td>11</td>
      <td>33</td>
      </tr>
      <tr>
      <td>Trabi</td>
      <td>2005</td>
      <td>11</td>
      <td>19</td>
      <td>20</td>
      </tr>
      <tr>
      <td>Trabi</td>
      <td>2005</td>
      <td>12</td>
      <td>12</td>
      <td>150</td>
      </tr>
      </table>
      </body>
      </html>

      1. *argh*

        Im XSL habe ich etwas nicht berücksichtigt.

        Und ein Copy & Past Fehler:
        Die Zeile  <xsl:variable name="current" select="." /> kann aus der XSL gelöscht werden.

        Thomas