我有一个XML文档here,该文档与相应的XSL file一起提供。转换留待客户端执行,无需JavaScript。
这在IE(冲击恐怖)中运行良好,但在谷歌浏览器中,只显示文档的文本节点。
我知道可以在Chrome中使用客户端XSL,因为我已经看过它的例子,但我还是能够自己复制这个成功
我做错了什么?
答案 0 :(得分:112)
Eric下面的另一个答案是错误的。他提到的名称空间声明与问题无关。
它不起作用的真正原因是due to security concerns(参见issue 4197,issue 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。我自己没有对此进行测试,但如果它有效,您的系统现在也会受到上述情况的影响。
将其上传到主机,问题解决了。
答案 1 :(得分:14)
在撰写本文时,有一个bug in chrome需要xmlns
属性才能触发渲染:
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" ... >
这是我从服务器提供xml文件时遇到的问题。
如果与我不同,您正在从file:///
网址查看xml文件,那么提及--allow-file-access-from-files
的解决方案就是您想要的
答案 2 :(得分:5)
我在localhost上遇到了同样的问题。
在互联网上运行寻找答案,我同意添加--allow-file-access-from-files
有效。我在Mac上工作,所以对我来说,我必须通过终端sudo /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files
并输入您的密码(如果有的话)。
另一个小问题 - 除非您将.xsl文件的引用添加到.xsl文件中,否则任何内容都不会起作用,如下所示<?xml-stylesheet type="text/xsl" href="<path to file>"?>
。我没有立即意识到的另一件小事 - 您应该在浏览器中打开.xml文件,而不是.xsl。
答案 3 :(得分:4)
基于 Chrome 的问题与 xml名称空间无关,即xmlns="http://www.w3.org/1999/xhtml"
。如果没有namesspace属性,它也不会使用IE。
由于安全限制,您必须在启动Chrome时添加--allow-file-access-from-files
标记。我认为linux / * nix用户可以通过终端轻松完成,但对于Windows用户,您必须打开 Chrome快捷方式的属性并将其添加到目标目标中如下;
右键单击 - &gt;属性 - &gt;目标强>
以下是我在机器上使用的标记的示例完整路径;
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files
我希望逐步显示这个问题会帮助Windows用户解决问题,这就是我添加此帖子的原因。
答案 4 :(得分:3)
如果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样式表声明),只有当它被用作“text / xml”时,而不是像应用程序/ xml那样用于客户端呈现带有XSL声明的XML。
对于作为“text / xml”或“application / xml”且不包含XSL样式表声明的XML文件,Chrome仍应使用默认样式表将其呈现为DOM树,或至少作为其文本资源。但它没有,并且再次尝试将其呈现为HTML,并且立即在许多脚本(包括默认内部脚本)上发生错误,这些脚本尝试访问“document.body”以处理onLoad事件并注入一些javascript处理程序。
Chrome中没有按预期工作的网站示例(Common Lisp文档),但在IE中支持客户端XSLT:
http://common-lisp.net/project/bknr/static/lmman/toc.html
上面的索引页面显示正确,但是所有链接都将使用基本XSL声明驱动到现有XSL样式表文档的XML文档,您可以无限期地等待,认为这些章节有下载问题。您只需打开控制台并阅读“资源”选项卡中的源代码,即可阅读docuemntation。
答案 5 :(得分:2)
尽我所知,Chrome正在寻找标题
Content-Type:text / xml
然后它工作---其他迭代失败。
确保您的网络服务器提供此功能。它还解释了为什么它失败了file:// URI xml文件。
答案 6 :(得分:1)
检查http://www.aranedabienesraices.com.ar
此站点使用XML / XSLT客户端构建。它适用于IE6-7-8,FF,O,Safari和Chrome。 您是否正确发送HTTP标头? 您是否尊重同源政策?
答案 7 :(得分:0)
我尝试将文件放在 wwwroot 中。因此,在Chrome中访问该页面时,这是 localhost / yourpage.xml 的地址。
答案 8 :(得分:0)
Eric说的是正确的。
在xsl中,对于xsl:stylesheet标记,具有以下属性
version =“1.0”xmlns:xsl =“http://www.w3.org/1999/XSL/Transform” 的xmlns = “http://www.w3.org/1999/xhtml”
它在chrome中运行良好。
答案 9 :(得分:0)
我开始对此进行测试,并遇到了本地文件/ Chrome安全问题。一个非常简单的解决方法是将XML和XSL文件放在Dropbox公共文件夹中,并获取这两个文件的链接。将链接放在XML头中的XSL转换中。使用Chrome和IT工作中的XML链接!
答案 10 :(得分:0)
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样式表。