Jenny Eggers: JavaScript Variable in XSL übergeben

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.

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

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

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

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

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

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

              1. Hi,

                das habe ich gemacht. Wenn ich jetzt die html aufrufe, sehe ich nur ein weißes Bild im Browser.

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

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

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

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

  3. 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?