有人可以解释一下transformNodeToObject和transformToDocument / transformToFragment之间的区别。 通过许多博客和论坛消失了,但这两者之间仍然存在混淆
答案 0 :(得分:3)
Microsoft有一个基于COM的XML软件包,提供针对该DOM的XML DOM实现以及XSLT和XPath 1.0。它目前在所有受支持的Microsoft OS上提供两个版本,包括最新的Service Pack,即MSXML 3.0和MSXML 6.0(其主要区别在于MSXML 3.0与不再支持的旧版本的向后兼容性以及更严格的安全设置和XML MSXML 6.0中的架构支持)。通过COM自动化,可以在各种主机环境中使用MSXML和JScript,如经典ASP,Windows脚本宿主和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是不同的实现,您不能简单地在MS HTML DOM DOM文档中包含或导入或采用MSXML DOM节点。
Mozilla浏览器中的Gecko渲染引擎提供了一个不同的API来使用Javascript执行XSLT 1.0,就像Gecko中的HTML DOM构建在XML DOM上一样,您可以使用可以插入HTML或XML文档的XSLT创建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实现。