0

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

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

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

提前致谢

4

2 回答 2

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() 生成的输出的特定格式,它完全依赖于实现。

于 2012-06-21T09:08:21.807 回答
0

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

于 2012-06-21T08:31:40.373 回答