Javascript ausführen
Kai
- xsl
0 ritschmanhard0 Kai0 ritschmanhard0 Kai
Hallo,
hat jemand eine Ahnung, wie ich Javascript ausführen kann und den zurückgegebenen Wert einer XSL-Variable zuweisen kann oder Javascript ausführen und zB in dem Element <A> als Text anzeigen, also
<A href="test.html">Variable</A>
Variable wäre ungefähr so aufgebaut parent.Text.Source.selectSingleNode("//test[mode='<xsl:value-of select="test/mode"/>']").parentNode.selectSingleNode("name").text;
ich dachte eben ich mache das folgendermaßen:
<A><xsl:attribute name="href">test.htm</xsl:attribute><script>parent.Text.Source.selectSingleNode("//test[mode='<xsl:value-of select="test/mode"/>']").parentNode.selectSingleNode("name").text;</script></A>
Aber leider funktioniert das überhaupt nicht. xsl:eval und xsl:script nimmt er auch nicht, da möchte er das XML dann gar nicht mehr anzeigen. Ich schätze das liegt daran: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
dieses möchte ich aber wenns geht nicht ändern, da sonst sicher ein paar andere Dinge nicht gehen. Hat jemand eine Idee?
Wäre echt super, hab schon den halben Tag damit verbracht Dinge auszuprobieren und im Netz danach zu suchen :(
Gruß
Kai
Hi Kai!
Nu is das meines Wissens im Browser ja so:
Erst wird die xsl Transformation ausgeführt; dann wird daraus HTML und dann erst wird Javascript ausgeführt. Also ist eine Zuweisung eines Resultwerts einer Javascriptfunktion auf eine XSL Variable schlechterdings nicht möglich.
Weiterhin gibt es meines Wissens keine JS Standardfunktion selectSingleNode...
Gib doch mal ein Beispiel, wie einer der xml Datensätze aussieht und wie du gerne hättest, dass dein generierter Link (A) aussehen soll.
Vielleicht kann ich dir dann weiterhelfen.
Grüsse,
Richard
Also ich hab das Fenster in mehrere Frames aufgeteilt, im linken Frame wird eine Strukturdatei (xml) angezeigt, da steht zB folgendes drinnen:
<ref><av><mode>A</mode><sc>D</sc><chap>00</chap><sec>12</sec><sub>23</sub><subt>11</subt><dis>20</dis><disc>A</disc><in>005</in><inc>A</inc><item>A</item></av><name>Testdoku</name></ref>
Dann zeige ich eine XML-Datei mit Links normalerweise im Textbereich an. Jedoch wurde bisher av->mode bis item ausgelesen, was ich eben aus der im Textbereich dargestellten XML-Datei auslesen konnte und dargestellt habe. Jetz soll allerdings der name angezeigt werden, den ich nur aus der Strukturdatei bekommen kann.
<xsl:template match="ref|REF">
<A style="font-style:italic;">
<xsl:attribute name="href">JavaScript:parent.Symbol.zeigeXMLan('<xsl:apply-templates select="av|AV"/>','');</xsl:attribute>
<xsl:apply-templates select="av"/>
</A> 
</xsl:template>
So wurde ein Link bisher angezeigt, wie gesagt der Tag <av> mit den Unterelementen ist auch in der XML vorhanden, die im Textbereich angezeigt wird, der Name des Links jedoch nicht, der ist in einer anderen XML-Datei, die in einem anderem Frame angezeigt wird.
Daher wollte ich den Tag <name> aus der Strukturdatei auslesen, die in einem Javascript folgendermaßen definiert ist:
<XML id="Source" src="/test/struktur.xml"></XML>
Diesen Abschnitt wollte ich dann anstelle von <xsl:apply-templates select="av"/>einfügen.
xsl:scriptparent.Symbol.Source.selectSingleNode("//av[mode='<xsl:value-of select="av/mode"/>']").parentNode.selectSingleNode("name").text;</xsl:script>
Nur leider schreibt er mir das nur hin, wenn ich den Quellcode lese und führt es nicht aus. xsl:script und xsl:eval mag er bei mir nicht
Den Zeile mit dem selectSingleNode funktioniert im javascript schon, also die Syntax müsste da ok sein, nur wie könnte man so etwas in einem XSL einbinden, dass der zurückgegebene Wert angezeigt werden könnte.
Ich hoffe es ist jetz etwas klarer und jemand hat einen Tipp für mich
Gruß
Kai
Also ich hab das Fenster in mehrere Frames aufgeteilt, im linken Frame wird eine Strukturdatei (xml) angezeigt, da steht zB folgendes drinnen:
//=> struct xml:
<ref>
<av>
<mode>A</mode>
<sc>D</sc>
<chap>00</chap>
<sec>12</sec>
<sub>23</sub>
<subt>11</subt>
<dis>20</dis>
<disc>A</disc>
<in>005</in>
<inc>A</inc>
<item>A</item>
</av>
<name>Testdoku</name>
</ref>
Dann zeige ich eine XML-Datei mit Links normalerweise im Textbereich an. Jedoch wurde bisher av->mode bis item ausgelesen, was ich eben aus der im Textbereich dargestellten XML-Datei auslesen konnte und dargestellt habe.
//=> left Frame shows (or similar)(*):
<ref>
<av>
<mode>A</mode>
<sc>D</sc>
<chap>00</chap>
<sec>12</sec>
<sub>23</sub>
<subt>11</subt>
<dis>20</dis>
<disc>A</disc>
<in>005</in>
<inc>A</inc>
<item>A</item>
</av>
</ref>
»»Jetz soll allerdings der name angezeigt werden, den ich nur aus der Strukturdatei bekommen kann.(**)
//Prior right frame build rule:
<xsl:template match="ref|REF">
<A style="font-style:italic;">
<xsl:attribute name="href">JavaScript:parent.Symbol.zeigeXMLan('<xsl:apply-templates select="av|AV"/>','');</xsl:attribute>
<xsl:apply-templates select="av"/>
</A> 
</xsl:template>
//Anmerkung: <xsl:template select="..." /> ist mir nicht bekannt (auch selfhtml nicht) - meintest du <xsl: value-of select="..." />?
So wurde ein Link bisher angezeigt, wie gesagt der Tag <av> mit den Unterelementen ist auch in der XML vorhanden, die im Textbereich angezeigt wird, der Name des Links jedoch nicht, der ist in einer anderen XML-Datei, die in einem anderem Frame angezeigt wird.
//Unklar: du hast doch unter (*) angegeben, dass der <name> Tag in der xml-source vorhanden ist, oder? Auch bei (**) sagst du, dass der name in der strukturdatei vorhanden ist - warum ist er jetzt in einer "anderen XML-Datei"?
Daher wollte ich den Tag <name> aus der Strukturdatei auslesen, die in einem Javascript folgendermaßen definiert ist:
<XML id="Source" src="/test/struktur.xml"></XML>
//Mit verlaub: Hä? Der XML Tag <name> ist in einem Javascript definiert? Ja was denn?
//Du hast eine Javascript-datei und da steht drin (?):
//<XML id="Source" src="/test/struktur.xml"></XML>
//der javascript interpreter sollte hier einen ungültigen befehl melden.
Diesen Abschnitt wollte ich dann anstelle von <xsl:apply-templates select="av"/>einfügen.
//Welchen Abschnitt? Den Tag namen, der in Javascript als <XML id="Source" src="/test/struktur.xml"></XML> definiert ist???
xsl:scriptparent.Symbol.Source.selectSingleNode("//av[mode='<xsl:value-of select="av/mode"/>']").parentNode.selectSingleNode("name").text;</xsl:script>
//In welchem Frame und an welcher Stelle soll das nun funktionieren?
//Meines Wissens sind xsl:script und xsl:eval nicht offizieller Bestandteile von xsl; siehe auch http://forum.de.selfhtml.org/archiv/2004/7/t84577/#m495981.
Den Zeile mit dem selectSingleNode funktioniert im javascript (...)
//Das ist gut, denn auch hier habe ich keine Funktionsreferenz im javascript-Bereich von selfhtml gefunden...
Ich hoffe es ist jetz etwas klarer und jemand hat einen Tipp für mich
//Ich will dich wirklich nicht ärgern, aber mir ist es nicht wirklich klar geworden - aber eventuell versteht das ja jemand anders... Wenn du mit mir das Problem weiter klären möchtest, mußt du es noch genauer erklären - insbesondere:
Grüsse,
Richard
//Anmerkung: <xsl:template select="..." /> ist mir nicht bekannt (auch selfhtml nicht) - meintest du <xsl: value-of select="..." />?
Benutzt doch nicht <xsl:template select=".." sondern, <xsl:apply-templates select=".."
//Unklar: du hast doch unter (*) angegeben, dass der <name> Tag in der xml-source vorhanden ist, oder? Auch bei (**) sagst du, dass der name in der strukturdatei vorhanden ist - warum ist er jetzt in einer "anderen XML-Datei"?
Der <name> ist nur in der Struktur-XML-Datei aber nicht in der XML-Datei, die im Textbereich angezeigt wird. und bei der Transformation von der Textbereich-XMLdatei soll <name> aus der Struktur-XML-Datei gelesen werden. ist vielleicht bissl doof zu erklären *sorry*
//Mit verlaub: Hä? Der XML Tag <name> ist in einem Javascript definiert? Ja was denn?
Da hab ich mich wohl falsch ausgedrückt. nicht <name> ist dort definiert, sondern die Strukturdatei (struktur.xml) in einer HTML-Datei - tut mir leid war wirklich schlecht erklärt und hab mich total vertan, habe die id (Source) im Javascript verwendet, daher hab ich das fäschlicherweise so geschrieben
//Welchen Abschnitt? Den Tag namen, der in Javascript als <XML id="Source" src="/test/struktur.xml"></XML> definiert ist???
Nein diesen:
<script>parent.Symbol.Source.selectSingleNode("//av[mode='<xsl:value-of select="av/mode"/>']").parentNode.selectSingleNode("name").text;</script>
Also ich habe es jetz gelöst und zwar mit einer Funktion, die die Struktur-XML-Datei öffnet und den Tag <name> ausliest. Auch wenn das laut javascript nicht geht, kann man einen Umweg über
var Source=new ActiveXObject("MSXML.DOMDocument");
machen, hiermit die Datei laden und selectSingleNode ausführen lassen. Und es funktioniert :))
Habe diese Funktion im XSL aufgerufen, nur leider wurde mir der Rückgabeparameter nicht angezeigt. Ein Freund hatte dann folgende Idee:
<script>Javascript:document.write(test('<xsl:apply-templates select="av"/>'));</script>
Und jetz funktioniert ist es ;-)
Trotzdem vielen lieben Dank für deine Bemühungen Richard. v.a dass du so nett reagiert hast, obwohl ich es wohl nicht wirklich gut erklärt habe :(
Viele Grüße
Kai