2

XSLT 1.0 为 XPath 1.0 提供的数据类型添加了一个额外的数据类型:结果树片段。

这种额外的数据类型称为结果树片段。变量可以绑定到结果树片段而不是四种基本 XPath 数据类型(字符串、数字、布尔值、节点集)之一。结果树片段表示结果树的片段。结果树片段等同于仅包含单个根节点的节点集。但是,结果树片段上允许的操作是节点集上允许的操作的子集。仅当允许对字符串进行操作时才允许对结果树片段进行操作(对字符串的操作可能涉及首先将字符串转换为数字或布尔值)。特别是,不允许在结果树片段上使用 、 和 运算///。 —[]
https://www.w3.org/TR/xslt-10/#section-Result-Tree-Fragments

在我看来,这似乎毫无意义。我明白为什么有人要这样做!结果树片段看起来就像是节点集的垃圾版本,需要两个中间变量和一个语言扩展来允许程序员解决这个看似任意的限制。

为了进一步说明结果树片段的无用性,这是我的兼容性垫片偷了放在一起exsl:node-set在 MSXSL 中复制:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                exclude-result-prefixes="exsl msxsl">
  <!-- exsl:node-set -->
  <msxsl:script language="JScript" implements-prefix="exsl"><![CDATA[
    this['node-set'] = function (x) {
      return x;
    }
  ]]></msxsl:script>
</xsl:stylesheet>

实际上只是返回未更改的结果树片段这表明 MSXSL 甚至不费心将结果树片段实现为不同的类型,只是将其视为与 a 相同node-set,进一步表明它首先没有真正的意义!

为什么存在结果树片段?

  • 用例是什么?
  • 为什么要添加它们?
  • 为什么不只使用节点集?
4

1 回答 1

3

当时我不在工作组,但下面的交流可能会有所启发。2001 年 4 月,在 XSLT 1.1 的开发过程中,我问 WG:

任何人都可以尝试向我解释为什么 XSLT 1.1 WD 中定义的“结果树片段作为节点集”工具存在感知问题吗?我一直听说它不适用于 XPath 2.0 类型系统,但我不明白为什么。

我可以看到我们想要更改它,以便数据类型是“节点”而不是“节点集”,但除此之外,我看不出问题出在哪里。

是否有人在考虑取消临时树的根节点,并将变量的值改为当前建模为该根的子节点的节点序列?如果是这样,为什么这种改变会有用?

詹姆斯克拉克 回复:

是否有人在考虑取消临时树的根节点,并将变量的值改为当前建模为该根的子节点的节点序列?

是的。

如果是这样,为什么这种改变会有用?

(a) 所以指令可以在不复制节点的情况下返回节点。

(b) 这样你就可以使用指令返回节点以外的东西。

解释更多的事情需要我解释我希望如何看到 XPath、XSLT 和 XQuery 都适合在一起。在这一点上,我只想说,我认为我们需要协调 XSLT 和 XQuery 中的元素构造。这自然会导致它们在表达式和指令之间的鸿沟要小得多。我认为 xsl:variable 自动复制并包装实例化其内容产生的值在根节点中,就像它对通过评估表达式产生的值执行此操作一样尴尬和不合适在 select 属性中指定。

我认为 WG 发明了“结果树片段”的概念,因为他们希望为未来保留选项。他们知道语言将如何发展,他们认为xsl:variable创建一个具有完整导航功能的完整节点将限制未来的选择。

回想起来,我确信这是一个错误,因为它实际上并没有实现这个目标。当我们在 2.0 中废除 RTF 时,出于向后兼容性的原因,我们仍然发现有必要制定一个奇怪的规则,即xsl:variable如果没有“as”属性,则总是构造一个文档节点。

值得注意的是,WG 中没有人曾想过二十年后人们仍然会使用 XSLT 1.0。1.0 花了大约两年的时间来开发,WG 完全预计在两年内,它将被更高的版本完全取代。因此,如果他们为下一个版本保留选项,他们非常愿意对语言进行限制。

于 2018-10-27T20:39:59.363 回答