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

时间:2012-04-02 19:42:45

标签: xslt

在回复我前几天发表的帖子时,Dimitre指出,当然,我已经对XSLT 1问题给出了XSLT 2答案。

然而,他还谴责我发布未经测试的答案。我实际上测试了它,即使版本属性设置为“1.0”,我使用了XSLT 2替换函数,每个都有错误或警告。

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

我确实尝试过阅读w3规格,但我的眼睛开始流血。

FWIW:我使用Oxygen和Saxon 9.3 EE

2 个答案:

答案 0 :(得分:3)

首先,XSLT规范说明了XSLT处理器如何解释版本属性,但它并不限制除XSLT处理器之外的其他软件。例如,IDE(例如XML Spy)可能会查看version属性并使用它来决定是否启动XSLT 1.0或XSLT 2.0处理器。启动XSLT 1.0或2.0处理器后,其行为将由相关规范控制。

XSLT 1.0规范定义了XSLT 1.0处理器对version属性的作用。 2.0处理器的功能由XSLT 2.0规范定义。

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

XSLT 2.0规范(控制2.0处理器的行为)区分verion&lt; 2.0,version = 2.0和version&gt; 2.0。当版本<2.0时,处理器以“向后兼容模式”运行。这并不意味着2.0结构被拒绝;相反,它意味着1.0构造的语义尽可能接近1.0规范中定义的语义。例如,即使操作数是小数,所有算术都以双浮点形式执行。当版本> 2.0时,处理器以向前兼容模式运行,这与1.0规范中的向前兼容模式非常相似:这意味着如果使用XSLT 3.0构造,处理器将尽力忽略它们或执行回退指令。 / p>

答案 1 :(得分:0)

我还使用oXygen进行XSLT 1.0和2.0开发。如果我尝试在版本号为1.0的样式表中使用XSLT 2.0函数,oXygen会警告我。

检查您的oXygen设置并确保使用1.0处理器验证XSLT 1.0:

enter image description here

注意我正在使用Xalan验证1.0。

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