dom树与xslt处理器树 - 有什么区别?

时间:2014-10-08 15:09:41

标签: dom xslt

由于DOM是XML的树表示,而xslt处理器使用树结构作为输入,我想知道DOM和xslt处理器的树结构之间有什么区别?如何在SAX上实现像Saxon这样的xslt处理器?这是否意味着它从SAX报告的事件中生成输入树结构?不是有点累赘吗?为什么要使用不提供树形结构的东西?

1 个答案:

答案 0 :(得分:0)

  

由于DOM是XML的树表示

虽然您可以将DOM与XML一起使用,但DOM通常是HTML的树形表示。

  

和xslt处理器使用树结构作为输入,

当我在命令行使用saxon时,我给它一个文件。它是一个字节序列,而不是树。有些东西必须将这个序列转换成树。

  

我想知道DOM和xslt处理器的树结构有什么区别?

列出所有差异太长但有些显着:

  • DOM树应该符合一套标准。他们有一个公共界面。 XSLT处理器使用的树不必符合任何标准。 XSLT处理器可以很好地创建自己的树,它只能用于自己的目的。

  • DOM树通常在结构上是可变的。用于XSLT处理的树可能在结构上是可变的,但通常是不可变的。 (通过“结构上可变的”我正在讨论添加,删除,移动元素。在XSLT中没有任何工具可以在处理时修改输入。)

  • DOM树支持在XSLT处理中没有意义的事情。例如,事件处理程序。

  

如何在SAX上实现像Saxon这样的xslt处理器?这是否意味着它从SAX报告的事件中生成输入树结构?不是有点累赘吗?为什么要使用不提供树形结构的东西?

是的,XSLT处理器将使用SAX的事件来生成用于内部处理的树。 (而且看起来这就是Saxon所做的。)有充分的理由可以使用SAX来构建自定义树,而不是使用构建DOM树的库。之前我说XSLT处理器通常使用它们的树作为结构不可变的。这可以允许DOM实现可能无法执行的优化。这是一个例子。如果树在结构上是不可变的,则可以一劳永逸地计算节点的子元素列表。它一旦计算就不会改变。但是,在DOM树中,节点的子元素列表可以更改,因为树是可变的。所以你必须有条款来处理变化。自定义树也不必支持对XSLT处理没有意义的事情,比如事件。这些类型的优化可能会导致应用程序占用更少的内存并运行得更快。