Wie kann ich XSLT in Chrom arbeiten lassen?

86

Ich habe ein XML - Dokument hier , die mit einer entsprechenden serviert XSL - Datei . Die Transformation muss clientseitig ohne JavaScript ausgeführt werden.

Dies funktioniert in IE (Schockhorror) einwandfrei, in Google Chrome werden jedoch nur die Textknoten des Dokuments angezeigt.

Ich weiß, dass es möglich ist, clientseitiges XSL in Chrome auszuführen, wie ich Beispiele dafür gesehen habe, aber ich muss diesen Erfolg noch selbst replizieren

Was mache ich falsch?

Eric
quelle
Es wäre toll, die Lösung zu veröffentlichen, wenn Sie es wissen. Ich habe Chrome nicht wirklich für irgendetwas Ernstes verwendet - scheint mir ein Google-Spielzeug zu sein. Warum müssen Sie XSLT clientseitig ausführen?
Dimitre Novatchev
Ich nicht. Ich dachte nur, es wäre ein bisschen ordentlich. Und ich würde immer noch gerne wissen, warum einige Dinge in Chrome funktionieren, meine jedoch nicht. Oh, und für IE-Benutzer, entschuldigen Sie das grausame Regenbogen-Styling der Seite.
Eric
12
Für mich kann Chrome die Transformation nur durchführen, wenn das XML über http: // geöffnet wird. Es funktioniert nicht, wenn über file: // gearbeitet wird. Das xmlns-Attribut macht für mich keinen Unterschied.
Jaroslav Záruba
Dieser Fehler wird hier
Flavio Cysne
1
Der eigentliche Chrome-Fehler hierfür ist unter code.google.com/p/chromium/issues/detail?id=111905
Grant Peters

Antworten:

116

Die andere Antwort von Eric ist falsch. Die von ihm erwähnte Namespace-Deklaration hatte nichts mit dem Problem zu tun.

Der wahre Grund, warum es nicht funktioniert , sind Sicherheitsbedenken (vgl. Ausgabe 4197 , Ausgabe 111905 ).

Stellen Sie sich dieses Szenario vor:

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

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

  3. Die lokale Webseite erstellt eine, <iframe>deren 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 mithilfe von JavaScript für den Zugriff frames[0].document.documentElement.innerHTML. (Eine Online-Webseite kann diesen Schritt nicht ausführen, da er von einem Nicht-Google Mail-Ursprung stammt. Die Richtlinie für denselben Ursprung würde dazu führen, dass das Lesen fehlschlägt.)

  6. Die lokale Webseite platziert den Inhalt Ihres Posteingangs in einem <textarea>und sendet die Daten über ein Formular POST an den Webserver des Angreifers. Jetzt hat der Angreifer Ihren Posteingang , der zum Spammen oder Identifizieren von Diebstahl nützlich sein kann.

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

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

  2. Laden Sie es auf einen Host hoch und das Problem ist behoben.

