JavaScript Variable in XSL übergeben
Jenny Eggers
- xsl
Hi,
Ich schaffe es immer noch nicht, eine JavaScript Variable in XSL zu übergeben.
Ich werde mein Problem nochmal anhand von den Dateien verdeutlichen.
ich habe hier die test.xml und die test.xsl:
http://mitglied.lycos.de/cyberfuzzy/tmp/xml/testfiles.html
Wenn man die test.xml aufruft, soll als erstes ganz oben links der Name der Datei (also test.xml) erscheinen.
Es erscheint jedoch nichts.
In der test.xsl habe ich ein Javascript. Dort ist eine Funktion, die mir den Wert "test.xml" zurückliefert.
Das Problem ist jetzt: Ich möchte den Wert, den mir die JavaScript-Funktion zurückliefert als XSL-Variable haben.
Mein Lösungsversuch war einfach eine Javascript ausgabe in der xsl:varialbe:
<xsl:variable name="xmlfile">
<SCRIPT>xsl:comment<![CDATA[
document.write(xmlfile());
//]]></xsl:comment></SCRIPT>
</xsl:variable>
Wie man sieht, funktionier es so leider nicht. In der xsl Variable steht nichts drin.
Ich habe jetzt zwar schon mitbekommen, dass es so irgendwie nicht funktionieren kann, sondern dass man es mit DOM machen muss.
Da ich aber erst seit kurzem mit XSL zu tun habe, sagt mir DOM nichts.
Wie muss ich meinen Code also umändern, dass ich das richtige in meiner xsl:variable habe?
Danke für euren Zeitaufwand und sorry für die, die sich aufregen, dass ich nicht im selben Thread wie unten gepostet habe: Ich habs versucht, aber anscheinend hat das keiner mehr gesehen.
Hmmm,
an Variablen bin ich auch dauernd am rumbohren. Aber was wichtig ist: welchen Parser setzt Du ein? Öffnest Du die XML-Datei im InternetExplorer wendet dieser die angegebene XSL-Datei an mittels des MSXML (Microsoft). Machst Du das Ganze in XML-Spy macht's i.d.R XT von James Clark...
Also im Klartext: diese Prozessoren führen kein Javascript aus (siehe in Deinem <SCRIPT> Tag). Der JSCode wird dann erst beim Laden des temporär generierten HTML im Browser ausgeführt.
Statt dessen musst Du eine Funktion finden (Funktionen in XSL sind bsw. "document(), string(), text(), etc") die diese Aufgabe macht. Der XSL-Code für die Variable heisst dann:
...
<xsl:variable name="xmlfile">
<xsl:value-of select="document()"/>
xsl:variable
...
Referenziert wird diese Variable dann mit {$xmlfile}.
Eine Funktion um in purem XSL den Dokument-URI zu bekommen weiss ich leider nicht. Ich kann Dir aber noch den Tip geben eventuell selber zu Skripten (VB im MSXML-Parser, Java in XT...), habe ich aber noch nie gemacht.
Gruß und good luck,
Frank
Hi,
Ich schaffe es immer noch nicht, eine JavaScript Variable in XSL zu übergeben.
Ich werde mein Problem nochmal anhand von den Dateien verdeutlichen.
ich habe hier die test.xml und die test.xsl:
http://mitglied.lycos.de/cyberfuzzy/tmp/xml/testfiles.htmlWenn man die test.xml aufruft, soll als erstes ganz oben links der Name der Datei (also test.xml) erscheinen.
Es erscheint jedoch nichts.In der test.xsl habe ich ein Javascript. Dort ist eine Funktion, die mir den Wert "test.xml" zurückliefert.
Das Problem ist jetzt: Ich möchte den Wert, den mir die JavaScript-Funktion zurückliefert als XSL-Variable haben.
Mein Lösungsversuch war einfach eine Javascript ausgabe in der xsl:varialbe:
<xsl:variable name="xmlfile">
<SCRIPT>xsl:comment<![CDATA[
document.write(xmlfile());
//]]></xsl:comment></SCRIPT>
</xsl:variable>Wie man sieht, funktionier es so leider nicht. In der xsl Variable steht nichts drin.
Ich habe jetzt zwar schon mitbekommen, dass es so irgendwie nicht funktionieren kann, sondern dass man es mit DOM machen muss.
Da ich aber erst seit kurzem mit XSL zu tun habe, sagt mir DOM nichts.Wie muss ich meinen Code also umändern, dass ich das richtige in meiner xsl:variable habe?
Danke für euren Zeitaufwand und sorry für die, die sich aufregen, dass ich nicht im selben Thread wie unten gepostet habe: Ich habs versucht, aber anscheinend hat das keiner mehr gesehen.
Hallo,
...
<xsl:variable name="xmlfile">
<xsl:value-of select="document()"/>
xsl:variable
^
/
...
document() benoetigt mind. ein Argument und ermoeglicht das Ansprechen von externen XML-Quellen oder des Stylesheets selbst [mit ('')], gibt aber keinen Dokumentnamen zurueck.
MfG, Thomas
Klar dass das nix zurück gibt,
war nur ein Beispiel für einen Funktionsaufruf einer nach XSLT-Standard definierten Funktion. Eine Funktion für das Auslesen des Dokument-URI gibt es meines Wissen übrigens nicht. Deshalb: Dateiname als Attribut oder Text in ein eigenes Element schreiben und Datei nicht mehr umbenennen!
document() benoetigt mind. ein Argument und ermoeglicht das Ansprechen von externen XML-Quellen oder des Stylesheets selbst [mit ('')], gibt aber keinen Dokumentnamen zurueck.
Hallo,
Klar dass das nix zurück gibt,
Das ist (fuer Einsteiger) ohne Hinweis nicht unbedingt ersichtlich.
Deshalb: Dateiname als Attribut oder Text in ein eigenes Element schreiben und Datei nicht mehr umbenennen!
Diesen Vorschlag habe ich ja gestern bereits gemacht.
MfG, Thomas
Deshalb: Dateiname als Attribut oder Text in ein eigenes Element schreiben und Datei nicht mehr umbenennen!
Na, das bringt leider nichts. Ich habe nämlich verschiedene xml-Dateien mit verschieden Daten. Aber wenn die z. B. alle mit der gleichen xsl-Datei angezeigt werden sollen, dann wird das nicht funktionieren.
Es muss doch irgendwie rauszufinden sein. Das sollte doch eigentlich schon eine Grundfunktion sein. Wie macht ihr das denn? Müsst ihr nie den Namen der aktuellen Datei wissen?
Kann vielleicht noch jemand das mit dem DOM erklären?
Hallo,
Kann vielleicht noch jemand das mit dem DOM erklären?
Schau Dir mein Beispiel mit dem Datum an. In der XSL-Datei gibt es eine leere xsl:variable. Diese wird vor dem Prozessieren mit einem Wert belegt.
Im XSL-Dokument auf Root-Level (noch vor dem ersten xsl:template) definieren:
<xsl:variable name="varname">...</xsl:variable>
Ein HTML-Dokument mit JavaScript-Block erstellen:
xmlfile="test.xml";
xslfile="test.xsl";
// XML laden
xmlinput=new ActiveXObject("MSXML2.DOMDocument");
xmlinput.async=false;
xmlinput.load(xmlfile);
// XSL laden
xslinput=new ActiveXObject("MSXML2.DOMDocument");
xslinput.async=false;
xslinput.load(xslfile);
// xsl:variable-Definitionen
obj=xslinput.documentElement.getElementsByTagName("xsl:variable");
obj[0].firstChild.nodeValue=xmlfile;
// generierten HTML-Code ausgeben
htmloutput=xmlinput.transformNode(xslinput.documentElement);
// htmloutput geeignet ausgeben
xmlinput bzw. xslinput beinhalten die DOM-Trees der beiden Dokumente. Vor der Verarbeitung wird im XSL-Tree der Wert der ersten xsl:variable im Dokument verändert (hier auf den Wert xmlfile, also den aktuellen XML-Dateinamen gesetzt).
MfG, Thomas
Hi,
das habe ich gemacht. Wenn ich jetzt die html aufrufe, sehe ich nur ein weißes Bild im Browser.
Hallo,
das habe ich gemacht. Wenn ich jetzt die html aufrufe, sehe ich nur ein weißes Bild im Browser.
Wie sieht "die html" aus? Das Script muss den erzeugten HTML-Content auch entsprechend ausgeben (mittels document.write() im neuen Fenster oder im body, dann aber evtl. den XSL-Code so aendern, dass es Elemente wie html, head oder body nicht doppelt gibt).
MfG, Thomas
Das ist die html:
<html>
<head>
<title>dom</title>
</head>
<body>
<script language="JavaScript">
xmlfile="test.xml";
xslfile="test.xsl";
// XML laden
xmlinput=new ActiveXObject("MSXML2.DOMDocument");
xmlinput.async=false;
xmlinput.load(xmlfile);
// XSL laden
xslinput=new ActiveXObject("MSXML2.DOMDocument");
xslinput.async=false;
xslinput.load(xslfile);
// xsl:variable-Definitionen
obj=xslinput.documentElement.getElementsByTagName("xsl:variable");
obj[0].firstChild.nodeValue=xmlfile;
// generierten HTML-Code ausgeben
htmloutput=xmlinput.transformNode(xslinput.documentElement);
// htmloutput geeignet ausgeben
</script>
</body>
</html>
Hallo,
// generierten HTML-Code ausgeben
htmloutput=xmlinput.transformNode(xslinput.documentElement);
// htmloutput geeignet ausgeben
Dieser Kommentar war zur Beachtung da und im letzten Posting habe ich document.write() erwaehnt ...
MfG, Thomas
Hallo,
Danke für euren Zeitaufwand und sorry für die, die sich aufregen, dass ich nicht im selben Thread wie unten gepostet habe: Ich habs versucht, aber anscheinend hat das keiner mehr gesehen.
Es geht nicht immer in Echtzeit: [pref:t=42815&m=234621].
MfG, Thomas
Hi,
mir ist da gerade noch eine andere Idee gekommen.
Wenn in der XML-Datei der gesamte Pfad mit Dateiname steht (z. B. "c:\xml\test\files\test.xml"), kann ich der mit der XSL nur den Dateinamen herausfiltern, sodass ich nur "test.xml" bekomme?