结果树片段背后的原理是什么?

时间:2018-10-27 16:25:44

标签: xslt exslt rationale

XSLT 1.0向XPath 1.0提供的数据类型添加了另外一种数据类型:结果树片段。

  

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

对我来说,这似乎毫无意义。我不明白为什么有人要这样做!结果树片段看起来像是节点集的垃圾版本,需要two intermediate variableslanguage extension才能使程序员解决这一看似随意的限制。

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

<?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甚至不费心将结果树片段实现为其他类型,而将其等同地对待node-set,这进一步说明最初没有任何实际意义!

为什么结果树片段存在?

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

1 个答案:

答案 0 :(得分:2)

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

  

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

     

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

     

也许有人想取消根节点   临时树的值,然后将变量的值设为   当前被建模为此子节点的节点序列   根?如果是这样,为什么该更改有用呢?

詹姆斯·克拉克(James Clark)回答:

是不是有人想取消临时树的根节点,而是使变量的值成为序列 当前建模为该根节点的子节点的数量?

  

是的

     

如果是这样,为什么这种更改有用呢?

     

(a)因此,指令可以返回节点而不复制它们。

     

(b)以便您可以使用说明返回除   节点。

     

要说明更多的事情,需要我解释一下我如何   希望看到XPath,XSLT和XQuery相互配合。在这   要说的是,我认为我们需要协调要素   XSLT和XQuery中的构造。这自然会导致他们   在表达式和指令之间的鸿沟少得多。一世   认为这将同样尴尬和不合适   xsl:变量以自动复制和包装根节点中的值   通过实例化其内容来生成它,因为这样做   到通过评估在表达式中指定的表达式而产生的值   选择属性。

我认为工作组发明了“结果树碎片”的概念,因为他们希望为将来保留选择的余地。他们对这种语言的发展有想法,他们认为让xsl:variable创建一个具有完整导航功能的功能强大的节点会限制将来的选择。

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

值得注意的是,工作组中没有人想到过20年后人们仍会使用XSLT 1.0。 1.0大约花了两年的时间开发,并且工作组完全期望在两年内,它将被更高版本完全取代。因此,如果他们为下一个版本保持打开状态,他们非常愿意在语言上施加限制。