是否可以从加载到浏览器中的 XML 文档执行 javascript?

Is it possible to execute javascript from an XML document loaded into the browser?

我想知道是否有一些 XML 处理指令或什至是一个元素(如 HTML <script> 元素)会吸引 Chrome(以及像 Safari 这样的克隆)和 Edge)、Firefox 和 Opera 加载和执行 javascript 形成任何 XML 文档,即使它不是 HTML.

例子

<?xml version="1.0" encoding="UTF-8"?>
<?script type="text/javascript" href="xslt.js"?> 
<root>
  <foo>
    <bar/>
  </foo>
</root>
   

这会将文档加载为 XML 并加载 javascript 然后可以 bootstrap 渲染的其余部分。 javascript 可以从 window.document 变量访问 XML DOM,并做任何它想做的事,最终用浏览器可以的 html 节点替换根节点然后渲染。

一道题,很专注


因为答案很可能是“否”,如果你问“你为什么要这样做?”这就是为什么需要这样的东西。不,这不是额外的问题,而是说明为什么需要我所要求的并考虑可能的解决方法。

我知道浏览器中的 XSLT 已开发用于加载任何 XML 文档,并且使用 xml-stylesheet 处理指令,您可以告诉浏览器使用其内置的 XSLT 呈现它引擎。不幸的是,浏览器开发人员都不知道 XML、XSLT 和 XPath 的强大功能,并且沉迷于这种 JSON 胡说八道。因此,XSLTProcessor 功能是旧的,在石器时代的 XSLT (1.0) 版本上,甚至充满错误并且完全没有维护。更糟糕的是,它以“安全”为借口搞得一团糟,并计划从浏览器代码中完全删除。

这意味着我们需要找到自己的方法来做到这一点。这意味着,我们需要某种方式在 XML 文档中包含 javascript bootstrap 代码,类似于 xsl-stylesheet 处理指令,因此我们可以使用 [=42 开始我们自己的处理=] 基于 XSLT 引擎,例如 Saxon-JS。

当他们真正最终从他们的代码中删除这个糟糕的 XSLT v1.0 处理器时,那么问题将是,如果您加载 XML 文档(那不是 HTML)甚至会发生什么进入浏览器?浏览器会用它做什么?当前呈现为这个漂亮的打印 XML 是使用某种默认样式表完成的。那么问题就变成了如何以某种方式将其他一些默认样式表挂接到浏览器配置中?

一种可能的方法是创建一个浏览器扩展,在加载 XML 文档时实际解释这些处理指令。这可以执行脚本处理指令,但也许更好,只需以自己的方式处理处理指令。

XHTML script 元素可能有效:<root><script src="foo.js" xmlns="http://www.w3.org/1999/xhtml"/>..</root>https://martin-honnen.github.io/xslt/2022/example1.xml 例如<root><script src="example1.js" xmlns="http://www.w3.org/1999/xhtml"/><foo><bar>baz</bar></foo></root> 其中 example1.js 在附加到 DOMContentLoaded 事件的事件侦听器中将 XML DOM 文档输出到控制台。这只是脚本文件被加载和执行并可以访问 XML DOM 文档的示例。

引导 Saxon-JS 2 到 运行 XSLT 3 的示例位于 https://martin-honnen.github.io/xslt/2022/example2.xml,它仅使用两个 XHTML 脚本元素,一个加载 Saxon-JS 库,另一个然后设置事件侦听器以应用示例转换并将其结果插入文档,替换默认文档内容。