我这里有一个XML文档,该文档带有相应的XSL文件。转换留给客户端执行,无需JavaScript。
在IE(令人震惊的恐怖)中,此方法工作正常,但在Google Chrome中,仅显示文档的文本节点。
我知道可以在Chrome中执行客户端XSL,正如我所看到的例子一样,但是我还无法自己复制这种成功。
我究竟做错了什么?
Answers:
埃里克(Eric)下面的另一个答案是错误的。他提到的名称空间声明与该问题无关。
它不起作用的真正原因是出于安全考虑(请参阅问题4197,问题111905)。
想象一下这种情况:
您会收到来自攻击者的电子邮件,其中包含作为附件下载的网页。
您在浏览器中打开现在本地的网页。
本地网页会创建<iframe>
其来源为https://mail.google.com/mail/。
由于您已登录Gmail,因此该框架会将邮件加载到收件箱中。
本地网页使用JavaScript访问读取框架的内容frames[0].document.documentElement.innerHTML
。(在线网页将无法执行此步骤,因为它来自非Gmail来源;同源策略将导致读取失败。)
本地网页将收件箱中的内容放入,<textarea>
然后通过POST表单将数据提交到攻击者的Web服务器。现在,攻击者有了您的收件箱,这对于垃圾邮件发送或识别盗窃很有用。
Chrome通过限制使用Chrome打开的本地文件来阻止上述情况。为了克服这些限制,我们有两种解决方案:
尝试运行带有--allow-file-access-from-files
标志的Chrome 。我自己尚未对此进行测试,但是如果它可以工作,那么您的系统现在也容易受到上述那种情况的攻击。
将其上传到主机,问题解决。
--allow-file-access-from-files
工作正常。
我在本地主机上遇到了同样的问题。在互联网上奔波寻找答案,我赞成这种添加--allow-file-access-from-files
方式。我在Mac上工作,所以对我来说,我必须通过终端sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files
输入密码(如果有的话)。
另一件事-除非您按如下方式将对.xsl文件的引用添加到.xml文件中,否则将无法正常工作<?xml-stylesheet type="text/xsl" href="<path to file>"?>
。我没有立即意识到的另一件事-您应该在浏览器中打开.xml文件,而不是.xsl。
基于问题的Chrome并非是对XML命名空间是xmlns="http://www.w3.org/1999/xhtml"
。没有namesspace属性,它也无法与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
我希望逐步展示此功能可以帮助Windows用户解决此问题,这就是为什么我添加了这篇文章。
好吧,如果XML文件(从标准PI开始:
<?xml-stylesheet type="text/xsl" href="..."?>
(用于引用XSL样式表)用作“ application / xml”。在这种情况下,Chrome仍会下载引用的XSL样式表,但不会呈现任何内容,因为它会将文档类型从“ application / xml”静默更改为“ Document”(!??),将“ text / xsl”更改为“样式表”(!??),然后将尝试呈现XML文档,就好像它是HTML(5)文档一样,而无需先运行其XSLT处理器。屏幕上什么也不会显示(其内容将继续显示引用XML页面的上一页,并且将继续旋转图标,就像从未完全加载文档一样)。
您可以完美地使用Chrome控制台,该控制台可以显示所有资源都已加载,但是它们的解释不正确。
因此,是的,Chrome当前仅呈现XML文件(带有可选的前导XSL样式表声明),前提是该文件用作“文本/ 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
上面的索引页正确显示,但是所有链接都将驱动到XML文档,并带有指向现有XSL样式表文档的基本XSL声明,并且您可以无限期地等待,以为这些章节有待下载。您可以通过打开控制台并在“资源”选项卡中阅读源代码来阅读文档。
检查http://www.aranedabienesraices.com.ar
该站点是使用XML / XSLT客户端构建的。它适用于IE6-7-8,FF,O,Safari和Chrome。您是否正确发送HTTP标头?您是否遵守同源政策?
8年后,情况有所改变。
如果没有其他参数,我将无法打开Google Chrome的新会话并允许使用“文件:”架构。
在macOS上,我这样做:
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
没有这个参数,我将无法在本地测试XSL样式表。