Jenny Eggers: JavaScript Variable in XSL übergeben

Hallo!

Ich weiß - sowas ähnliches wurde gestern oder vorgestern schon gefragt. Als Antwort kam eine Seite mit Tourdaten. Aber ich werde aus dem Quelltext einfach nicht schlau.

Das Problem ist: Ich habe ein Javascript in meiner xsl Datei:

<SCRIPT for="window" event="onload">xsl:comment<![CDATA[
 test = "hallo";
//]]></xsl:comment></SCRIPT>

Jetzt möchte ich in meiner xsl Datei die Variable "test" verwenden.

Kann mir das vielleicht jemand ganz einfach und verständlich erklären? So eine Art Schritt für Schritt Anleitung wäre nicht schlecht.

Danke schonmal im Voraus!

Grüsse
Jenny

  1. Hallo,

    Ich weiß - sowas ähnliches wurde gestern oder vorgestern schon gefragt. Als Antwort kam eine Seite mit Tourdaten. Aber ich werde aus dem Quelltext einfach nicht schlau.

    Dort werden Daten als xsl:variable an das XSL-Dokument uebergeben bevor dieses auf die XML-Struktur angewendet wird.

    Das Problem ist: Ich habe ein Javascript in meiner xsl Datei:

    <SCRIPT for="window" event="onload">xsl:comment<![CDATA[
     test = "hallo";
    //]]></xsl:comment></SCRIPT>

    Jetzt möchte ich in meiner xsl Datei die Variable "test" verwenden.

    Diese Variable steht erst im Ergebnis-Dokument zur Verfuegung.

    Schau in der Doku Deines XSLT-Prozessors nach, ob dieser eine eigene Scripting-Engine besitzt. In alten MSXML-Implementierungen gab es mal xsl:script, siehe http://www.styleassistant.de/tips/tip29.htm. Das ist aber nicht XSLT-konform. Mozilla kann mit dem Beispiel gar nichts anfangen ...

    MfG, Thomas

  2. Hey, Jenny,

    wie ich sehe hast Du das gleiche Problem wie ich!
    Ich versuche auch vergeblich eine JavaScript-Variable in einer XSL-Datei auszulesen, um mit dem Wert eine Suchroutine zu starten.
    Allerdings ist es mir bis jetzt noch nicht gelungen....

    1. Hi,

      ich glaub, ich habs!

      Ich hab hier das Script, in der die Variable festgelegt wird:
      <SCRIPT>xsl:comment<![CDATA[
      testvar = 'Das ist ein Test';
      //]]></xsl:comment></SCRIPT>

      Und hier wird meine Variable dann ausgegeben:
      <SCRIPT>xsl:comment<![CDATA[
      document.write(testvar);
      //]]></xsl:comment></SCRIPT>

      Anscheinend funktioniert es, wenn man an der Stelle, an der man die Variable ausgeben möchte einfach noch ein Script mit document.wite macht.

      Und dafür saß ich jetzt 5 Stunden davor......

      1. Und hier wird meine Variable dann ausgegeben:
        <SCRIPT>xsl:comment<![CDATA[
        document.write(testvar);
        //]]></xsl:comment></SCRIPT>

        Ja, aber mit dieser Funktion gibts Du ja den Variablenwert nur aus.
        Ich möchte aber diesen Wert einer xsl:variable zuweisen, damit ich mit <xsl:starts-with(string, 'variable')> nach einem bestimmten Wert suchen kann!
        Das geht mit Deiner Methode leider nicht!!!
        Aber trotzdem vielen Dank für den Tip...

      2. Na toll! Zu früh gefreut.
        Wie bring ich das Teil jetzt dazu, dass es noch eine XSL-Variable wird?

        Wenn ich so eine Variable mache, funktioniert es:
        <xsl:variable name="jvariable">
        Das ist eine Testvariable
        </xsl:variable>

        Wieso funktioniert es nicht so:

        <xsl:variable name="jvariable">
        <SCRIPT>xsl:comment<![CDATA[
        document.write('Das ist eine Testvariable');
        //]]></xsl:comment></SCRIPT>
        </xsl:variable>

        Was habe ich jetzt schon wieder falsch gemacht?

        1. Hallo,

          Was habe ich jetzt schon wieder falsch gemacht?

          Ihr beide habt einfach nicht verstanden, dass in XML _keine_ Scripting gibt. Punkt.

          Ab da kann man also nach anderen Lösungen suchen: eine Lösung ist, wie es Thomas M. macht in seinen (schon mehrfach für euch verlinkten) Beispielseiten.
          Dort zeigt er, wie man mit DOM genau dieses Problem angeht.

          Ich sehe wirklich ein, dass euch euer Vorhaben wichtig ist; aber entweder habt ihr euch euer Fragestellung/Problem selbst nicht richtig konkretisiert, oder - und das ist keine Schade - ihr wollt etwas was euer derzeitigen Wissenstand/Können einfach zu sehr übersteigt.

          Und mal ehlich: die Beschreibung "ich will eine JavaScript-Variable in einer XSL-Datei" ohne, dass ihr zeigen würdet was ihr schon alles versucht habt (z.B. online Stellen von den betreffenden Dateien etc. etc) ist wirklich alles andere als konkret.

          Um es nochmal ganz deutlich zu sagen: man kann nicht aus einer HTML-Datei zurück in die erzeugende XSL-Datei schreiben.
          Man kann hier nur mit DOM arbieten und so den sogenannten DOM-Tree  (d.i. die Baumstruktur der eingelesenen XML/XSL Dokumente im Speicher) bearbeiten.
          Viele Parser bieten außerdem proprietäre Erweiterungen an, was diese sind und wie diese Funktionieren steht in den Dokumentation des jeweiligen Parsers.

          Grüße
          Thomas

          1. Hallo,

            ok, 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.

            1. Hallo,

              Da ich aber erst seit kurzem mit XSL zu tun habe, sagt mir DOM nichts.

              Lies das entsprechende Kapitel in SELFHTML und versuche die genannten Beispiele nachzuvollziehen.

              Wie muss ich meinen Code also umändern, dass ich das richtige in meiner xsl:variable habe?

              Vorschlag: Wenn der Dateiname so wichtig ist, dann schreibe diesen doch gleich mit in das jeweilige XML-Dokument, z. B.:

              <daten file="test.xml">
              ...
              </daten>

              Im Stylesheet dann entsprechend:

              XML-Datei: <xsl:value-of select="/daten/@file"/>

              MfG, Thomas

              1. Vorschlag: Wenn der Dateiname so wichtig ist, dann schreibe diesen doch gleich mit in das jeweilige XML-Dokument, z. B.:

                Ja, klingt nicht schlecht. Ich kann blos nichts an den XML-Dokumenten ändern. Ich bekomme die nur. Aber der gesamte Pfad mit Dateiname steht drin. Gibt es eine Möglichkeit da nur den Dateinamen rauszufiltern?

                Beispiel:
                "c:\xml\test\files\test.xml" steht als Pfad in der XML
                Ich möchte nur "test.xml"

                Geht das irgendwie mit einer xsl Filterfunktion oder sowas?

                1. Hallo,

                  Ja, klingt nicht schlecht. Ich kann blos nichts an den XML-Dokumenten ändern. Ich bekomme die nur. Aber der gesamte Pfad mit Dateiname steht drin.

                  Du machst mir Spaß. Oben schreibst Du wieder, dass das gar nicht geht ...

                  Beispiel:
                  "c:\xml\test\files\test.xml" steht als Pfad in der XML
                  Ich möchte nur "test.xml"

                  Geht das irgendwie mit einer xsl Filterfunktion oder sowas?

                  Wenn der Pfad konstant ist, dann probiere es so:

                  <xsl:value-of select="substring-after($filename,'c:\xml\test\files')"/>

                  (wobei $filename eine zuvor belegte xsl:variable ist).

                  Hier wird test.xml erhalten. Ansonsten muesste man rekursiv durch den gesamten String nach "" suchen und nach letzten den Rest auslesen.

                  Diese Info mit dem kompletten Pfad waere von Anfang an wichtig und hilfreich gewesen!

                  MfG, Thomas

                  1. Hi,

                    wow, das ich echt gut. So funktioniert es. Blos wäre es dynamisch besser, da der Pfad sich auch ändern wird.

                    Wäre es kompliziert, den gesamten String nach "" zu durchsuchen und nach dem letzten den Rest auszulesen? Ich denke das wäre die beste Lösung.
                    Könntest du dafür nochaml eine Zeile Code posten?

                    Wäre echt nett

                    Und vielen vielen Dank für deine Hilfe!

                    1. Hallo,

                      Wäre es kompliziert, den gesamten String nach "" zu durchsuchen und nach dem letzten den Rest auszulesen? Ich denke das wäre die beste Lösung.
                      Könntest du dafür nochaml eine Zeile Code posten?

                      Mit einer Zeile ist es hier nicht getan, aber hier gibt es solche Ansaetze: http://www.dpawson.co.uk/xsl/sect2/N7240.html#d7382e463.

                      MfG, Thomas

                      1. Juhuu, ich habs geschafft. Danke nochmal!