Hinzufügen von Javascript zu einer XML-Datei, die mit XSLT mit einem Greasemonkey-Skript transformiert wurde

Wie folgt meine Frage hier – wie man eine XML-Datei mit XSLT verwandelt, mit einem Greasemonkey-Skript? – Ich stehe vor einem anderen Problem:

Ich möchte einige grundlegende Javascript-Funktionen in meiner XSL-Vorlage verwenden, um die Anzeige von einigen divs zu steuern. Allerdings, egal wie ich diese Javascript-Funktionen enthalten, scheinen sie nicht zu erkennen. Ich habe schon viel untersucht, aber ich kann es nicht scheinen.

  • Wie ändere ich einen Dateinamen auf-Download mit Javascript?
  • Injizieren von JS-Funktionen in die Seite aus einem Greasemonkey-Skript auf Chrome
  • Klicken Sie auf diese Google Translate-Schaltfläche nicht?
  • Javascript cloneNode mit Ereignissen
  • So öffnen Sie eine Liste von Seiten automatisch und sequentiell?
  • Zeigen Sie eine Nachricht mit waitForKeyElements an, jedes Mal, wenn eine Klasse dem Element hinzugefügt wird
  • Ich habe versucht 2 Dinge:

    • Hinzufügen des Javascript in der XSL-Vorlage in einem <script> -Tag
    • Anhängen eines neuen <script> -Tags im Greasemonkey-Skript selbst

    Ich würde es vorziehen, jQuery oder eine externe JS-Datei (die ich auch versuchte) zu benutzen, um es so einfach wie möglich zu halten, aber wenn das das Problem lösen würde, bin ich offen, das Ganze zu ändern!

    In jedem Fall, wenn ich die Funktion anrufe, bekomme ich einen ReferenceError: x is not defined . Ich sehe, dass die Javascript-Code sitzt gut in der letzten HTML-Ergebnis though. Wenn ich Firebug benutze, um ein neues <script> -Tag mit einer einfachen Funktion anzufügen, die "hallo" auf eine einfache HTML-Seite hinweist, dann funktioniert es perfekt. Es ist nur, wenn dies auf einer XSLT-Transformation getan wird, geht es falsch (um der Einfachheit halber bin ich nur mit einer einfachen Funktion, um eine Warnbox zu zeigen).

    Hier sind meine Beispieldaten:

      <?xml version="1.0" encoding="utf-8"?> <Results> <Result> <Listings total="2"> <Res> <Result index="0"> <id>123456</id> <name>My Business</name> <category>Restaurants</category> <phone>9872365</phone> </Result> </Res> <Res> <Result index="1"> <id>876553</id> <name>Some Other Business</name> <category>Restaurants</category> <phone>9834756</phone> </Result> </Res> </Listings> </Result> </Results> 

    Hier ist der erste Versuch, wo ich gerade ein <script> -Tag im <head> -Tag hinzugefügt habe:

     // ==UserScript== // @name _Test XML Renderer // @description stylesheet for xml results // @include * // @grant none // ==/UserScript== var xsl_str = '<?xml version="1.0" encoding="utf-8"?>\n\ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">\n\ <xsl:output method="html"/>\n\ <xsl:template match="/">\n\ <html>\n\ <head><script type="text/javascript">function hello() {alert("hello")};</script></head>\n\ <body>\n\ <table id="results" border="1" cellspacing="0" cellpadding="0">\n\ <thead>\n\ <tr>\n\ <th class="name">id</th>\n\ <th class="name">category ID</th>\n\ <th class="name">name</th>\n\ <th class="name">phone</th>\n\ </tr>\n\ </thead>\n\ <tbody>\n\ <xsl:for-each select="Results/Result/Listings/Res">\n\ <tr>\n\ <td class="small" width="120">\n\ <a href="#" onclick="hello()"><xsl:value-of select="Result/id"/></a>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/category"/>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/name"/>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/phone"/>\n\ </td>\n\ </tr>\n\ </xsl:for-each>\n\ </tbody>\n\ </table>\n\ </body>\n\ </html>\n\ </xsl:template>\n\ </xsl:stylesheet>\n\ '; var processor = new XSLTProcessor (); var dataXSL = new DOMParser ().parseFromString (xsl_str, "text/xml"); processor.importStylesheet (dataXSL); var newDoc = processor.transformToDocument (document); //-- These next lines swap the new, processed doc in for the old one... window.content = newDoc; document.replaceChild ( document.importNode (newDoc.documentElement, true), document.documentElement ); 

    Hier ist mein anderer Versuch, wo ich die "Hallo" -Funktion außerhalb der XSL-Vorlage hinzufüge:

     // ==UserScript== // @name _Test XML Renderer // @description stylesheet for xml results // @include * // @grant none // ==/UserScript== var xsl_str = '<?xml version="1.0" encoding="utf-8"?>\n\ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">\n\ <xsl:output method="html"/>\n\ <xsl:template match="/">\n\ <html>\n\ <head></head>\n\ <body>\n\ <table id="results" border="1" cellspacing="0" cellpadding="0">\n\ <thead>\n\ <tr>\n\ <th class="name">id</th>\n\ <th class="name">category ID</th>\n\ <th class="name">name</th>\n\ <th class="name">phone</th>\n\ </tr>\n\ </thead>\n\ <tbody>\n\ <xsl:for-each select="Results/Result/Listings/Res">\n\ <tr>\n\ <td class="small" width="120">\n\ <a href="#" onclick="hello()"><xsl:value-of select="Result/id"/></a>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/category"/>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/name"/>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/phone"/>\n\ </td>\n\ </tr>\n\ </xsl:for-each>\n\ </tbody>\n\ </table>\n\ </body>\n\ </html>\n\ </xsl:template>\n\ </xsl:stylesheet>\n\ '; var processor = new XSLTProcessor (); var dataXSL = new DOMParser ().parseFromString (xsl_str, "text/xml"); processor.importStylesheet (dataXSL); var newDoc = processor.transformToDocument (document); var script = "function hello() {alert('hello')};"; var newElem = newDoc.createElement('script'); newElem.type = 'text/javascript'; newElem.appendChild(newDoc.createTextNode(script)); newDoc.getElementsByTagName('head').item(0).appendChild(newElem); //-- These next lines swap the new, processed doc in for the old one... window.content = newDoc; document.replaceChild ( document.importNode (newDoc.documentElement, true), document.documentElement ); 

  • Wie benutzt man versteckte iframe Verbindung zum Server in GreaseMonky
  • "Normal" -Tastenklick-Ansätze funktionieren nicht im Greasemonkey-Skript?
  • Warum nicht document.addEventListener ('load', function) Arbeit in einem greasemonkey Skript?
  • Injizieren von JS-Funktionen in die Seite aus einem Greasemonkey-Skript auf Chrome
  • Wie kann ich besuchte und nicht besuchte Links auf einer Seite erkennen?
  • Deaktivieren der Fokus-Checking-Funktion einer Seite mit GM [Duplizieren]
  • One Solution collect form web for “Hinzufügen von Javascript zu einer XML-Datei, die mit XSLT mit einem Greasemonkey-Skript transformiert wurde”

    Verwenden Sie nicht onclick . Dies geht dreifach für Usercripts, da es zusätzliche Umfangs- und / oder Sandbox-Konflikte gibt.

    Auch ist es eine schlechte Idee zu versuchen und fügen Sie JS in die XSLT-Datei / Text, und es gibt keine Notwendigkeit für Skript-Injektion in diesem Fall entweder.

    Verwenden Sie das Skript zu tun, was JS Manipulation Sie im Sinn haben. Beispielsweise:

     // ==UserScript== // @name _XML Renderer with javascript functionality // @description Stylesheet and javascript for xml results // @include http://YOUR_SERVER.COM/YOUR_PATH/*.xml // @resource xslFile Q_17998446_transform.xsl // @grant GM_getResourceText // ==/UserScript== var xsl_str = GM_getResourceText ("xslFile"); var processor = new XSLTProcessor (); var dataXSL = new DOMParser ().parseFromString (xsl_str, "text/xml"); processor.importStylesheet (dataXSL); var newDoc = processor.transformToDocument (document); //-- These next lines swap the new, processed doc in for the old one... window.content = newDoc; document.replaceChild ( document.importNode (newDoc.documentElement, true), document.documentElement ); //-- Use JS to smarten-up the new document. var firstCols = document.querySelectorAll ("#results td:first-child"); for (var J = firstCols.length - 1; J >= 0; --J) { var tdNode = firstCols[J]; tdNode.style.cursor = "pointer"; tdNode.addEventListener ("click", clickCellHandler, false); } function clickCellHandler (zEvent) { var cellContents = zEvent.target.textContent.trim (); alert ('The clicked cell contains "' + cellContents + '".'); } 

    Q_17998446_transform.xsl eine Datei ist, die im selben Ordner Q_17998446_transform.xsl ist, von wo aus Sie Ihr Skript installieren (Sie müssen das Skript deinstallieren und neu installieren).

    Q_17998446_transform.xsl enthält das genau:

     <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/> <xsl:template match="/"> <html> <head></head> <body> <table id="results" border="1" cellspacing="0" cellpadding="0"> <thead> <tr> <th class="name">id</th> <th class="name">category ID</th> <th class="name">name</th> <th class="name">phone</th> </tr> </thead> <tbody> <xsl:for-each select="Results/Result/Listings/Res"> <tr> <td class="small" width="120"> <xsl:value-of select="Result/id"/> </td> <td class="small" width="120"> <xsl:value-of select="Result/category"/> </td> <td class="small" width="120"> <xsl:value-of select="Result/name"/> </td> <td class="small" width="120"> <xsl:value-of select="Result/phone"/> </td> </tr> </xsl:for-each> </tbody> </table> </body> </html> </xsl:template> </xsl:stylesheet> 


    Wenn Sie dieses Skript auf der entsprechenden XML-Datei ausführen, fügt es einen Klick-Handler zur ersten Tabellenspalte (sans header) hinzu – der "Web 2.0" Weg.

    Wenn eine der ersten Spaltenzellen angeklickt wird, warnt sie beispielsweise:

    Die angeklickte Zelle enthält "876553".

    Lassen Sie uns Javascript Schönheit und nützlich machen.