【发布时间】:2015-01-15 20:45:38
【问题描述】:
谁能解释一下 transformNodeToObject 与 transformToDocument/transformToFragment 之间的区别。 浏览了许多博客和论坛,但这两者之间仍然存在混淆
【问题讨论】:
标签: internet-explorer firefox xslt browser cross-browser
谁能解释一下 transformNodeToObject 与 transformToDocument/transformToFragment 之间的区别。 浏览了许多博客和论坛,但这两者之间仍然存在混淆
【问题讨论】:
标签: internet-explorer firefox xslt browser cross-browser
Microsoft 有一个基于 COM 的 XML 软件包,提供 XML DOM 实现以及针对该 DOM 的 XSLT 和 XPath 1.0。它目前在所有受支持的 Microsoft OS 上提供两个版本的最新服务包,即 MSXML 3.0 和 MSXML 6.0(主要区别在于不再支持旧版本的 MSXML 3.0 的向后兼容性以及更严格的安全设置和 XML MSXML 6.0 中的架构支持)。通过 COM 自动化,可以在各种主机环境中使用 MSXML 和 JScript,例如经典 ASP、Windows Script Host 和 Internet Explorer。 MSXML DOM 在 DOM 节点上提供了两种方法来执行 XSLT 1.0 转换,即transformNode,将转换结果作为字符串返回,transformNodeToObject,将转换结果写入 MSXML DOM 节点或经典 ASP 响应对象或 IStream 实现。在 IE 内部,只要你想使用 XSLT 创建 HTML 插入到你的 HTML 文档中,你通常使用transformNode 然后innerHTML 或insertAdjacentHTML 将转换结果插入到 HTML 文档中,需要一个HTML 解析步骤,因为 IE HTML DOM 和 MSXML XML DOM 是不同的实现,不能简单地将 MSXML DOM 节点包含或导入或采用到 IE HTML DOM 文档中。
Mozilla 浏览器中的 Gecko 渲染引擎提供了不同的 API 来使用 Javascript 执行 XSLT 1.0,就像在 Gecko 中 HTML DOM 建立在 XML DOM 上一样,您可以使用 XSLT 创建可以插入 HTML 或 XML 文档的 DOM 节点。因此,在 Gecko 中使用 XSLT 1.0 创建一些节点以插入现有 DOM 文档(通常是 HTML,但也可以是 SVG)的常用方法是使用 transformToFragment 方法,因为 XSLT 处理器直接创建由您希望它们插入的 HTML 或 XML 文档,无需像在 IE 中那样序列化为字符串并重新解析为 HTML。
最后,transformToDocument 方法允许您在 Mozilla 中使用 Javascript 和 XSLT 1.0 创建单独的结果文档,类似于使用 MSXML 的 transformNodeToObject,但当然在 Mozilla 中该方法只是返回结果文档,而使用 MSXML 您需要先创建一个空的,然后传递给transformNodeToObject方法。
这是我对 Mozilla 和 IE/MSXML 中 API 设计和实现差异的理解,其他浏览器复制了 Mozilla API,但可以有不同的实现,例如 Chrome 集成了现有的 XSLT 1.0 处理器,如 libxslt 与自己的DOM 实现。
【讨论】: