Selektion verschiedener Felder in einem XML Script
Daniel_83
- xsl
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
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 1Mein 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
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>
*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