Pacerier
quelle
2
Dies ist wahr, aber das war nicht die einzige Ursache des Problems. Ich verfolge den "Bug" -Report jetzt schon eine Weile. Ohne das xmlnsAttribut konnte ich es jedoch auch nicht serverseitig zum Laufen bringen. Dies könnte sich in neueren Versionen von Chrome geändert haben.
Eric
4
@ Eric ok, dies ist möglicherweise keine Antwort auf Ihr Problem, aber es ist die richtige Antwort auf Ihre Frage. Den Kommentaren der Besucher dieser Seite nach zu urteilen, können wir sehen, dass die als Antwort gekennzeichnete Antwort ihre Probleme nicht löst. (Warum sollten sie sonst die anderen 6 Antworten durchgehen müssen, um eine Lösung zu finden
?
4
@ Pacerier: Es ist nicht die richtige Antwort auf meine Frage. Meine Frage war, warum zwei auf meinem Server gehostete Dokumente nicht korrekt transformiert wurden. Das Sicherheitsproblem ist zwar wissenswert, für diese spezielle Frage jedoch nicht relevant.
Eric
1
@ Pacerier Danke, --allow-file-access-from-filesfunktioniert gut.
Ibn Saeed
Wie stelle ich das in macOS ein?
Pardeep Jain
15

Zum Zeitpunkt des Schreibens gab es einen Fehler in Chrome , für den ein xmlnsAttribut erforderlich war, um das Rendern auszulösen:

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

Dies war das Problem, auf das ich stieß, als ich die XML-Datei von einem Server aus bereitstellte .


Wenn Sie im Gegensatz zu mir die XML-Datei über eine file:///URL anzeigen , sind die genannten Lösungen --allow-file-access-from-filesdie gewünschten

Eric
quelle
2
Guter Fund! Hat einen Fehler dafür behoben.
Mohamed Mansour
1
@Peter: Das hängt von Ihrem Eingabedokument ab. Die XSLT-Spezifikation ist hier ziemlich klar und der IE ist einfach zu verzeihend. Wenn die Eingabe gültiges XHTML ist, hat sie eine Namespace-Deklaration. Damit XSLT irgendetwas in diesem Eingabedokument findet, müssen Sie den Namespace definieren. Es ist jedoch nicht erforderlich, den Standard-Namespace zu verwenden (aber am einfachsten).
Abel
10
@ Eric: Schau dir meine Antwort an, nichts für ungut, aber deine Antwort ist falsch.
Pacerier
4
Dies ist nicht die Antwort (noch die Lösung, und das "..." ist definitiv ein bisschen vage), Pacerier ist die richtige.
RedGlyph
Das ist falsch. diese Verzögerung nicht erforderlich. Es fragt nach Versionsnummern.
UDID
6

Ich hatte das gleiche Problem bei localhost. Wenn ich im Internet nach der Antwort suche, bin ich damit einverstanden, dass das Hinzufügen --allow-file-access-from-filesfunktioniert. Ich arbeite auf einem Mac, daher musste ich über das Terminal sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-filesIhr Passwort eingeben (falls Sie eines haben).

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

Setrino
quelle
6

Das Problem basiert auf Chrome ist nicht über den XML - Namespace , die ist xmlns="http://www.w3.org/1999/xhtml". Ohne das Attribut namesspace funktioniert es auch nicht mit dem Internet Explorer.

Aufgrund der Sicherheitsbeschränkung müssen Sie das --allow-file-access-from-filesFlag hinzufügen, wenn Sie das Chrome starten. Ich denke, Linux / * nix-Benutzer können dies einfach über das Terminal tun, aber für Windows-Benutzer müssen Sie die Eigenschaften der Chrome-Verknüpfung öffnen und wie folgt zum Ziel hinzufügen.

Klicken Sie mit der rechten Maustaste -> Eigenschaften -> Ziel

Geben Sie hier die Bildbeschreibung ein

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, dass das schrittweise Zeigen dieser Hilfe Windows-Benutzern bei dem Problem hilft. Deshalb habe ich diesen Beitrag hinzugefügt.

Levent Divilioglu
quelle
4

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

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

zur Referenzierung des XSL-Stylesheets) wird als "application / xml" bereitgestellt. In diesem Fall lädt Chrome weiterhin das referenzierte XSL-Stylesheet herunter, es wird jedoch nichts gerendert, da die Dokumenttypen stillschweigend von "application / xml" in "Document" (! ??) und "text / xsl" in "geändert werden. Stylesheet "(! ??) und versucht dann, das XML-Dokument so zu rendern, als wäre es ein HTML (5) -Dokument, ohne zuerst den XSLT-Prozessor auszuführen. Auf dem Bildschirm wird überhaupt nichts angezeigt (dessen Inhalt weiterhin die vorherige Seite anzeigt, auf die auf die XML-Seite verwiesen 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. Dies zeigt, dass alle Ressourcen geladen sind, aber falsch interpretiert werden.

Ja, Chrome rendert derzeit nur XML-Dateien (mit der optionalen führenden XSL-Stylesheet-Deklaration), nur wenn sie als "text / xml" bereitgestellt werden, nicht jedoch als "application / xml", wie dies für clientseitig gerendertes XML mit einem XSL-Deklaration.

Für XML-Dateien, die als "text / xml" oder "application / xml" dienen und keine XSL-Stylesheet-Deklaration enthalten, sollte Chrome weiterhin ein Standard-Stylesheet verwenden, um es als DOM-Baum oder zumindest als Textquelle zu rendern. Dies ist jedoch nicht der Fall, und auch hier wird erneut versucht, es so zu rendern, als wäre es HTML, und es treten sofort Fehler in vielen Skripten (einschließlich eines internen Skripts) auf, die versuchen, auf "document.body" zuzugreifen, um onLoad-Ereignisse zu behandeln und Javascript einzufügen Handler drin.

Ein Beispiel für eine Site, die in Chrome nicht wie erwartet funktioniert (Common Lisp-Dokumentation), aber in IE, das clientseitiges XSLT unterstützt:

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

Diese Indexseite oben 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, da die Kapitel Probleme beim Herunterladen haben. Alles, was Sie tun können, um die Dokumentation zu lesen, ist, die Konsole zu öffnen und den Quellcode auf der Registerkarte Ressourcen zu lesen.

verdy_p
quelle
3

So nah ich das beurteilen kann, 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 dies bei file: // URI-XML-Dateien fehlschlägt.

John
quelle
2

Überprüfen Sie http://www.aranedabienesraices.com.ar

Diese Site wurde clientseitig mit XML / XSLT erstellt. Es funktioniert unter IE6-7-8, FF, O, Safari und Chrome. Senden Sie HTTP-Header korrekt? Respektieren Sie die Politik der gleichen Herkunft?


quelle
Siehe meine Antwort , ich habe es gelöst. Chrome scheint ein xmlnsAttribut zu benötigen .
Eric
4
Das glaube ich nicht. Um die Umwandlung durchzuführen, muss Chrome den Standard-Namespace nicht auf XHTML-Namespace festlegen. Zum Rendern von XHTML ist natürlich XHTML erforderlich. Sie mischen Dinge.
Die oben genannte Site wurde nicht mit XML, sondern mit XHTML erstellt. Die beiden sind nicht ganz gleich (beide sind XML, aber einer ist auch HTML und der andere nicht).
Jerseyboy
1

Ich habe versucht, die Datei in die WWW-Wurzel zu legen . Wenn Sie also in Chrome auf die Seite zugreifen, ist dies die Adresse localhost / yourpage.xml .

MiddleKay
quelle
1

Was Eric sagt, ist richtig.

In xsl haben die Tags xsl: stylesheet 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.

P Subramanian
quelle
1

Ich habe mit dem Testen begonnen und bin auf das lokale Datei- / Chrome-Sicherheitsproblem gestoßen. Eine sehr einfache Problemumgehung besteht darin, die XML- und XSL-Datei beispielsweise in den öffentlichen Dropbox-Ordner zu legen und Links zu beiden Dateien abzurufen. Fügen Sie den Link zur XSL-Transformation in den XML-Kopf ein. Verwenden Sie den XML-Link in Chrome und es funktioniert!

Mark Whitener
quelle
1

Nach 8 Jahren ändert sich die Situation etwas.

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

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

Matteo Gaggiano
quelle