【问题标题】:dom tree vs. xslt processor tree - what is the difference?dom 树与 xslt 处理器树 - 有什么区别?
【发布时间】:2014-10-08 15:09:41
【问题描述】:

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

【问题讨论】:

  • 在 Saxon 的情况下,它能够处理 W3C DOM 树,但如果你给它原始字节,那么它可以构建自己的(非 DOM)树结构在它自己的内部对象模型中,它可以比 W3C DOM 更有效地处理。

标签: dom xslt


【解决方案1】:

由于 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 处理没有意义的事物,例如事件。这些类型的优化可能会导致应用程序占用更少的内存并更快地运行。

【讨论】:

  • 哇,谢谢你的回答!!那么,公平地说,不使用 DOM 解析器实现 xslt 处理器实际上更有意义吗?
  • 这取决于目标。如果我从零开始,并且手头唯一的事情是给我一个 DOM 树,并且我的目标是让 xslt 处理器准备好快速使用,我会使用 DOM 树。如果我不惜一切代价优化 xslt 处理器,即使这意味着它稍后会准备好,那么我会跳过 DOM 树并使用针对 xslt 处理任务优化的东西。这是两个极端。也可以采取中间的做法,使用 DOM 树,然后将其转换为优化的树,其好处将是两个极端的混合。
猜你喜欢
  • 2015-10-23
  • 2011-05-18
  • 2013-07-02
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2013-05-08
相关资源
最近更新 更多