PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XSLT Transformation mit Java-Script im Firefox


Spankmaster79
16.12.2005, 17:14
Servuz,

hat das schonmal jemand gemacht?

Hab hier (http://www.mozilla.org/projects/xslt/js-interface.html) ne Anleitung gefunden aber versteh die nicht ganz.

mein XML, XSD und XSLT sind als Data Islands im HTML versteckt. Mit dem Internet Explorer funktioniert das ganze auch einwandfrei.

Jetzt wollte ich es mit dem Firefox probieren aber komm nicht so richtig weiter.

Mein Code:

var processor = new XSLTProcessor();

xmlDoc = document.implementation.createDocument("", "", null);
xmlDoc.load(document.getElementById("xsdData").innerHTML);

processor.importStylesheet(xmlDoc);

Im Beispiel auf der Seite steht mann muss zuerst nach dem kreieren des Prozessors ein Stylesheet importieren. Dann laden die aber mit .load ein .xml Document. Kein .xsd wie ich erwartet hätte.... :confused:

Also lad ich der Logik nach mein Xsd. Aber wo ist mein XML.... :confused:

Dann mit

var newDocument = processor.transformToDocument(document.getElementById("xsltData").innerHTML);


Versuch ich erstmal zu transformieren......klappt aber nicht :confused:

Java-Script Konsole meldet
Fehler: uncaught exception: [Exception... "Could not convert JavaScript argument arg 0 [nsIXSLTProcessor.transformToDocument]" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: http://localhost:1186/scripts/my.js :: loadXML :: line 332" data: no]

Jemand ne Ahnung???

Gruß
Spanky


Jonas
16.12.2005, 20:14
wie sieht denn zeile 332 in my.js aus?

eViL_oNe
20.12.2005, 08:40
ich vermute mal, es liegt an .innerHTML, was kein DOM-Attribut ist (überhaupt erscheint mir der Ansatz mit den sog. "Data Islands" als extremst unsauber) -- unterstützt denn Firefox dies überhaupt?

Versuche mal, wie in der Anleitung beschrieben, ein Dokument aus einer separaten Quelle zu erzeugen

Spankmaster79
22.12.2005, 09:22
ich vermute mal, es liegt an .innerHTML, was kein DOM-Attribut ist (überhaupt erscheint mir der Ansatz mit den sog. "Data Islands" als extremst unsauber) -- unterstützt denn Firefox dies überhaupt?


Ich werd erstmal mit einer .xml Datei versuchen wie im Beispiel.

Das das mit "Data Islands" bisschen unsauber ist find ich auch. Aber mir ist keine ander Idee eingefallen das XML am Client zur Verfügung zu stellen.

Der Firefox unterstützt es indem man die "data island" verstickt durch eine <div>Box die mit CSS auf visibility:hidden gesetzt ist.

wie sieht denn zeile 332 in my.js aus?

So: var newDocument = processor.transformToDocument(document.getElementById("xsltData").innerHTML);

Spankmaster79
22.12.2005, 16:45
also mein Problem hat sich mitlerweile erweitert bzw. ich bin bisschen vorwärts gekommen.

myDoc.load("myxml.xml"); funktioniert. Da ich aber mein Dokument im html als data island drin hab kann ich damit nichts anfangen. Ich bräuchte wie im IE ein
myDoc.loadXML(document.getElementById("xmlData").innerHTML)
Es gibt im gegensatz zum IE aber kein loadXML() im Firefox. Dies kann man laut meiner Info aber umgehen indem man sich mit dem DOMParser Objekt eine loadXML Funktion bastelt.

Dies geht dann so:
Document.prototype.loadXML = function(str) {
var DOMParser = new DOMParser();
var DOMDocument = DOMParser.parseFromString(str,"text/xml");
}
Ich lass das XSLT erstmal weg und versuche so voran zu kommen. Aber jetzt sagt mir die Java-script Konsole

DOMParser is not a constructor Ich benutze Firefox 1.5 da gibt es das Objekt auf jeden Fall....

http://developers.mozilla.org/en/docs/XML_Extras

Komm nisch weidaaaaa :mauer::mauer:

Spankmaster79
04.01.2006, 16:03
Also bin nun etwas weitergekommen

Damit ich die loadXML() Funktion benutzen kann muss für den Mozilla erstmal die Document Klasse erweitern


Document.prototype.loadXML = function(strXML) {
//create a DOMParser
var objDOMParser = new DOMParser();
//create new document from string
var objDoc = objDOMParser.parseFromString(strXML, "text/xml");
//make sure to remove all nodes from the document
while (this.hasChildNodes())
this.removeChild(this.lastChild);
//add the nodes from the new document
for (var i=0; i < objDoc.childNodes.length; i++) {
//import the node
var objImportedNode = this.importNode(objDoc.childNodes[i], true);
//append the child to the current document
this.appendChild(objImportedNode);
} //End: for
} //End: function

Dann um aus dem DOM XML wieder einen String zu basteln brauche ich wie im IE das xml Attribut. Dieses gibt es aber nicht im Mozilla. Also erzeuge ich eines in Node


/**
* add the xml attribute to the node class
* Everytime the .xml attribute is called it will be transformed to string
*/
Node.prototype.__defineGetter__("xml", function () {
var oSerializer = new XMLSerializer();
return oSerializer.serializeToString(this, "text/xml");
});

Dann bastel ich mir 2 DOM Objekte aus im Mozilla und lade mein XML aus der Data Island in das DOM Objekt


//Param 1=namespace; 2=root node; 3=not yet activated in mozilla, so null
objSrcTree = document.implementation.createDocument("", "", null);
objXSLT = document.implementation.createDocument("", "", null);
objSrcTree.async = false;
try {
objSrcTree.loadXML(document.getElementById("xmlData").innerHTML);
objXSLT.loadXML(document.getElementById("xsltData").innerHTML);
}
catch(Exception){
alert("loadXML failed in Mozilla");
}

Bis hierhin funktioniert auch alles. Wenn ich alert(objSrcTree.xml) oder alert(objXSLT.xml) mache bekomme ich die Dokumente angezeigt also sollten sie auch geladen sein. :D

Nun bastel ich mir einen XSLT Prozessor und versuche zu transformieren

objXSLTProc = new XSLTProcessor();
objXSLTProc.importStylesheet(objXSLT);

try {
var resultDOM = objXSLTProc.transformToDocument(objSrcTree);
var sResult = resultDOM.xml;
alert(sResult);
}
catch(Exeption){
alert("XSLT Transformation failed");
}

Er landet im try Block und führt alles aus. Nur das sResult ist leer......

Sieht da vielleicht jemand einen Fehler oder bin ich jetzt schon zu speziell...

Gruß
Spanky :confused:

Spankmaster79
13.01.2006, 10:09
Also bissl weitergekommen bin ich ja jetzt. Es liegt wohl am MIME-Type das es nicht geht. Der Web-Server sendet nicht application/xhtml+xml für das Dokument und somit gehen auch die Daten darin nicht mehr als XML durch....

check das zwar noch nicht ganz aber naja....

Spankmaster79
18.01.2006, 12:24
Habs gelöst.

Man muss das Dokument als application/xhtml+xml senden. Den XML Daten den xmlns="" hinzufügen und schon funzts.

Hätt die FAQ die ich ja gelesen hatte besser überdenken sollen....:mauer: Aber naja, manchmal braucht man halt.

Wer Info's brauch kann mich ja hier anmailen...

Gruß
Spanky