XSLT 在 Web 浏览器中不起作用
Posted
技术标签:
【中文标题】XSLT 在 Web 浏览器中不起作用【英文标题】:XSLT not working in web browser 【发布时间】:2021-02-15 15:23:38 【问题描述】:我有一个用于 XML 样式的 XSLT 文件。 XSLT 可以通过 URL (http://someurl/somefile.xsl) 毫无问题地访问。
当我将相同的 URL 插入到 xml-stylesheet
处理指令中时,它只会在浏览器(FF、IE)中呈现纯文本,
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://someurl/somefile.xsl"?>
<rootElement>...</rootElement>
但是当我使用本地文件路径(文件下载到与 XML 文件相同的文件夹)时,它就像一个魅力:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="somefile.xsl"?>
<rootElement>...</rootElement>
为什么?
【问题讨论】:
XML 文档和 XSLT 样式表是否在同一台服务器上?这可能与您的问题有关:bytes.com/topic/net/answers/…. @MathiasMüller 像往常一样是正确的。有关详细信息,请参阅我的answer below。 【参考方案1】:在 Web 浏览器中运行 XSLT
在浏览器中运行 XSLT 受到一些限制:
任何主要的网络浏览器都不支持 XSLT 2.0。
浏览器安全模型在 XSLT 处理方面有所不同。
跨域限制通常要求 XSLT 从与 XML 相同的来源加载。 (在这种情况下,这似乎在咬你。)
Chrome 运行 not allow 本地加载的 XSLT(即使 XML 是本地加载的)。这在开发过程中可能很烦人。
由于这些原因,XSLT 更经常在服务器上或以批处理模式而不是在浏览器中运行。
如果您希望在浏览器中运行 XSLT 并使其与 Chrome、Firefox 和 IE 一起使用,则必须
-
仅使用 XSLT 1.0,不 XSLT 2.0。
在 XML 文件中使用 xml-stylesheet
处理指令,就像您将 XSLT 文件与 XML 文件链接一样:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://origin-domain/path/to/file.xsl"?>
<rootElement>...</rootElement>
从服务器而非本地文件提供 XSLT。
确保 XSLT 源自与 XML 相同的域。
最后,请务必check the browser console 获取任何错误消息。例如,当无法定位 XSLT 时,IE 会显示以下内容:
【讨论】:
我没有使用 xslt 的经验(这个 xsl 文件不是我的工作 => 外部源),因此我不知道它是 1.0 还是 2.0(遗憾的是我不知道差异,将谷歌它),就像你说的我使用 xml-stylesheet ......关于不同的域,虽然这是我的问题,当 Mathias 建议它时,但它似乎不是......我有一个不同的 xml,它使用来自不同域的 xsl如果我进入该域,它加载正常(由于 XML 不同,数据已损坏,但样式加载正确) 谢谢你的好,详细的回答,我会把它标记为最好的,即使我仍然有问题,但它可能会帮助其他人...... 请务必检查浏览器控制台是否有错误消息。答案已更新。 以上第 3 点,我相信 Chrome 要求您从文件服务器提供它,但 IE 没有。 @JacopoStanchi:正确,XSLT 和 XML 必须来自同一来源(域)。【参考方案2】:由于此答案与其他问题相关联,因此我将添加一个更新:现在可以使用 Saxon-JS 实现在浏览器中运行 XSLT 3.0 样式表。这消除了各种浏览器附带的内置 XSLT 处理器存在的许多限制。
【讨论】:
但是我假设您的程序的用户需要安装这个撒克逊软件才能进行任何转换?ChtmlView
MFC Web 浏览器控件怎么样?
Saxon-JS 只是一个 javascript 库,可以像任何其他 JS 代码一样加载到 HTML 页面中。它不需要任何安装,它适用于任何浏览器 - 不需要 ActiveX 的东西。
我明白了。在我的情况下,虽然我有一个带有自己的预览窗口的编辑器,这是我使用 CHtmlView 控件的地方。以上是关于XSLT 在 Web 浏览器中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Web 在 Firebase 托管中不起作用
浏览器和应用栏中的后退按钮在 Flutter Web 开发中不起作用