如何使XSLT在Chrome中工作?


87

这里有一个XML文档该文档带有相应的XSL文件。转换留给客户端执行,无需JavaScript。

在IE(令人震惊的恐怖)中,此方法工作正常,但在Google Chrome中,仅显示文档的文本节点。

我知道可以在Chrome中执行客户端XSL,正如我所看到的例子一样,但是我还无法自己复制这种成功。

我究竟做错了什么?


知道时发布解决方案将是很棒的。我还没有真正将Chrome用于任何严肃的事情-在我看来,它像是Google玩具。为什么需要执行XSLT客户端?
Dimitre Novatchev 2010年

我不。我只是认为那会很整洁。而且我仍然想知道为什么有些东西可以在Chrome上运行,但是我的却不行。哦,对于IE用户,对于页面的残酷彩虹样式感到抱歉。
埃里克(Eric)

12
对我来说,Chrome仅在通过http://打开XML时才能进行转换,而在通过file://进行工作时则不起作用,xmlns-attribute对我没有任何影响。
JaroslavZáruba2010年


Answers:


116

埃里克(Eric)下面的另一个答案是错误的。他提到的名称空间声明与该问题无关。

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

想象一下这种情况:

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

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

  3. 本地网页会创建<iframe>其来源为https://mail.google.com/mail/

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

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

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

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

  1. 尝试运行带有--allow-file-access-from-files 标志的Chrome 。我自己尚未对此进行测试,但是如果它可以工作,那么您的系统现在也容易受到上述那种情况的攻击。

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


2
的确如此,但这不是问题的唯一原因。我已经关注“错误”报告已有一段时间了。但是,如果没有该xmlns属性,我也无法在服务器端使用它。较新版本的chrome中可能已更改。
埃里克(Eric)

4
@Eric好的,这可能不是您的问题的答案,但这是您问题的正确答案。从访问者对该页面的评论来看,我们可以看到标记为答案的答案不能解决他们的问题。(否则,为什么他们必须经过其他6个答案才能找到解决方案)
Pacerier 2011年

4
@Pacerier:这不是我问题的正确答案。我的问题是询问为什么托管在我服务器上的一对文档没有正确转换。安全问题虽然值得了解,但与该特定问题无关。
埃里克(Eric)

1
@Pacerier谢谢,--allow-file-access-from-files工作正常。
伊本·赛义德2013年

如何在macOS中进行设置?
Pardeep Jain

14

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

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

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


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


2
好发现!为此填补了一个错误。
Mohamed Mansour

1
@Peter:这取决于您的输入文档。XSLT规范在这里非常清楚,IE也太宽容了。如果输入是有效的XHTML,则它具有名称空间声明。要让XSLT在该输入文档中定位任何内容,必须定义名称空间。但是,不必使用默认名称空间(但最简单)。
亚伯

10
@Eric:看看我的答案,没有冒犯,但您的答案是错误的。
Pacerier,2011年

4
这不是答案(也不是解决方案,“ ...”肯定有点含糊),Pacerier的答案是正确的。
RedGlyph 2011年

这是不正确的。不需要减速。它要求版本号。
UDID

6

我在本地主机上遇到了同样的问题。在互联网上奔波寻找答案,我赞成这种添加--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。


6

基于问题的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用户解决此问题,这就是为什么我添加了这篇文章。


4

好吧,如果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声明,并且您可以无限期地等待,以为这些章节有待下载。您可以通过打开控制台并在“资源”选项卡中阅读源代码来阅读文档。


3

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

内容类型:text / xml

然后就可以了---其他迭代都失败了。

确保您的Web服务器正在提供此功能。它还说明了为什么file:// URI xml文件失败。


2

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

该站点是使用XML / XSLT客户端构建的。它适用于IE6-7-8,FF,O,Safari和Chrome。您是否正确发送HTTP标头?您是否遵守同源政策?


看到我的答案,我已经解决了。Chrome似乎需要一个xmlns属性。
埃里克(Eric)

4
我不这么认为。要执行转换,Chrome不需要将默认名称空间设置为XHTML名称空间。当然,要呈现XHTML,则需要适当的XHTML。您正在混合事物。

上面引用的站点不是使用XML构建的,而是使用XHTML构建的。两者并不完全相同(都是XML,但一个也是HTML,另一个则不是)。
jerseyboy

1

我尝试将文件放在wwwroot中。因此,在Chrome中访问页面时,这是地址localhost / yourpage.xml


1

埃里克所说的是正确的。

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

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

它在chrome中效果很好。


1

我开始对此进行测试,并遇到了本地文件/ Chrome安全问题。一个非常简单的解决方法是将XML和XSL文件放入Dropbox公用文件夹中,并获得指向这两个文件的链接。将指向XSL转换的链接放在XML头中。使用Chrome中的XML链接即可使用!


1

8年后,情况有所改变。

如果没有其他参数,我将无法打开Goog​​le 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样式表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.