如何使XSLT在Chrome中工作?

我在这里有一个XML文档,与相应的XSL文件一起提供 。 转换留在客户端执行,没有JavaScript。

这在IE(惊悚恐怖)中运行正常,但在Google Chrome中,只显示文档的文本节点。

我知道可以在Chrome中做客户端的XSL,就像我见过的例子一样,但是我还没有能够自己复制这个成功

我究竟做错了什么?

埃里克下面的其他答案是错误的。 他提到的命名空间声明与该问题无关。

它不起作用的真正原因是由于安全问题 (参考问题4197 , 问题111905 )。

想象一下这个场景:

  1. 您收到来自攻击者的电子邮件,其中包含网页作为附件,您可以下载。

  2. 您可以在浏览器中打开当前的本地网页。

  3. 本地网页创build一个源代码为https://mail.google.com/mail/的;<iframe>

  4. 由于您已login到Gmail,框架会将邮件加载到收件箱中。

  5. 本地网页通过使用JavaScript访问frames[0].document.documentElement.innerHTML来读取框架的内容。 (在线网页将无法执行此步骤,因为它来自非Gmail来源;同源策略会导致读取失败。)

  6. 本地网页将收件箱中的内容放入<textarea>并通过表单POST将数据提交给攻击者的Web服务器。 现在攻击者拥有你的收件箱 ,这可能对发送垃圾邮件或识别盗窃有用。

Chrome通过使用Chrome打开的本地文件施加限制来阻止上述情况。 为了克服这些限制,我们有两个解决scheme:

  1. 尝试使用--allow-file-access-from-files标志运行Chrome。 我没有亲自testing过,但是如果它能正常工作,那么你的系统现在也会受到上面提到的情况的影响。

  2. 上传到主机,并解决问题。

在写这篇文章的时候, 在chrome中有一个错误,它需要一个xmlns属性才能触发渲染:

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

这是从服务器提供XML文件时遇到的问题。


如果不像我,你正在从一个file:/// url查看XML文件,那么解决scheme提到--allow-file-access-from-files是你想要的

我在本地主机上有同样的问题。 在互联网上运行,寻找答案,我同意添加--allow-file-access-from-files工程。 我在Mac上工作,所以对我来说,我必须通过terminalsudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files并input您的密码(如果您有一)。

另一个小东西 – 没有任何工作,除非你添加到.xml文件的引用到你的.xsl文件如下<?xml-stylesheet type="text/xsl" href="<path to file>"?> 。 另一个我没有立即意识到的小问题 – 你应该在浏览器中打开你的.xml文件,而不是.xsl。

基于Chrome的问题不在于xml命名空间xmlns="http://www.w3.org/1999/xhtml" 。 如果没有namesspace属性,IE也无法使用。

由于安全限制,当您启动chrome时,必须添加--allow-file-access-from-files标志。 我认为linux / * nix用户可以通过terminal轻松完成,但对于Windows用户,您必须打开Chrome快捷方式属性并将其添加到目标目标中,如下所示:

右键单击 – >属性 – >目标

在这里输入图像说明

这里是我在我的机器上使用的标志的示例完整path;

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

我希望这个循序渐进的步骤能够帮助windows用户解决这个问题,这就是为什么我添加了这个post。

那么它不起作用,如果XML文件(由标准的PI:

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

用于引用XSL样式表)作为“application / xml”提供。 在这种情况下,Chrome浏览器仍然会下载引用的XSL样式表,但是没有任何东西会被渲染,因为它会默默地将文档types从“application / xml”改成“Document”(!??)和“text / xsl”样式表“(!??),然后将尝试呈现XML文档,就像它是一个HTML(5)文档,而不运行其XSLT处理器。 屏幕上将不显示任何内容(其内容将继续显示引用XML页面的上一页,并将继续旋转图标,就像文档从未完全加载一样。

您可以完美地使用Chrome控制台,该控制台显示所有资源都已加载,但它们被错误地解释。

所以,是的,Chrome目前只在呈现XML文件的时候(使用其可选的前导XSL样式表声明),只有当它作为“text / xml”而不是“application / xml” XSL声明。

对于用作“text / xml”或“application / xml”且不包含XSL样式表声明的XML文件,Chrome仍应使用默认样式表将其呈现为DOM树,或至less将其作为文本源。 但是它并没有,并且在这里再次尝试渲染它,就好像它是HTML,并且立即在许多脚本(包括默认的内部脚本)上尝试访问“document.body”来处理onLoad事件并注入一些javascript在它的处理程序。

在Chrome浏览器中无法按预期工作的网站示例(Common Lisp文档),但是可以在支持客户端XSLT的IE中使用:

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

上面的索引页面显示正确,但是所有链接都将通过对现有XSL样式表文档的基本XSL声明驱动到XML文档,并且您可以无限期地等待,并认为章节有问题需要下载。 您只需打开控制台并在“资源”选项卡中阅读源代码即可阅读文档。

检查http://www.aranedabienesraices.com.ar

这个网站是用XML / XSLT客户端构build的。 它适用于IE6-7-8,FF,O,Safari和Chrome。 您是否正确发送HTTP标头? 你是否尊重同源政策?

就我所知,Chrome正在寻找标题

Content-Type:text / xml

然后,它的作品—其他迭代失败。

确保你的web服务器正在提供这个。 这也解释了为什么文件:/ / URI URI文件失败。

我试图把文件放在wwwroot中 。 所以当在Chrome中访问页面时,这是地址localhost / yourpage.xml

埃里克说的是正确的。

在xsl中,对于xsl:stylesheet标记具有以下属性

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

它在铬中工作正常。

我开始testing,并遇到本地文件/ Chrome安全问题。 一个非常简单的解决方法是将XML和XSL文件放在Dropbox公用文件夹中,并获取到这两个文件的链接。 将链接放到XML头部的XSL转换中。 在Chrome中使用XML链接