Xslt xsl:stylesheet标记中version属性的含义

Xslt xsl:stylesheet标记中version属性的含义,xslt,Xslt,在前几天我对一篇帖子的回复中,Dimitre指出,我对XSLT1问题给出了XSLT2答案,这当然是正确的 然而,他也批评我发布了一个没有经过测试的答案。事实上,我已经对它进行了测试,尽管version属性设置为“1.0”,并且我使用了XSLT 2 replace函数,但每次都会出现错误或警告 因此,这就提出了一个问题——如果version属性不将语言限制为特定版本,那么它意味着什么 我确实试着阅读w3规范,但我的眼睛开始流血 FWIW:我使用氧气和Saxon9.3EE,XSLT1.0和2.0开发

在前几天我对一篇帖子的回复中,Dimitre指出,我对XSLT1问题给出了XSLT2答案,这当然是正确的

然而,他也批评我发布了一个没有经过测试的答案。事实上,我已经对它进行了测试,尽管version属性设置为“1.0”,并且我使用了XSLT 2 replace函数,但每次都会出现错误或警告

因此,这就提出了一个问题——如果version属性不将语言限制为特定版本,那么它意味着什么

我确实试着阅读w3规范,但我的眼睛开始流血


FWIW:我使用氧气和Saxon9.3EE,XSLT1.0和2.0开发也使用氧气。如果我试图在版本号为1.0的样式表中使用XSLT2.0函数,oXygen会警告我

检查氧气设置,确保正在使用1.0处理器验证XSLT 1.0:

注意,我正在用Xalan验证1.0


而且,我总是用1.0处理器测试我的1.0答案;通常使用Saxon 6.5.5和Xalan。

首先,XSLT规范说明XSLT处理程序如何解释版本属性,但它不限制XSLT处理程序以外的其他软件使用它。例如,IDE(如XMLSpy)可能会查看version属性并使用它来决定是启动XSLT1.0还是XSLT2.0处理器。一旦启动XSLT1.0或2.0处理器,其行为将由相关规范控制

XSLT1.0处理器对version属性的处理由XSLT1.0规范定义;XSLT2.0规范定义了2.0处理器的功能

XSLT1.0规范指出,如果版本不是1.0,处理器将以向前兼容模式运行。这基本上意味着最好忽略1.0规范中未定义的结构。因此,如果样式表显示version=“2.0”,并且使用1.0处理器运行它,那么2.0中新的属性(如xsl:sort/@collation)将被忽略。未被识别的指令只有在实际执行时才会导致失败,并且如果它没有xsl:fallback子指令来为1.0处理器提供回退行为。设计原则是,使用2.0结构不应导致1.0处理器出现故障;只要有可能,它应该使它以某种回退行为运行


XSLT2.0规范(控制2.0处理器的行为)区别于verion2.0。当版本运行时,这种方式对我来说很有效——我还必须更改场景的Transformer设置。这仍然不能回答我的问题-版本属性有什么影响?Michael Kay提供了一个很好的答案。我只能补充一点,为了避免将来出现这种混乱,您可以在oXygen中创建一个单独的XSLT1.0场景,并为其指定Saxon 6.5.x,我完全同意。除此之外,我最好去检查我的生产代码,因为有可能我的XSLT2代码设置了version=“1.0”并且“向后兼容模式”可能会导致微妙的意外行为。Dave Pawson在这里详细介绍了一点:谢谢Michael-非常有帮助。这就是为什么我喜欢这个网站——来自真正专家的清晰解释。顺便说一句,我从75年开始在三一学院工作,后来在ICL做了一小段时间