将样式表从XSLT 1.0转换为2.0

时间:2012-06-21 08:28:30

标签: xpath xslt-1.0 xslt-2.0

我有一个xslt 1.0样式表需要转换为xslt 2.0。

我在这里找到了这个问题:Convert XSLT 1.0 to 2.0处理同样的问题。

根据将版本属性更改为2.0可以解决问题。但这是唯一需要做的事情吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

我认为转换策略的选择取决于你有一套好的回归测试。

如果你有一套好的回归测试,或者引入错误的后果不严重,那么我建议采取以下步骤:

(a)将版本属性更改为2.0

(b)使用XSLT 2.0处理器运行您的测试用例并查看它们是否有效

(c)检查任何测试差异并确定其原因(可能80%的时间它将首次正确工作而没有差异)。

如果您没有进行良好的测试或者您承担不起任何风险,那么您可能需要采取更谨慎的策略。 (当然,最终谨慎的是“不要改变任何东西”战略 - 坚持1.0)。在这种情况下,最好的建议可能是通过编写更多测试用例来启动转换项目。至少,收集您当前正在处理的源文档的示例,以及为这些源文档生成的输出,然后使用文件比较工具来比较转换后获得的输出。

1.0和2.0之间存在一些不兼容性;您最有可能遇到的是1.0中的xsl:value-of(以及许多其他构造)忽略第一个之后提供的输入序列中的所有节点,而XSLT 2.0输出所提供序列中的所有节点。有两种方法可以解决这个问题。 (我的推荐)确定发生此问题的地方并修复它们,通常是通过将select =“X”更改为select =“X [1]”;或者将xsl:stylesheet上的version属性更改回version =“1.0”,这会导致XSLT 2.0处理器以向后兼容模式运行。依赖向后兼容模式的缺点是你失去了XSLT 2.0中更强大的类型检查的好处,这使得复杂的样式表代码更容易调试。

根据我的经验,您在转换过程中遇到的问题更可能取决于处理器/实现更改,而不是W3C语言更改。您的代码可能正在使用2.0处理器不支持的供应商定义的扩展函数,或者它可能依赖于实现定义的行为,例如整理从一个处理器到另一个处理器的序列。例如,我看过代码依赖于generate-id()生成的输出的特定格式,这完全取决于实现。

答案 1 :(得分:0)

"XSL Transformations (XSLT) Version 2.0", §J, "Changes from XSLT 1.0 (Non-Normative)"列出了您需要注意的XSLT 1.0和XSLT 2.0之间的大多数差异。