Como posso fazer o XSLT funcionar no Chrome?

88

Eu tenho um documento XML aqui que é servido com um arquivo XSL correspondente . A transformação deve ser executada no lado do cliente, sem JavaScript.

Isso funciona bem no IE (horror de choque), mas no Google Chrome, apenas exibe os nós de texto do documento.

Eu sei que é possível fazer XSL do lado do cliente no Chrome, como já vi exemplos disso, mas ainda não consegui reproduzir esse sucesso sozinho

O que estou fazendo errado?

Eric
fonte
Seria ótimo postar a solução, quando você souber disso. Eu realmente não usei o Chrome para nada sério - parece um brinquedo do Google para mim. Por que você precisa executar XSLT no lado do cliente?
Dimitre Novatchev
Eu não. Eu só pensei que seria legal. E ainda gostaria de saber por que algumas coisas funcionam no Chrome, mas a minha não. Ah, e para os usuários do Internet Explorer, desculpe pelo estilo de arco-íris atroz da página.
Eric
12
Para mim, o Chrome pode fazer a transformação apenas ao abrir o XML em http: //, não funciona ao trabalhar via file: //, o atributo xmlns não faz nenhuma diferença para mim.
Jaroslav Záruba
Este bug é mencionado aqui
Flavio Cysne 01 de
1
O bug real do Chrome para isso está em code.google.com/p/chromium/issues/detail?id=111905
Grant Peters

Respostas:

116

A outra resposta abaixo de Eric está errada. A declaração de namespace que ele mencionou não teve nada a ver com o problema.

O verdadeiro motivo pelo qual ele não funciona é devido a questões de segurança (cf. questão 4197 , questão 111905 ).

Imagine este cenário:

  1. Você recebe uma mensagem de email de um invasor contendo uma página da Web como um anexo, que você baixa.

  2. Você abre a página da web agora local em seu navegador.

  3. A página da web local cria um <iframe>cuja fonte é https://mail.google.com/mail/ .

  4. Como você está conectado ao Gmail, o frame carrega as mensagens na sua caixa de entrada.

  5. A página da web local lê o conteúdo do quadro usando JavaScript para acessá-lo frames[0].document.documentElement.innerHTML. (Uma página da web on-line não seria capaz de realizar esta etapa porque viria de uma origem diferente do Gmail; a política de mesma origem faria com que a leitura falhasse.)

  6. A página da web local coloca o conteúdo da sua caixa de entrada em um <textarea>e envia os dados por meio de um formulário POST para o servidor da web do invasor. Agora o invasor tem sua caixa de entrada , o que pode ser útil para enviar spam ou roubo de identidade.

O Chrome elimina o cenário acima, colocando restrições em arquivos locais abertos usando o Chrome. Para superar essas restrições, temos duas soluções:

  1. Tente executar o Chrome com a --allow-file-access-from-files bandeira. Eu não testei isso sozinho, mas se funcionar, seu sistema agora também estará vulnerável a cenários do tipo mencionado acima.

  2. Faça o upload para um host e o problema será resolvido.

Pacerier
fonte
2
Isso é verdade, porém essa não foi a única causa do problema. Eu tenho acompanhado o relatório de "bug" por um tempo. No entanto, também não consegui fazê-lo funcionar no lado do servidor sem o xmlnsatributo. Isso pode ter mudado nas versões mais recentes do Chrome.
Eric
4
@Eric ok, esta pode não ser uma resposta para o seu problema, mas é a resposta correta para a sua pergunta. a julgar pelos comentários dos visitantes desta página, podemos verificar que a resposta que foi assinalada não está a resolver os seus problemas. (caso contrário, por que eles teriam que percorrer as outras 6 respostas para encontrar uma solução)
Pacerier
4
@Pacerier: Não é a resposta correta à minha pergunta. Minha pergunta era sobre por que um par de documentos hospedados em meu servidor não estava sendo transformado corretamente. O problema de segurança, embora valha a pena conhecer, não é relevante para esta questão em particular.
Eric
1
@Pacerier Obrigado, --allow-file-access-from-filesfunciona bem.
Ibn Saeed de
1
As restrições do Chrome no arquivo: // são completamente estúpidas e os desenvolvedores são muito preguiçosos para implementar a política de mesma origem da maneira certa (como o Firefox faz) E isso é uma pena, porque o Chrome é o navegador do meu dia a dia.
novembro de
14

No momento em que este artigo foi escrito, havia um bug no cromo que exigia um xmlnsatributo para acionar a renderização:

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

Este era o problema que eu estava enfrentando ao servir o arquivo xml de um servidor .


Se, ao contrário de mim, você está visualizando o arquivo xml de uma file:///url , então as soluções mencionadas --allow-file-access-from-filessão as que você deseja

Eric
fonte
2
Bom achado! Preenchido um bug para isso.
Mohamed Mansour
1
@Peter: depende do seu documento de entrada. A especificação XSLT é bem clara aqui e o IE é muito tolerante. Se a entrada for XHTML válida, ela terá uma declaração de namespace. Para que o XSLT localize qualquer coisa nesse documento de entrada, você deve definir o namespace. No entanto, não é necessário usar o namespace padrão (mas é o mais fácil).
Abel de
10
@Eric: dê uma olhada na minha resposta, sem ofensa, mas sua resposta está errada.
Pacerier
4
Esta não é a resposta (nem a solução, e o "..." é definitivamente um pouco vago), o Pacerier é o correto.
RedGlyph
Isso está incorreto. não exigiu essa desaceleração. Está pedindo números de versão.
UDID de
7

