Tabelle mit verschiedenen Ansichten
Christoph K
- xsl
0 Gunnar Bittersmann
0 hh0 Thomas J.S.0 Christoph K
Hallo,
ich habe folgendes Problem: Ich habe eine XML-Datei mit mehreren CDs. Gespeichert sind Daten wie Name, Interpret, Erscheinungsjahr, Kategorie, Preis, etc.
Jetzt möchte ich diese Daten folgendermaßen ausgeben:
prinzipiell ist das ja alles überhaupt kein Problem, aber alles kombiniert bekomm ich einfach nicht hin. wobei im moment eigentlich mein einziges Problem der Wechsel zwischen den aktuellen und allen CDs ist, die Detailseiten, deren Aufruf und so geht alles.
ich habe mir hier im forum u.a. diese sehr hilfreichen beiträge angesehen: http://forum.de.selfhtml.org/archiv/2005/1/t97848/#m597247 http://forum.de.selfhtml.org/archiv/2006/1/t121401/#m780373
vielleicht ist das ja irgendwie mit einer deser beiden grundlagen realisierbar?
vielen dank schonmal fürs lesen,
Christoph
mein Code bisher: cds.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml-stylesheet href="cds.xsl" type="text/xsl" ?> <cdliste> <cd> <name>Bravo Hits 1000</name> <art>Sampler</art> <kategorie>POP</kategorie> <jahr>2005</jahr> <preis>50€</preis> <label>soundso</label> <beschreibung>Ein ganz tolles Teil mit vielen tollen Liedern...</beschreibung> <detail id="1"> <detailname>Motiv:</detailname> <detailwert>bla</detailwert> </detail> <detail id="2"> <detailname>Anzahl der CDs:</detailname> <detailwert>5</detailwert> </detail> <detail id="3"> <detailname>Anz Lieder:</detailname> <detailwert>100</detailwert> </detail> <thumb>../images/bravo_hits_1000_t.jpg</thumb> <bild id="1">../images/bravo_hits_1000_1.jpg</bild> <bild id="2">../images/bravo_hits_1000_2.jpg</bild> </cd>
<cd> <name>Viva Best Of 2010</name> <art>Sampler</art> <kategorie>POP</kategorie> <jahr>2010</jahr> <preis>17,0 Mio. EUR</preis> <label>noch ein tolles Label</label> <beschreibung>die besten hits des Jahres auf nur 4 CDs.</beschreibung> <thumb>../images/viva_best_of_2010_t.jpg</thumb> <bild id="1">../images/viva_best_of_2010_1.jpg</bild> </cd> </cdliste>
cds.xsl:
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>cdliste</title> <style type="text/css"> .einzeln { display:none; } h1,h2,p { font-family:Arial,Tahoma,Wide Latin; } h1 { font-size:24px; color:blue; letter-spacing:5px; } h2 { font-size:15px; letter-spacing:3px; line-height:140%; display:inline; padding-left:5px; } p { font-size:11px; letter-spacing:1px; line-height:160%; display:inline; padding-left:8px; text-align:justify; } </style> <script type="text/javascript"> var arrCDs = new Array(<xsl:apply-templates select="cdliste" mode="jsarray" />); var alleCDs = "<xsl:value-of select="generate-id(cdliste)" />"; <![CDATA[ function displayLayer(strID) { document.getElementById(strID).style.display = "block"; }
function hideLayer(strID) { document.getElementById(strID).style.display = "none"; }
function showCD(strID) { for(i=0; i<=arrCDs.length-1; i++) { if(arrCDs[i] != strID) { hideLayer(arrCDs[i]); } else displayLayer(strID); } } ]]> </script> </head> <body> <xsl:apply-templates select="cdliste" mode="alle" /> <xsl:apply-templates select="cdliste" mode="einzeln" /> </body> </html> </xsl:template>
<xsl:template match="cdliste" mode="alle"> <div id="{generate-id(.)}"> <h1>Alle CDs</h1> <table width="600" border="0" cellpadding="0" cellspacing="0"> <colgroup> <col width="25%" /> <col width="25%" /> <col width="25%" /> <col width="25%" /> </colgroup> <xsl:for-each select="cd"> <xsl:sort select="jahr" order="descending" /> <xsl:apply-templates select="." mode="alle"/> </xsl:for-each> </table> </div> </xsl:template>
<xsl:template match="cdliste" mode="aktuelle"> <div id="{generate-id(.)}"> <h1>Aktuelle CDs</h1> <table width="600" border="0" cellpadding="0" cellspacing="0"> <colgroup> <col width="25%" /> <col width="25%" /> <col width="25%" /> <col width="25%" /> </colgroup> <xsl:for-each select="cd"> <xsl:sort select="jahr" order="descending" /> <xsl:apply-templates select=".[jahr='2006']" mode="alle"/> </xsl:for-each> </table> </div> </xsl:template>
<xsl:template match="cd" mode="alle"> <xsl:variable name="ID" select="generate-id(.)" /> <tr> <td colspan="4"><h2><a href="#" onclick="hideLayer(alleCDs);showCD('{$ID}');"><xsl:value-of select="name"/></a></h2></td> </tr> <tr> <td> <xsl:apply-templates select="thumb"/> </td> <td> <p><b>JAHR:</b></p><br/><p><xsl:value-of select="jahr" /></p> </td> <td> <p><b>PREIS:</b></p><br/><p><xsl:value-of select="preis" /></p> </td> <td> <p><b>LABEL:</b></p><br/><p><xsl:value-of select="label" /></p> </td> </tr> <tr> <td colspan="4" height="20"></td> </tr> </xsl:template>
<xsl:template match="thumb"> <img align="left"> <xsl:attribute name="src"><xsl:value-of select="."/></xsl:attribute> </img> </xsl:template>
<xsl:template match="cdliste" mode="einzeln"> <xsl:apply-templates select="cd" mode="einzeln" /> </xsl:template>
<xsl:template match="cd" mode="einzeln"> <div id="{generate-id(.)}" class="einzeln"> <h1><xsl:value-of select="name"/></h1> <table width="600" border="0" cellpadding="0" cellspacing="0"> <colgroup> <col width="200" /> <col width="200" /> <col width="200" /> </colgroup> <tr> <td colspan="2" align="left"><img><xsl:attribute name="src"><xsl:value-of select="bild[@id='1']"/></xsl:attribute></img></td> <td valign="middle"> <h2>Art:</h2><br/> <p><xsl:value-of select="art"/></p><br/> <h2>Jahr:</h2><br/> <p><xsl:value-of select="jahr"/></p><br/> <h2>Preis:</h2><br/> <p><xsl:value-of select="preis"/></p><br/> <h2>Label:</h2><br/> <p><xsl:value-of select="label"/></p><br/> </td> </tr> <tr> <td colspan="3" height="20"></td> </tr> <tr> <td valign="middle"> <h2>Beschreibung:</h2><br/> <p><xsl:value-of select="beschreibung"/></p> </td> <td colspan="2" align="right"><img><xsl:attribute name="src"><xsl:value-of select="bild[@id='2']"/></xsl:attribute></img></td> </tr> <tr> <td colspan="3" height="20"></td> </tr> <tr> <td colspan="2" align="left"><img><xsl:attribute name="src"><xsl:value-of select="bild[@id='3']"/></xsl:attribute></img></td> <td valign="middle"> <xsl:for-each select="detail"> <h2><xsl:value-of select="detailname"/></h2><br/> <p><xsl:value-of select="detailwert"/></p><br/> </xsl:for-each> </td> </tr> <tr> <td></td> <td colspan="2" align="right"><img><xsl:attribute name="src"><xsl:value-of select="bild[@id='4']"/></xsl:attribute></img></td> </tr> </table> <p> <a href="#" onclick="hideLayer('{generate-id(.)}');displayLayer(alleCDs);">Tabelle Anzeigen</a> </p> </div> </xsl:template>
<xsl:template match="cdliste" mode="jsarray"> <xsl:for-each select="cd"> xsl:text"</xsl:text><xsl:value-of select="generate-id(.)" />xsl:text"</xsl:text><xsl:if test="position() != last()">xsl:text, </xsl:text></xsl:if> </xsl:for-each> </xsl:template>
</xsl:stylesheet>
Hello out there!
Soll die Transformation clientseitig laufen?
Serverseitig wäre dein Vorhaben kein Problem: Entweder du erstellst für jede Ansicht ein eigenes Stylesheet und startest die Transformation über verschiedene PHP-Scripte:
http://example.net/cd/new.php
http://example.net/cd/all.php
http://example.net/cd/SpringsteenBruce-BornToRun.php
oder dasselbe PHP-Script, dem du per Query Parameter übergibst:
http://example.net/cd.php?view=new
http://example.net/cd.php?view=all
http://example.net/cd.php?view=SpringsteenBruce-BornToRun
oder du übergibst den Parameter an ein Stylesheet, das dann verschiedenes tut. (Wobei man die URIs per mod_rewrite auch nutzerfreundlicher machen kann).
See ya up the road,
Gunnar
Eine andere Möglichkeit wäre mit xslt 2.0 zu realisieren. XSLT 2.0 unterstützt die Möglichkeit, mehrere Ausgaben zu produzieren. Das ist zwar dann nicht ganz so fein, wie eine dynamische Lösung, aber nicht jeder mag php bzw. asp usw. einsetzen. Du koenntest also eine auswertung fahren, die dann schon alle (x)html seiten erstellt. Ansonsten kommt du m.E. nicht über eine serverseitige Lösung hinaus, bzw. macht diese am meisten Sinn.
Hallo,
ich habe folgendes Problem:
Ich habe eine XML-Datei mit mehreren CDs. Gespeichert sind Daten wie Name, Interpret, Erscheinungsjahr, Kategorie, Preis, etc.Jetzt möchte ich diese Daten folgendermaßen ausgeben:
- es soll eine Übersicht der aktuellsten CDs geben (also z.B. eine Tabelle mit den CDs die dieses Jahr erschienen sind),
Dazu brauchst du nur die Ausgabe nach Jahren zu sortieren, was du ja auch gemacht hast.
- hier soll es einen link geben über den dann alle CDs angezeigt werden
Verstehe ich nicht ganz. Wie alle CDs? Alle mit allen Details?
Ich dachte du hast deine Übersichtsseite bereits.
- es soll eine Detailseite für jede CD geben, die über einen Link aus der Übersicht aufgerufen wird
Das hast du ja auch erreicht.
- soll man bei der Übersicht mit allen CDs auch nur die CDs einer Kategorie anzeigen lassen können
Das verstehe ich auch nicht ganz, weil ich nicht genau weisst was du mit "allen CDs meinst - siehe oben.
Wenn das mal geklärt ist, kann man sich die Frage geanuer anschauen, jedoch denke ich, dass wenn du eine Sortierung nach Kategorien wünschst, der Weg den du jetzt gewählt hast (auf einmal alles Tranformieren und die divs nur ausblenden) nicht wirklich effizient ist, vor allem dann nicht, wenn dein XML viele Einträge hat. Also wirst du wohl (oder übel) die Transformation per JavaScript vornehmemen und dann ebenfalls mit JavaScript Parameters an das XSLT übergeben müssen. Dabei muss du nicht alles neue schreiben, sondern nur dein XSLT entsprechend ergänzen.
Aber vielleicht erklärst du nocheinmal - für dummies - was du genau erreichen möchtest.
Grüße
Thomas
Hallo,
also ich habe mir das folgendermaßen gedacht:
Am Anfang kommt man auf eine Seite mit der "aktuelle CDs"-Tabelle (also hier werden nur die CDs angezeigt, die in diesem Jahr erschienen sind). (erledigt) Unter dieser "aktuelle CDs"-Tabelle ist ein Link, durch den statt der "aktuelle CDs"- eine "alle CDs"-Tabelle angezeigt wird. (also es werden alle CDs aus der cds.xml angezeigt) (mein aktuelles Problem) In beiden Tabellen soll es für jede CD einen Link zu einer Detailseite geben. (erledigt)
Wenn man die "alle CDs"-Tabelle sieht, soll man außerdem sich nur CDs bestimmter Kategorien anzeigen lassen können (also zB soll man die gewünschte Kategorie per DropDown-Feld wählen können. (zweitrangiges Problem)
Tut mir leid, dass ich mich so unklar ausgedrückt habe, hoffe es ist jetzt klarer.
Wenn möglich würde ich die clientseitige Transformation vorziehen, da mein Webspace leider kein php unterstützt (und ich kein php kann).
Wie gesagt habe ich auch schon einmal versucht das Problem mit dieser Grundlage zu lösen: http://forum.de.selfhtml.org/archiv/2005/1/t97848/#m597247
also hier der Quelltext davon, vielleicht hilfts ja:
cds2.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="cds2.xsl" type="text/xsl" ?>
<cdliste>
<cd>
<cd_id>01</cd_id>
<name>Bravo Hits 1000</name>
<art>Sampler</art>
<kategorie>POP</kategorie>
<jahr>2005</jahr>
<preis>50 EUR</preis>
<label>soundso</label>
<beschreibung>Ein ganz tolles Teil mit vielen tollen Liedern...</beschreibung>
<detail id="1">
<detailname>Motiv:</detailname>
<detailwert>bla</detailwert>
</detail>
<detail id="2">
<detailname>Anzahl der CDs:</detailname>
<detailwert>5</detailwert>
</detail>
<detail id="3">
<detailname>Anz Lieder:</detailname>
<detailwert>100</detailwert>
</detail>
<thumb>../images/bravo_hits_1000_t.jpg</thumb>
<bild id="1">../images/bravo_hits_1000_1.jpg</bild>
<bild id="2">../images/bravo_hits_1000_2.jpg</bild>
</cd>
<cd>
<cd_id>02</cd_id>
<name>Viva Best Of 2010</name>
<art>Sampler</art>
<kategorie>POP</kategorie>
<jahr>2010</jahr>
<preis>170 EUR</preis>
<label>noch ein tolles Label</label>
<beschreibung>die besten hits des Jahres auf nur 4 CDs.</beschreibung>
<detail id="1">
<detailname>Anzahl der CDs:</detailname>
<detailwert>4</detailwert>
</detail>
<thumb>../images/viva_best_of_2010_t.jpg</thumb>
<bild id="1">../images/viva_best_of_2010_1.jpg</bild>
</cd>
</cdliste>
cds2.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:param name="cdid" />
<xsl:template match="/">
<html>
<head>
<script language="JavaScript" type="text/javascript">
/* Fے DEN IE */
var objSrcTree, ObjXSLT, objCache;
/* Fے MOZILLA */
var xslStylesheet;
var xsltProcessor = (window.ChromeWindow) ? new XSLTProcessor() : "";
var myDOM;
var xmlDoc;
function init()
{
if (window.ActiveXObject)
{
objSrcTree = new ActiveXObject('MSXML2.DOMDocument.4.0');
objSrcTree.async = false;
objSrcTree.load('cds2.xml');
objXSLT=new ActiveXObject('MSXML2.FreeThreadedDOMDocument.4.0');
objXSLT.async = false;
objXSLT.load('cds2.xsl');
objCache = new ActiveXObject("Msxml2.XSLTemplate.4.0");
objCache.stylesheet = objXSLT;
//output.innerHTML = "";
}
else if (window.ChromeWindow)
{
// load the xslt file
var myXMLHTTPRequest = new XMLHttpRequest();
myXMLHTTPRequest.open("GET", "cds2.xsl", false);
myXMLHTTPRequest.send(null);
xslStylesheet = myXMLHTTPRequest.responseXML;
xsltProcessor.importStylesheet(xslStylesheet);
// load the xml file
myXMLHTTPRequest = new XMLHttpRequest();
myXMLHTTPRequest.open("GET", "cds2.xml", false);
myXMLHTTPRequest.send(null);
xmlDoc = myXMLHTTPRequest.responseXML;
//document.getElementById("output").innerHTML = "";
}
else
alert("Ihr Browser unterst�eine XML-XSL-Transformation");
}
function show(nAbstrakt)
{
if (window.ActiveXObject)
{
var objXSLTProc = objCache.createProcessor();
objXSLTProc.input = objSrcTree;
objXSLTProc.addParameter("cdid", nAbstrakt, "");
objXSLTProc.transform();
output.innerHTML = objXSLTProc.output;
}
else if (window.ChromeWindow)
{
var myParam = xsltProcessor.getParameter(null, "cdid");
xsltProcessor.setParameter(null, "cdid", nAbstrakt);
var fragment = xsltProcessor.transformToFragment(xmlDoc, document);
myDOM = fragment;
document.getElementById("output").innerHTML = "";
document.getElementById("output").appendChild(fragment);
}
}
</script>
<title>CD Uebersicht</title>
<style type="text/css">
h1,h2,p { font-family:Arial,Tahoma,Wide Latin; }
h1 { font-size:24px; color:blue; letter-spacing:5px; }
h2 { font-size:15px; letter-spacing:3px; line-height:140%; display:inline; padding-left:5px; }
p { font-size:11px; letter-spacing:1px; line-height:160%; display:inline; padding-left:8px; text-align:justify; }
</style>
</head>
<body onload="init();" bgcolor="#FFFFFF">
<xsl:choose>
<xsl:when test="$cdid != ''">
<xsl:apply-templates select="cdliste/cd[cd_id = $cdid]" />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="cdliste" mode="alle" />
</xsl:otherwise>
</xsl:choose>
</body>
</html>
</xsl:template>
<xsl:template match="cdliste" mode="aktuelle">
<div id="output">
<center>
<h1>A k t u e l l e - C D s</h1>
<table width="600" border="0" cellpadding="0" cellspacing="0">
<colgroup>
<col width="25%" />
<col width="25%" />
<col width="25%" />
<col width="25%" />
</colgroup>
<xsl:for-each select="cd[jahr='2006']">
<xsl:sort select="jahr" order="descending" />
<tr>
<td colspan="4"><h2><a href="javascript:show('{cd_id}')"><xsl:value-of select="name"/></a></h2></td>
</tr>
<tr>
<td rowspan="2"><a href="javascript:show('{cd_id}')"><img border="0"><xsl:attribute name="src"><xsl:value-of select="thumb"/></xsl:attribute></img></a></td>
<td><p><b>JAHR</b></p></td>
<td><p><b>PREIS</b></p></td>
<td><p><b>LABEL</b></p></td>
</tr>
<tr>
<td><p><xsl:value-of select="jahr"/></p></td>
<td><p><xsl:value-of select="preis"/></p></td>
<td><p><xsl:value-of select="label"/></p></td>
</tr>
<tr>
<td colspan="4" height="20"></td>
</tr>
</xsl:for-each>
</table>
<h2><a href="javascript:show(' ??? ')">Alle CDs anzeigen</a></h2>
</center>
</div>
</xsl:template>
<xsl:template match="cdliste" mode="alle">
<div id="output">
<center>
<h1>A l l e - C D s</h1>
<table width="600" border="0" cellpadding="0" cellspacing="0">
<colgroup>
<col width="25%" />
<col width="25%" />
<col width="25%" />
<col width="25%" />
</colgroup>
<xsl:for-each select="cd">
<xsl:sort select="jahr" order="descending" />
<tr>
<td colspan="5"><h2><a href="javascript:show('{cd_id}')"><xsl:value-of select="name"/></a></h2></td>
</tr>
<tr>
<td rowspan="2"><a href="javascript:show('{cd_id}')"><img border="0"><xsl:attribute name="src"><xsl:value-of select="thumb"/></xsl:attribute></img></a></td>
<td><p><b>JAHR</b></p></td>
<td><p><b>PREIS</b></p></td>
<td><p><b>LABEL</b></p></td>
</tr>
<tr>
<td><p><xsl:value-of select="jahr"/></p></td>
<td><p><xsl:value-of select="preis"/></p></td>
<td><p><xsl:value-of select="label"/></p></td>
</tr>
<tr>
<td colspan="4" height="20"></td>
</tr>
</xsl:for-each>
</table>
</center>
</div>
</xsl:template>
<xsl:template match="cd">
<div id="output">
<center>
<h1><xsl:value-of select="name"/></h1>
<table width="600" border="0" cellpadding="0" cellspacing="0">
<colgroup>
<col width="200" />
<col width="200" />
<col width="200" />
</colgroup>
<tr>
<td colspan="2" align="left"><img><xsl:attribute name="src"><xsl:value-of select="bild[@id='1']"/></xsl:attribute></img></td>
<td valign="middle">
<h2>Art:</h2><br/>
<p><xsl:value-of select="art"/></p><br/>
<h2>Baujahr:</h2><br/>
<p><xsl:value-of select="jahr"/></p><br/>
<h2>Preis:</h2><br/>
<p><xsl:value-of select="preis"/></p><br/>
<h2>Label:</h2><br/>
<p><xsl:value-of select="label"/></p><br/>
</td>
</tr>
<tr>
<td colspan="3" height="20"></td>
</tr>
<tr>
<td valign="middle">
<h2>Beschreibung:</h2><br/>
<p><xsl:value-of select="beschreibung"/></p>
</td>
<td colspan="2" align="right"><img><xsl:attribute name="src"><xsl:value-of select="bild[@id='2']"/></xsl:attribute></img></td>
</tr>
<tr>
<td colspan="3" height="20"></td>
</tr>
<tr>
<td colspan="2" align="left"><img><xsl:attribute name="src"><xsl:value-of select="bild[@id='3']"/></xsl:attribute></img></td>
<td valign="middle">
<xsl:for-each select="detail">
<h2><xsl:value-of select="detailname"/></h2><br/>
<p><xsl:value-of select="detailwert"/></p><br/>
</xsl:for-each>
</td>
</tr>
<tr>
<td></td>
<td colspan="2" align="right"><img><xsl:attribute name="src"><xsl:value-of select="bild[@id='4']"/></xsl:attribute></img></td>
</tr>
</table>
<a href="javascript:location.reload()"><h2><u>ZURÜCK</u></h2></a>
</center>
</div>
</xsl:template>
</xsl:stylesheet>
danke für eure Antworten und Mühen,
Christoph
Hallo,
also ich habe mir das folgendermaßen gedacht:
Am Anfang kommt man auf eine Seite mit der "aktuelle CDs"-Tabelle (also hier werden nur die CDs angezeigt, die in diesem Jahr erschienen sind). (erledigt) Unter dieser "aktuelle CDs"-Tabelle ist ein Link, durch den statt der "aktuelle CDs"- eine "alle CDs"-Tabelle angezeigt wird. (also es werden alle CDs aus der cds.xml angezeigt) (mein aktuelles Problem) In beiden Tabellen soll es für jede CD einen Link zu einer Detailseite geben. (erledigt)
Wie ich sagte, muss du etwas anderes vorgehen, die Transformation mittels JavaScript auslösen und die Parameters auch damit übergeben. Unten ist eine HTML-Datei und das geänderte XSL (wobei ich mich nicht um deinen HTML-Code an sich kümmerte (also center und Co. gehören irgendwie weg und statt den vielen <p>s einfach CSS-Klasse(n) für die <td>s verwenden etc.))
Grüße Thomas
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> <title>CD-Sammmlung</title> <script language="JavaScript" type="text/javascript"> var currentDate = new Date(); var currentYear = currentDate.getFullYear(); var XMLDatei = "cdliste.xml"; // Pafad zur XML-Datei var XSLDatei = "cdliste.xsl"; // Pafad zur XSL-Datei var objectXML; var objectXSL; var objectXSLCache; var objectXSLTProcessor; var HTMLAusgabe; var jahr = ""; var cdid = ""; var cat = "";
function transformation() { // Abfrage für den Internet Explorer if (window.ActiveXObject) { // XML laden objectXML = new ActiveXObject("MSXML2.DOMDocument"); objectXML.async = false; objectXML.load(XMLDatei);
// XSL laden objectXSL = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.4.0"); objectXSL.async = false; objectXSL.load(XSLDatei); //cachen das XSLT für bessere performance objectXSLCache = new ActiveXObject("Msxml2.XSLTemplate.4.0"); objectXSLCache.stylesheet = objectXSL; }
// Abfrage für Mozilla / Netscape else if (window.ChromeWindow) { // Im Mozilla erst XSL laden objectXSLTProcessor = new XSLTProcessor(); objectXSL = new XMLHttpRequest(); objectXSL.open("GET", XSLDatei, false); objectXSL.send(null); objectXSL = objectXSL.responseXML; objectXSLTProcessor.importStylesheet(objectXSL);
// XML laden objectXML = new XMLHttpRequest(); objectXML.open("GET", XMLDatei, false); objectXML.send(null); objectXML = objectXML.responseXML; } else { alert("Ihr Browser unterstützt leider keine XML-XSL-Transformation mittels JavaScript"); } jahr = currentYear; showCD(jahr, cdid, cat); }
function showCD(jahr, cdid, cat) { if (window.ActiveXObject) { objectXSLTProcessor = objectXSLCache.createProcessor(); objectXSLTProcessor.input = objectXML; objectXSLTProcessor.addParameter("jahr", jahr, ""); objectXSLTProcessor.addParameter("cdid", cdid, ""); objectXSLTProcessor.addParameter("cat", cat, ""); objectXSLTProcessor.transform(); document.getElementById("output").innerHTML = objectXSLTProcessor.output; } else if (window.ChromeWindow) { objectXSLTProcessor.setParameter(null, "jahr", jahr); objectXSLTProcessor.setParameter(null, "cdid", cdid); objectXSLTProcessor.setParameter(null, "cat", cat); HTMLAusgabe = objectXSLTProcessor.transformToFragment(objectXML, document); document.getElementById("output").innerHTML = ""; document.getElementById("output").appendChild(HTMLAusgabe); } } </script> <style type="text/css"> h1,h2,p { font-family:Arial,Tahoma,'Wide Latin'; } h1 { font-size:24px; color:blue; letter-spacing:5px; } h2 { font-size:15px; letter-spacing:3px; line-height:140%; padding-left:5px; } p, th { font-size:11px; letter-spacing:1px; line-height:160%; display:inline; padding-left:8px; text-align:justify; } th { text-align:left; } </style> </head> <body onload="transformation();"> <body> <div id="output"> </div> </body> </html>
und hier das geänderte XSL dazu
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="jahr" /> <xsl:param name="cdid" /> <xsl:param name="cat" />
<xsl:key name="cat" match="kategorie" use="." />
<xsl:template match="/"> xsl:choose <xsl:when test="$cdid != ''"> <xsl:apply-templates select="cdliste/cd[cd_id = $cdid]" /> </xsl:when> <xsl:when test="($jahr != '')"> <xsl:apply-templates select="cdliste" mode="aktuelle" /> </xsl:when> <xsl:when test="($cat != '')"> <xsl:apply-templates select="cdliste" mode="kategorie" /> </xsl:when> xsl:otherwise <xsl:apply-templates select="cdliste" mode="alle" /> </xsl:otherwise> </xsl:choose> </xsl:template>
<xsl:template match="cdliste" mode="aktuelle"> <center> <h1>A k t u e l l e - C D s</h1> <table border="0" cellpadding="0" cellspacing="0" width="600"> <colgroup> <col width="25%" span="4" /> </colgroup> <xsl:for-each select="cd[jahr = $jahr]"> <tr> <td colspan="4"> <h2><a href="javascript:showCD('', '{cd_id}', '')"><xsl:value-of select="name" /></a></h2> </td> </tr> <tr> <td rowspan="2"> <a href="javascript:showCD('', '{cd_id}', '')"><img border="0" src="{thumb}" /></a> </td> <td>JAHR</td> <td>PREIS</td> <td>LABEL</td> </tr> <tr> <td><p><xsl:value-of select="jahr" /></p></td> <td><p><xsl:value-of select="preis" /></p></td> <td><p><xsl:value-of select="label" /></p></td> </tr> </xsl:for-each> </table> <h2> <a href="javascript:showCD('','','')">Alle CDs anzeigen</a> </h2> </center> </xsl:template>
<xsl:template match="cdliste" mode="kategorie"> <center> <h1>CDs in der Kategorie: <xsl:value-of select="$cat" /></h1> <table border="0" cellpadding="0" cellspacing="0" width="600"> <colgroup> <col width="25%" span="4" /> </colgroup> <xsl:for-each select="cd[kategorie = $cat]"> <tr> <td colspan="4"> <h2><a href="javascript:showCD('', '{cd_id}', '')"><xsl:value-of select="name" /></a></h2> </td> </tr> <tr> <td rowspan="2"> <a href="javascript:showCD('', '{cd_id}', '')"><img border="0" src="{thumb}" /></a> </td> <td>JAHR</td> <td>PREIS</td> <td>LABEL</td> </tr> <tr> <td><p><xsl:value-of select="jahr" /></p></td> <td><p><xsl:value-of select="preis" /></p></td> <td><p><xsl:value-of select="label" /></p></td> </tr> </xsl:for-each> </table> <h2> <a href="javascript:showCD('','','')">Alle CDs anzeigen</a> </h2> </center> </xsl:template>
<xsl:template match="cdliste" mode="alle"> <center> <h1>A l l e - C D s</h1> <form action="" style="width:600px;height:50px;" name="kategorien"> <fieldset> <legend>Kategorien</legend> <select name="cat" onchange="showCD('','', document.kategorien.cat.options[document.kategorien.cat.selectedIndex].value)"> <option value="">Kategorie wählen</option> <xsl:for-each select="cd/kategorie[generate-id(.) = generate-id(key('cat', .)[1])]"> <option value="{.}"><xsl:value-of select="." /></option> </xsl:for-each> </select> </fieldset> </form> <br /> <table border="0" cellpadding="0" cellspacing="0" width="600"> <colgroup> <col width="25%" span="4" /> </colgroup> <xsl:for-each select="cd"> <xsl:sort select="jahr" order="descending" /> <tr> <td colspan="4"> <h2><a href="javascript:showCD('', '{cd_id}', '')"><xsl:value-of select="name" /></a></h2> </td> </tr> <tr> <td rowspan="2"> <a href="javascript:showCD('', '{cd_id}', '')"><img border="0" src="{thumb}" /></a> </td> <td>JAHR</td> <td>PREIS</td> <td>LABEL</td> </tr> <tr> <td><p><xsl:value-of select="jahr" /></p></td> <td><p><xsl:value-of select="preis" /></p></td> <td><p><xsl:value-of select="label" /></p></td> </tr> </xsl:for-each> </table> </center> </xsl:template>
<xsl:template match="cd"> <center> <h1> <xsl:value-of select="name" /> </h1> <table border="0" cellpadding="0" cellspacing="0" width="600"> <colgroup> <col width="200" /> <col width="200" /> <col width="200" /> </colgroup> <tr> <td align="left" colspan="2"> <img> <xsl:attribute name="src"> <xsl:value-of select="bild[@id='1']" /> </xsl:attribute> </img> </td> <td valign="middle"> <h2>Art:</h2> <br /> <p> <xsl:value-of select="art" /> </p> <br /> <h2>Baujahr:</h2> <br /> <p> <xsl:value-of select="jahr" /> </p> <br /> <h2>Preis:</h2> <br /> <p> <xsl:value-of select="preis" /> </p> <br /> <h2>Label:</h2> <br /> <p> <xsl:value-of select="label" /> </p> <br /> </td> </tr> <tr> <td colspan="3" height="20" /> </tr> <tr> <td valign="middle"> <h2>Beschreibung:</h2> <br /> <p> <xsl:value-of select="beschreibung" /> </p> </td> <td align="right" colspan="2"> <img> <xsl:attribute name="src"> <xsl:value-of select="bild[@id='2']" /> </xsl:attribute> </img> </td> </tr> <tr> <td colspan="3" height="20" /> </tr> <tr> <td align="left" colspan="2"> <img> <xsl:attribute name="src"> <xsl:value-of select="bild[@id='3']" /> </xsl:attribute> </img> </td> <td valign="middle"> <xsl:for-each select="detail"> <h2> <xsl:value-of select="detailname" /> </h2> <br /> <p> <xsl:value-of select="detailwert" /> </p> <br /> </xsl:for-each> </td> </tr> <tr> <td /> <td align="right" colspan="2"> <img> <xsl:attribute name="src"> <xsl:value-of select="bild[@id='4']" /> </xsl:attribute> </img> </td> </tr> </table> <a href="javascript:showCD('','','')"> <h2> <u>ZURÜCK</u> </h2> </a> </center> </xsl:template>
</xsl:stylesheet>
Hallo,
super, vielen Dank, das ist genau das was ich gesucht habe!!!
Du hast mir wirklich sehr geholfen!
Unten ist eine HTML-Datei und das geänderte XSL (wobei ich mich nicht um deinen HTML-Code an sich kümmerte (also center und Co. gehören irgendwie weg und statt den vielen <p>s einfach CSS-Klasse(n) für die <td>s verwenden etc.))
Ja, stimmt, das ist unschön, jetzt wo du mir das Grundgerüst gezeigt hast werde ich mich mal daran setzen.
Vielen Dank nochmal und noch einen schönen Abend.
Christoph