XSLT 1.0向XPath 1.0提供的数据类型添加了另外一种数据类型:结果树片段。
此附加数据类型称为结果树片段。变量可以绑定到结果树片段,而不是四种基本XPath数据类型(字符串,数字,布尔值,节点集)之一。结果树片段表示结果树的片段。结果树片段等同于仅包含单个根节点的节点集。但是,结果树片段上允许的操作是节点集上允许的操作的子集。仅当允许对字符串进行操作时,才允许对结果树片段执行操作(对字符串的操作可能涉及先将字符串转换为数字或布尔值)。特别是,不允许在结果树片段上使用
/
,//
和[]
运算符。
— https://www.w3.org/TR/xslt-10/#section-Result-Tree-Fragments
对我来说,这似乎毫无意义。我不不明白为什么有人要这样做!结果树片段看起来像是节点集的垃圾版本,需要two intermediate variables和language 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
,这进一步说明最初没有任何实际意义!
为什么结果树片段存在?
答案 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大约花了两年的时间开发,并且工作组完全期望在两年内,它将被更高版本完全取代。因此,如果他们为下一个版本保持打开状态,他们非常愿意在语言上施加限制。