StyloMilo: XML-Datei inkl XSL-Transformation in HTML-Dokument ausgeben

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);

hier steigt Opera aus, tut nichts mehr. Test mit nem alert(): vor
send(null) gibt er was aus, danach nicht mehr. Keine Fehlermeldung.

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");
  }
}

  1. 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

    1. 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.

      1. 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