XML-Datei inkl XSL-Transformation in HTML-Dokument ausgeben
StyloMilo
- javascript
Schönen guten Tag zusammen,
nachdem wieder mal ein ganzer Tag ins Land gegangen ist,
ohne dass ich wirklich produktiv war, hoffe ich, dass
Ihr mir helfen könnt. Ich möchte ein XML-Dokument als
Tabelle innerhalb einer HTML-Seite im angegebenen DIV-
Element ausgeben. Funktioniert in IE und FF auch
einwandfrei, nur der Opera zickt rum, dass alles zu spät
ist und zeigt absolut nichts. Wäre toll, wenn Euch was
dazu einfällt.
Hier die Funktion, die die XML/XSL-Datei einbetten soll.
Die Stelle, an der Opera nicht weiterkommt ist markiert:
function transform(divFuerAusgabe, XMLDatei, XSLDatei)
{
var XMLEingabe;
var XSLEingabe;
var HTMLAusgabe;
// Abfrage für den Internet Explorer
if(window.clipboardData && document.compatMode)
{
// XML laden
XMLEingabe = new ActiveXObject("MSXML2.DOMDocument");
XMLEingabe.async = false;
XMLEingabe.load(XMLDatei);
// XSL laden
XSLEingabe = new ActiveXObject("MSXML2.DOMDocument");
XSLEingabe.async = false;
XSLEingabe.load(XSLDatei);
// generierten HTML-Code ausgeben
HTMLAusgabe = XMLEingabe.transformNode(XSLEingabe.documentElement);
document.getElementById(divFuerAusgabe).innerHTML = HTMLAusgabe;
}
// Abfrage für Firefox & Opera
else if(document.defaultView)
{
// erst XSL laden
var xsltProcessor = new XSLTProcessor();
var myXMLHTTPRequest = new XMLHttpRequest();
myXMLHTTPRequest.open("GET", XSLDatei, false);
myXMLHTTPRequest.send(null);
XSLEingabe = myXMLHTTPRequest.responseXML;
xsltProcessor.importStylesheet(XSLEingabe);
// dann XML laden
myXMLHTTPRequest = new XMLHttpRequest();
myXMLHTTPRequest.open("GET", XMLDatei, false);
myXMLHTTPRequest.send(null);
XMLEingabe = myXMLHTTPRequest.responseXML;
// generierten HTML-Code ausgeben
HTMLAusgabe = xsltProcessor.transformToFragment(XMLEingabe, document);
document.getElementById(divFuerAusgabe).appendChild(HTMLAusgabe);
}
else
{
alert("keine XML/XSL Transformation möglich");
}
}
Hallo StyloMilo,
Ich möchte ein XML-Dokument als
Tabelle innerhalb einer HTML-Seite im angegebenen DIV-
Element ausgeben. Funktioniert in IE und FF auch
einwandfrei, nur der Opera zickt rum, dass alles zu spät
ist und zeigt absolut nichts.
Ich erhalte mit dem angegebenen JS-Code auch in Opera 9.25 eine HTML-Ausgabe durch die Transformation. Vermutlich liegt das Problem also im XSLT-Stylesheet selbst. Vielleicht hilft eine explizite Angabe von tbody für die Tabelle weiter oder es werden XSLT-Techniken verwendet, die Opera nicht umsetzen kann. Kürzlich hatte ich wieder ein Problem mit völlig Spec-konformen xsl:call-template-Aufrufen, die nicht funktionieren wollten.
Wird tatsächlich ein HTML-Fragment, also <table>...</table> in das div-Element geladen oder gar ein komplettes HTML-Dokument?
BTW: Ich würde immer eine serverseitige Transformation vorziehen, denn XSLT im Browser ist nach wie vor zu wacklig, mal abgesehen von einem klar definierten Umfeld wie z. B. Einzelplatz mit IE.
Grüße,
Thomas
Vermutlich liegt das Problem also im XSLT-Stylesheet selbst. Vielleicht
hilft eine explizite Angabe von tbody für die Tabelle weiter oder es werden
XSLT-Techniken verwendet, die Opera nicht umsetzen kann.
hier mal mein xsl-File... hab keine abstrusen Dinge benutzt. Er soll nur
alle Zeilen raushauen. fällt da noch jemandem was zu ein?
<?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="/">
<table id="myTable" class="tablesorter">
<thead>
<tr>
<th>Titel</th>
<th>Beginn</th>
<th>Dauer</th>
<th>Gebühr</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="dataroot/dataset">
<tr>
<td><xsl:value-of select="Semiartitel"/> (xsl:value-of select="Code"/)</td>
<td><xsl:value-of select="Anfangsdatum"/></td>
<td><xsl:value-of select="Wochendauer"/> Wochen</td>
<td><xsl:value-of select="GKosten"/> EUR</td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
Wird tatsächlich ein HTML-Fragment, also <table>...</table> in das
div-Element geladen oder gar ein komplettes HTML-Dokument?
es wird auf jeden Fall nur das Fragment von <table> bis </table>
ausgegeben. da ist also alles i.O.
Hallo StyloMilo,
hier mal mein xsl-File... hab keine abstrusen Dinge benutzt. Er soll nur
alle Zeilen raushauen. fällt da noch jemandem was zu ein?<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Hier wird also HTML erzeugt (default output method). Ist das "Wirtsdokument" vielleicht als XHTML ausgezeichnet? Dann mal so probieren:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"
omit-xml-declaration="yes" xmlns="http://www.w3.org/1999/xhtml"/>
<xsl:template match="...">
...
</xsl:template>
</xsl:stylesheet>
Teste auch mal direkt im Opera ohne JS unter Angabe von <?xml-stylesheet href="name.xsl" type="text/xsl"?>
.
Grüße,
Thomas