O problema baseado no Chrome não é sobre o namespace xml que é xmlns="http://www.w3.org/1999/xhtml". Sem o atributo namesspace, ele também não funcionará com o IE.

Por causa da restrição de segurança, você deve adicionar o --allow-file-access-from-filessinalizador ao iniciar o cromo. Acho que os usuários do linux / * nix podem fazer isso facilmente através do terminal, mas para os usuários do Windows, você tem que abrir as propriedades do atalho do Chrome e adicioná-lo no destino de destino como abaixo;

Clique com o botão direito -> Propriedades -> Destino

insira a descrição da imagem aqui

Aqui está um exemplo de caminho completo com os sinalizadores que uso na minha máquina;

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

Espero que mostrar este passo a passo ajude os usuários do Windows para o problema, é por isso que adicionei este post.

Levent Divilioglu
fonte
6

Eu tive o mesmo problema no localhost. Percorrendo a Internet procurando a resposta e aprovo que a adição --allow-file-access-from-filesfuncione. Eu trabalho no Mac, então para mim eu tive que passar pelo terminal sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-filese digitar sua senha (se você tiver uma).

Outra coisa pequena - nada funcionará a menos que você adicione ao seu arquivo .xml a referência ao seu arquivo .xsl como segue <?xml-stylesheet type="text/xsl" href="<path to file>"?>. Outra pequena coisa que não percebi imediatamente - você deve abrir seu arquivo .xml no navegador, não o .xsl.

Setrino
fonte
4

Bem, isso não funciona se o arquivo XML (começando pelo PI padrão:

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

para referenciar a folha de estilo XSL) é servido como "application / xml". Nesse caso, o Chrome ainda fará o download da folha de estilo XSL referenciada, mas nada será renderizado, já que mudará silenciosamente os tipos de documento de "application / xml" para "Document" (! ??) e "text / xsl" para " Folha de estilo "(! ??) e, em seguida, tentará renderizar o documento XML como se fosse um documento HTML (5), sem executar primeiro seu processador XSLT. E nada será exibido na tela (cujo conteúdo continuará mostrando a página anterior a partir da qual a página XML foi referenciada, e continuará girando o ícone, como se o documento nunca tivesse sido totalmente carregado.

Você pode perfeitamente usar o console do Chrome, que mostra que todos os recursos estão carregados, mas são interpretados incorretamente.

Portanto, sim, o Chrome atualmente só renderiza arquivos XML (com sua declaração de folha de estilo XSL opcional), apenas se for servido como "text / xml", mas não como "application / xml" como deveria para XML renderizado do lado do cliente com um Declaração XSL.

Para arquivos XML servidos como "text / xml" ou "application / xml" e que não contêm uma declaração de folha de estilo XSL, o Chrome ainda deve usar uma folha de estilo padrão para renderizá-la como uma árvore DOM, ou pelo menos como sua fonte de texto. Mas isso não acontece, e aqui novamente ele tenta renderizá-lo como se fosse HTML, e bugs imediatamente em muitos scripts (incluindo um interno padrão) que tentam acessar "document.body" para manipular eventos onLoad e injetar algum javascript manipulador nele.

Um exemplo de site que não funciona conforme o esperado (a documentação Common Lisp) no Chrome, mas funciona no IE que oferece suporte a XSLT do lado do cliente:

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

Esta página de índice acima é exibida corretamente, mas todos os links direcionarão para documentos XML com uma declaração XSL básica para um documento de folha de estilo XSL existente, e você pode esperar indefinidamente, pensando que os capítulos têm problemas para serem baixados. Tudo que você pode fazer para ler a documentação é abrir o console e ler o código-fonte na guia Recursos.

verdy_p
fonte
3

Tanto quanto posso dizer, o Chrome está procurando pelo cabeçalho

Tipo de conteúdo: text / xml

Então ele funciona --- outras iterações falharam.

Certifique-se de que seu servidor da web esteja fornecendo isso. Também explica por que falha para arquivos xml file: // URI.

John
fonte
2

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

Este site é construído com XML / XSLT do lado do cliente. Funciona no IE6-7-8, FF, O, Safari e Chrome. Você está enviando cabeçalhos HTTP corretamente? Você está respeitando a política de mesma origem?


fonte
Veja minha resposta , eu resolvi. O Chrome parece exigir um xmlnsatributo.
Eric
4
Acho que não. Para realizar a transformação, o Chrome não precisa definir o namespace padrão para o namespace XHTML. Para renderizar XHTML, é necessário um XHTML adequado, é claro. Você está misturando coisas.
O site referenciado acima não é construído com XML, mas com XHTML. Os dois não são exatamente iguais (ambos são XML, mas um também é HTML e o outro não).
jerseyboy
1

Tentei colocar o arquivo no wwwroot . Portanto, ao acessar a página no Chrome, este é o endereço localhost / yourpage.xml .

MiddleKay
fonte
1

O que Eric diz está correto.

No xsl, para a tag xsl: stylesheet tem os seguintes atributos

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

Funciona bem em cromo.

P Subramanian
fonte
1

Comecei a testar isso e encontrei o arquivo local / problema de segurança do Chrome. Uma solução muito simples é colocar o arquivo XML e XSL em, digamos, a pasta pública do Dropbox e obter links para ambos os arquivos. Coloque o link para a transformação XSL no cabeçalho XML. Use o link XML no Chrome E FUNCIONA!

Mark Whitener
fonte
1

Após 8 anos, a situação mudou um pouco.

Não consigo abrir uma nova sessão do Google Chrome sem outros parâmetros e permitir o esquema 'arquivo:'.

No macOS eu faço:

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

Sem esses argumentos, não consigo testar a folha de estilo XSL no local.

Matteo Gaggiano
fonte