如何让XSLT在chrome中运行?

Eri*_*ric 82 xslt google-chrome

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

这在IE(冲击恐怖)中运行良好,但在谷歌浏览器中,只显示文档的文本节点.

我知道可以在Chrome中进行客户端XSL,因为我已经看过它的例子,但我还是能够自己复制这个成功

我究竟做错了什么?

Pac*_*ier 113

埃里克的另一个答案是错误的.他提到的名称空间声明与问题无关.

它不起作用的真正原因是出于安全考虑(参见问题4197,问题111905).

想象一下这种情况:

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

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

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

  4. 由于您已登录Gmail,因此框架会在收件箱中加载邮件.

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

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

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

  1. 尝试使用--allow-file-access-from-files 旗帜运行Chrome .我自己没有对此进行过测试,但如果它能够正常工作,那么您的系统现在也容易受到上述类型的影响.

  2. 将其上传到主机,问题解决了.

  • @Eric确定这可能不是您问题的答案,但它是您问题的正确答案.根据访问者对此页面的评论判断,我们可以看到已经标记为答案的答案并未解决他们的问题.(否则他们为什么要通过其他6个答案来寻找解决方案) (4认同)
  • @Pacerier:这不是我问题的正确答案.我的问题是询问为什么托管在我服务器上的一对文件没有被正确转换.安全问题虽然值得了解,但与此特定问题无关. (4认同)
  • `--allow-file-access-from-files`对我有用,谢谢! (3认同)
  • 这是事实,但这不是问题的唯一原因.我一直在关注["bug"报告](http://code.google.com/p/chromium/issues/detail?id=70088)一段时间了.但是,如果没有`xmlns`属性,我无法让它在服务器端工作.这可能在较新版本的chrome中有所改变. (2认同)
  • Chrome 对 file:// 的限制简直是愚蠢的,开发人员懒得以正确的方式实现同​​源策略(就像 Firefox 那样),这很遗憾,因为 Chrome 是我每天使用的浏览器。 (2认同)

Eri*_*ric 14

在撰写本文时,chrome中存在一个错误,需要一个xmlns属性才能触发渲染:

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" ... >
Run Code Online (Sandbox Code Playgroud)

这是我从服务器提供xml文件时遇到的问题.


如果不像我,您正在file:///URL查看xml文件,那么提到的解决方案--allow-file-access-from-files就是您想要的

  • -1:不正确,你不需要那个声明 (15认同)
  • @Eric:看看我的回答,没有冒犯,但你的回答是错误的. (10认同)
  • 这不是答案(也不是解决方案,"......"肯定有点模糊),Pacerier是正确的. (4认同)
  • 很好找!为此填写了一个错误. (2认同)

Lev*_*glu 8

基于问题的Chrome并非是对XML命名空间xmlns="http://www.w3.org/1999/xhtml"。如果没有命名空间属性,它也不能与 IE 一起使用。

由于安全限制,您必须--allow-file-access-from-files在启动 chrome 时添加标志。我认为Linux的/ * nix的用户可以通过终端,但对于Windows用户做到这一点很容易,你必须打开属性中的Chrome浏览器快捷方式,并在目标位置,如下添加它;

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

在此处输入图片说明

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

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

我希望逐步展示这将帮助 Windows 用户解决问题,这就是我添加这篇文章的原因。


ver*_*y_p 7

好吧,如果 XML 文件(从标准 PI 开始:

<?xml-stylesheet type="text/xsl" href="..."?>
Run Code Online (Sandbox Code Playgroud)

用于引用 XSL 样式表)作为“application/xml”。在这种情况下,Chrome 仍会下载引用的 XSL 样式表,但不会呈现任何内容,因为它会默默地将文档类型从“application/xml”更改为“Document”(!??)并将“text/xsl”更改为“样式表”(!??),然后将尝试将 XML 文档呈现为 HTML(5) 文档,而不首先运行其 XSLT 处理器。屏幕上什么也不会显示(其内容将继续显示引用 XML 页面的前一个页面,并将继续旋转图标,就好像文档从未完全加载过一样。

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

所以是的,Chrome 目前只呈现 XML 文件(带有可选的前导 XSL 样式表声明),仅当它作为“text/xml”提供时,而不是作为“application/xml”,因为它应该为客户端呈现的 XML 提供XSL 声明。

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

在 Chrome 中无法按预期工作的站点示例(Common Lisp 文档),但在支持客户端 XSLT 的 IE 中工作:

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

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


Set*_*ino 5

我在localhost上遇到了同样的问题.在互联网上寻找答案,我赞成添加--allow-file-access-from-files作品.我在Mac上工作,所以对我来说,我必须通过终端sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files输入你的密码(如果有的话).

另一个小问题 - 除非你在.xml文件中添加对你的.xsl文件的引用,否则什么都不会有效<?xml-stylesheet type="text/xsl" href="<path to file>"?>.我没有立即意识到的另一件小事 - 您应该在浏览器中打开.xml文件,而不是.xsl.