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?
xslt
google-chrome
Eric
fonte
fonte
Respostas:
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:
Você recebe uma mensagem de email de um invasor contendo uma página da Web como um anexo, que você baixa.
Você abre a página da web agora local em seu navegador.
A página da web local cria um
<iframe>
cuja fonte é https://mail.google.com/mail/ .Como você está conectado ao Gmail, o frame carrega as mensagens na sua caixa de entrada.
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.)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:
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.Faça o upload para um host e o problema será resolvido.
fonte
xmlns
atributo. Isso pode ter mudado nas versões mais recentes do Chrome.--allow-file-access-from-files
funciona bem.No momento em que este artigo foi escrito, havia um bug no cromo que exigia um
xmlns
atributo 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-files
são as que você desejafonte
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-files
sinalizador 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
Aqui está um exemplo de caminho completo com os sinalizadores que uso na minha máquina;
Espero que mostrar este passo a passo ajude os usuários do Windows para o problema, é por isso que adicionei este post.
fonte
Eu tive o mesmo problema no localhost. Percorrendo a Internet procurando a resposta e aprovo que a adição
--allow-file-access-from-files
funcione. Eu trabalho no Mac, então para mim eu tive que passar pelo terminalsudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files
e 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.fonte
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.
fonte
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.
fonte
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
xmlns
atributo.Tentei colocar o arquivo no wwwroot . Portanto, ao acessar a página no Chrome, este é o endereço localhost / yourpage.xml .
fonte
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.
fonte
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!
fonte
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:
Sem esses argumentos, não consigo testar a folha de estilo XSL no local.
fonte