Como posso fazer o XSLT funcionar no chrome?
Tenho um documento XML aqui {[3] } que é servido com um ficheiro XSL correspondente . A transformação é deixada para ser executada do lado cliente, sem JavaScript.
isto funciona bem no IE (shock horror), mas no Google Chrome, apenas mostra 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 estou para ser capaz de replicar este sucesso eu mesmo
O que estou a fazer de errado?10 answers
A verdadeira razão pela qual não funciona é devido a preocupações de segurança (cf. questão 4197, edição 111905 ).
Imagine este cenário:
Você recebe uma mensagem de E-mail de um atacante contendo uma página web como um anexo, que você descarrega.
Você abre a página web agora-local na sua navegador.
A página web local cria um
<iframe>
cuja fonte é https://mail.google.com/mail/.Como você está conectado ao Gmail, a moldura carrega as mensagens em sua caixa de entrada.
A página web local lê o conteúdo da moldura usando JavaScript para acessar
frames[0].document.documentElement.innerHTML
. (Uma página web on-line não seria capaz de realizar este passo, porque viria de uma origem Não-Gmail; a mesma política de origem faria com que a leitura para falhar.)A página web local coloca o conteúdo da sua caixa de entrada em um
<textarea>
e submete os dados através de um formulário POST para o servidor web do atacante. Agora O atacante tem a sua caixa de entrada , que pode ser útil para spamming ou identificar roubo.
O cromado filtra o cenário acima por colocar restrições nos ficheiros locais abertos usando o Chrome. Para superar essas restrições, temos duas soluções:
Tente correr o cromo com o
--allow-file-access-from-files
bandeira. Eu não testei isso pessoalmente, mas se funcionar, seu sistema agora também será vulnerável a cenários do tipo mencionado acima.Envia-o para um servidor, e problema resolvido.
No momento da escrita, havia um bug no chrome que exigia um atributo xmlns
para despoletar a renderização:
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" ... >
Este era o problema em que eu estava a correr ao servir o ficheiro xml de um servidor.
Se ao contrário de mim, Você está vendo o arquivo xml a partir de um file:///
url , Então as soluções que mencionam --allow-file-access-from-files
são as que você quer
O problema baseado em Chrome não é sobre o espaço de nomes xml que é xmlns="http://www.w3.org/1999/xhtml"
. Sem o atributo namesspace, ele não vai funcionar com IE também.
Devido à restrição de segurança, você tem que adicionar a bandeira {[[2]} Quando você iniciar o cromado. Eu 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 Chrome e adicioná-lo no destino de destino como abaixo;
Botão Direito - > Propriedades - > Alvo
Aqui está um caminho cheio de amostras com as bandeiras que eu 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 vai ajudar os usuários do windows para o problema, é por isso que eu adicionei este post.
Bem, não funciona se o ficheiro XML (a começar pelo padrão PI:
<?xml-stylesheet type="text/xsl" href="..."?>
Para referenciar a folha de estilo XSL) é servido como"application/xml". Nesse caso, o Chrome ainda irá baixar a folha de estilo XSL referenciada, mas nada será renderizado, uma vez que irá alterar silenciosamente os tipos de documentos de "application/xml" para "Document" (!??) e "text / xsl" em "Stylesheet" (!??), e então vai tentar renderizar o documento XML como se fosse um documento HTML (5), sem executar primeiro o processador XSLT. E nada será exibido na tela (cujo conteúdo continuará a mostrar a página anterior da qual a página XML foi referenciada, e continuará girando o ícone, como se o documento nunca tivesse sido completamente carregado.
Você pode usar perfeitamente a consola Chrome, que mostra que todos os recursos estão carregados, mas eles são interpretados incorretamente.
Por isso, sim, o Chrome só desenha actualmente ficheiros XML (com a sua 'stylesheet' XSL ' opcional Declaração), apenas se for servido como" text/xml", mas não como" application/xml " como deveria ser para XML renderizado do lado do cliente com uma declaração XSL.
Para os ficheiros XML servidos como" text/xml "ou" application/xml "e que não contenham uma declaração de 'stylesheet' XSL, o Chrome deverá ainda usar uma 'stylesheet' predefinida para o tornar uma árvore DOM, ou pelo menos como a sua fonte de texto. Mas não é, e aqui novamente tenta rendê-lo como se fosse HTML, e bugs imediatamente em muitos scripts (incluindo um padrão interno 1) que tentam acessar ao " documento.corpo " para lidar com eventos onLoad e injetar algum tratador javascript nele.
Um exemplo de site que não funciona como esperado (a documentação comum Lisp) no Chrome, mas funciona no IE que suporta XSLT do lado do cliente:
Http://common-lisp.net/project/bknr/static/lmman/toc.html
Esta página de índice acima é apresentada correctamente, mas todas as ligações irão conduzir para os documentos XML com uma declaração XSL básica para um documento de stylesheet XSL existente, e você pode esperar indefinidamente, pensando que os capítulos têm problemas a serem baixados. Tudo o que você pode fazer para ler o docuemntation é abrir a consola e ler o código fonte na página Recursos.
O mais perto que posso dizer, o Chrome está à procura do cabeçalho
Content-Type: text / xml
Então funciona ... outras iterações falharam.Certifique-se que o seu servidor web está a fornecer isto. Ele também explica por que ele falha para arquivos XML file://URI.
Verifique http://www.aranedabienesraices.com.ar
Este site é construído com o lado cliente XML/XSLT. Funciona em IE6-7-8, FF, o, Safari e cromado. Está a enviar os cabeçalhos HTTP correctamente? Está a respeitar a mesma política de origem?
Tentei colocar o ficheiro na wwwroot . Assim, ao acessar a Página no Chrome, este é o endereço localhost / yourpage.xml .
No xsl, para o XSL:a marca 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 no cromado.