webentwicklung-frage-antwort-db.com.de

Wie kann ich XSLT in Chrom arbeiten lassen?

Ich habe ein XML-Dokument hier das mit einer entsprechenden XSL-Datei bedient wird. Die Umwandlung muss clientseitig ohne JavaScript ausgeführt werden.

Dies funktioniert gut in IE (Schock-Horror), aber in Google Chrome werden nur die Textknoten des Dokuments angezeigt.

Ich weiß, dass es möglich ist, clientseitige XSL in Chrome auszuführen, da ich Beispiele dafür gesehen habe, aber ich kann diesen Erfolg noch nicht selbst wiederholen

Was mache ich falsch?

79
Eric

Zum Zeitpunkt des Schreibens gab es einen Fehler in Chrome , der ein xmlns-Attribut erforderte, um das Rendern auszulösen:

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" ... >

Dies war das Problem, auf das ich beim Servieren der XML-Datei von einem Server gestoßen war.


Wenn Sie im Gegensatz zu mir [] die XML-Datei von einer file:///-URL anzeigen, sind die Lösungen, die --allow-file-access-from-files erwähnen, die gewünschten

14
Eric

Die andere Antwort von Eric ist falsch. Die Namensraumdeklaration, die er erwähnte, hatte nichts mit dem Problem zu tun.

Der wahre Grund, warum es nicht funktioniert, ist aus Sicherheitsgründen (vgl. Ausgabe 4197 , Ausgabe 111905 ).

Stellen Sie sich dieses Szenario vor:

  1. Sie erhalten eine E-Mail-Nachricht von einem Angreifer, der eine Webseite als Anhang enthält, die Sie herunterladen.

  2. Sie öffnen die jetzt-lokale Webseite in Ihrem Browser.

  3. Die lokale Webseite erstellt einen <iframe>, dessen Quelle https://mail.google.com/mail/ ist.

  4. Da Sie bei Google Mail angemeldet sind, lädt der Frame die Nachrichten in Ihren Posteingang.

  5. Die lokale Webseite liest den Inhalt des Frames mit JavaScript für den Zugriff auf frames[0].document.documentElement.innerHTML. (Eine Online-Webseite kann diesen Schritt nicht ausführen, da sie von einem nicht von Google Mail stammenden Origin stammen würde; die gleiche Origin-Richtlinie würde dazu führen, dass der Lesevorgang fehlschlägt.)

  6. Die lokale Webseite speichert den Inhalt Ihres Posteingangs in einen <textarea> und übermittelt die Daten über ein Formular POST an den Webserver des Angreifers. Jetzt hat der Angreifer Ihren Posteingang, was zum Spamming oder zur Erkennung von Diebstahl nützlich sein kann.

Chrome vereitelt das obige Szenario, indem Einschränkungen für lokale Dateien auferlegt werden, die mit Chrome geöffnet wurden. Um diese Einschränkungen zu überwinden, haben wir zwei Lösungen:

  1. Versuchen Sie, Chrome mit dem Flag --allow-file-access-from-files auszuführen. Ich habe dies nicht selbst getestet, aber wenn es funktioniert, ist Ihr System jetzt auch für Szenarien der oben genannten Art anfällig.

  2. Laden Sie es auf einen Host hoch und das Problem ist gelöst.

112
Pacerier

Ich hatte das gleiche Problem bei localhost. . Durch das Internet laufen, auf der Suche nach der Antwort, und ich stimme zu, dass das Hinzufügen von --allow-file-access-from-files funktioniert. Ich arbeite auf einem Mac, also musste ich für das Terminal Sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files das Passwort eingeben (falls vorhanden).

Eine weitere kleine Sache - nichts wird funktionieren, wenn Sie Ihrer .xml-Datei den Verweis auf Ihre .xsl-Datei wie folgt hinzufügen <?xml-stylesheet type="text/xsl" href="<path to file>"?>. Eine weitere kleine Sache, die mir nicht sofort klar wurde - Sie sollten Ihre XML-Datei im Browser öffnen, nicht die XLSL-Datei.

5
Setrino

Das auf Chrome basierende Problem betrifft nicht den xml-Namespace, der xmlns="http://www.w3.org/1999/xhtml" ist. Ohne das Namespace-Attribut funktioniert es auch nicht mit IE.

Aufgrund der Sicherheitsbeschränkung müssen Sie beim Start des Chrome das Flag --allow-file-access-from-files hinzufügen. Ich denke, Linux/* Nix-Benutzer können dies problemlos über das Terminal tun, aber für Windows-Benutzer müssen Sie die properties der Chrome-Verknüpfung öffnen und im Zielverzeichnis wie unten hinzufügen.

Rechtsklick -> Eigenschaften -> Ziel

 enter image description here

Hier ist ein Beispiel für einen vollständigen Pfad mit den Flags, die ich auf meinem Computer verwende.

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files

Ich hoffe, diese Schritt-für-Schritt-Anleitung wird Windows-Benutzern bei dem Problem helfen. Aus diesem Grund habe ich diesen Beitrag hinzugefügt.

4

Nun, es funktioniert nicht, wenn die XML-Datei (beginnend mit dem Standard-PI:

<?xml-stylesheet type="text/xsl" href="..."?>

zum Verweisen auf das XSL-Stylesheet) dient als "application/xml". In diesem Fall lädt Chrome zwar immer noch das referenzierte XSL-Stylesheet herunter, aber es wird nichts gerendert, da die Dokumenttypen von "application/xml" in "Document" (! ??) und "Text/xsl" in "" geändert werden. Stylesheet "(! ??) und versucht dann, das XML-Dokument als HTML-Dokument (5) zu rendern, ohne zuerst seinen XSLT-Prozessor auszuführen. Auf dem Bildschirm wird überhaupt nichts angezeigt (dessen Inhalt weiterhin die vorherige Seite anzeigt, von der aus die XML-Seite referenziert wurde) und das Symbol weiter dreht, als ob das Dokument nie vollständig geladen worden wäre.

Sie können die Chrome-Konsole perfekt verwenden, um anzuzeigen, dass alle Ressourcen geladen sind, aber falsch interpretiert werden.

Also ja, Chrome rendert derzeit nur XML-Dateien (mit seiner optionalen führenden XSL-Stylesheet-Deklaration), nur wenn sie als "text/xml" dient, jedoch nicht als "application/xml", wie es für clientseitig gerenderte XML-Dateien mit einem XSL-Erklärung.

Bei XML-Dateien, die als "text/xml" oder "application/xml" dienen und keine XSL-Stylesheet-Deklaration enthalten, sollte Chrome dennoch ein Standard-Stylesheet verwenden, um es als DOM-Baum oder zumindest als Textquelle darzustellen. Dies ist jedoch nicht der Fall, und hier wird erneut versucht, es als HTML darzustellen, und es werden sofort Fehler in vielen Skripts (einschließlich eines internen Standardskripts) angezeigt, die versuchen, auf "document.body" zuzugreifen, um onLoad-Ereignisse zu verarbeiten und Javascript einzuspielen Handler darin.

Ein Beispiel für eine Site, die nicht wie erwartet funktioniert (die allgemeine LISP-Dokumentation) in Chrome, jedoch in IE, die clientseitige XSLT-Unterstützung unterstützt:

http://common-LISP.net/project/bknr/static/lmman/toc.html

Diese Indexseite wird korrekt angezeigt, aber alle Links führen zu XML-Dokumenten mit einer grundlegenden XSL-Deklaration zu einem vorhandenen XSL-Stylesheet-Dokument. Sie können unbegrenzt warten, wenn Sie denken, dass die Kapitel Probleme beim Herunterladen haben. Sie können die Dokumentation nur lesen, indem Sie die Konsole öffnen und den Quellcode auf der Registerkarte Ressourcen lesen.

3
verdy_p

So weit ich weiß, sucht Chrome nach dem Header 

Inhaltstyp: Text/XML

Dann funktioniert es - andere Iterationen sind fehlgeschlagen.

Stellen Sie sicher, dass Ihr Webserver dies bereitstellt. Außerdem wird erläutert, warum es für file: // URI-XML-Dateien fehlschlägt.

2
John

Check http://www.aranedabienesraices.com.ar

Diese Site wurde mit XML/XSLT-Clientseiten erstellt. Es funktioniert auf IE6-7-8, FF, O, Safari und Chrome Senden Sie HTTP-Header richtig? Respektieren Sie die Origin-Richtlinie.

1
user357812

Was Eric sagt, ist richtig.

In der xsl haben für das xsl: stylesheet-Tag die folgenden Attribute

version = "1.0" xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" xmlns = "http://www.w3.org/1999/xhtml"

Es funktioniert gut in Chrom.

0
P Subramanian

Ich begann mit dem Testen und stieß auf die lokale Datei/Chrome-Sicherheitslücke. Eine sehr einfache Problemumgehung besteht darin, die XML- und XSL-Datei in einen öffentlichen Dropbox-Ordner zu legen und Links zu beiden Dateien zu erhalten. Fügen Sie den Link zur XSL-Transformation in den XML-Kopf ein. Verwenden Sie den XML-Link in Chrome UND ES FUNKTIONIERT! 

0
Mark Whitener

Ich habe versucht, die Datei unter wwwroot abzulegen. Wenn Sie also in Chrome auf die Seite zugreifen, ist dies die Adresse localhost/yourpage.xml .

0
MiddleKay

Nach 8 Jahren hat sich die Situation etwas verändert.

Ich kann keine neue Sitzung von Google Chrome ohne andere Parameter öffnen und das Schema "file:" zulassen.

Auf MacOS mache ich:

open -n -a "Google Chrome" --args \
    --disable-web-security \               # This disable all CORS and other security checks
    --user-data-dir=$HOME/fakeChromeDir    # This let you to force open a new Google Chrome session

Ohne diese Argumente kann ich das XSL-Stylesheet nicht lokal testen.

0
Matteo Gaggiano