将 XSLT 1.0 升级到 XSLT 2.0

Posted

技术标签:

【中文标题】将 XSLT 1.0 升级到 XSLT 2.0【英文标题】:Upgrading XSLT 1.0 to XSLT 2.0 【发布时间】:2012-03-12 08:15:27 【问题描述】:

从 XSLT 1.0 升级到 2.0 涉及什么? 1 - 升级的可能原因是什么? 2 - 不升级的可能原因是什么? 3 - 最后,升级的步骤是什么?

我希望有一个执行摘要——简短的版本:)

【问题讨论】:

【参考方案1】:

从 XSLT 1.0 升级到 2.0 涉及什么?

1 - 升级的可能原因是什么?

如果您是 XSLT 程序员,您将从更方便和表达能力更强的 XSLT 2.0 语言 + XPath 2.0 和新的 XDM(XPath 数据模型)中受益匪浅。

您可能想观看此XSLT 2.0 Pluralsight course,以深入系统地了解 XSLT 2.0 的强大功能

你有:

强类型和所有可用的 XSD 类型。

能够定义自己的(模式)类型。

XPath 2.0 序列类型在 XPath 1.0 中没有任何对应项(只是缺少)。

能够在纯 XSLT 中定义和编写 函数 -- xsl:function 指令。

XPath 表达式中的范围变量(for 子句)。

更好、更强大的字符串处理——XPath 2.0 在其tokenize()matches()replace() 函数中支持正则表达式。

更好、更强大的字符串处理——XSLT 2.0 对正则表达式的支持——xsl:analyze-stringxsl:matching-substringxsl:non-matching-substring 新的 XSLT 指令。

更方便、更强大、更有表现力的分组:xsl:for-each-group 指令。

许多新的、非常强大的 XPath 2.0 函数——例如日期、时间和持续时间等函数。

新的 XPath 运算符intersectexceptis>><<someeveryinstance ofcastable as、...等等。

通用 XPath 运算符 >< 等现在可用于任何有序值类型(不仅适用于 XPath 1.0 中的数字)。

新的、更安全的值比较运算符:ltleeqgtgene

XPath 2.0 to 运算符,允许拥有xsl:for-each select="1 to $N"

这些以及许多其他改进/新功能显着提高了任何 XSLT 程序员的工作效率,这使得 XSLT 2.0 开发可以在使用 XSLT 1.0 开发相同模块所需的时间的一小部分内完成。

强类型允许在编译时捕获许多错误并立即纠正。对我来说,这种强大的类型安全性是使用 XSLT 2.0 的最大优势。

2 - 不升级的可能原因是什么?

保留现有的遗留 XSLT 1.0 应用程序并继续将它们与 XSLT 1.0 一起使用,同时仅开发应用程序通常是可能的、合理且经济高效的使用 XSLT 2.0。

您的管理层 + 任何其他非技术原因。

有很多旧版 XSLT 1.0 应用程序以糟糕的风格编写(例如,使用 DOE 或现在需要重新编写和重构代码的扩展函数)。

没有可用的 XSLT 2.0 处理器。

3 - 最后,升级的步骤是什么?

xsl:stylesheetxsl:transform元素的version属性从"1.0"更改为"2.0"

删除所有xxx:node-set() 函数。

删除任何 DOE。

准备好迎接惊喜,xsl:value-of 现在不仅输出第一个,而且输出序列的所有项。

尽量使用新的xsl:sequence指令——用它来替换任何xsl:copy-of指令;当输出的类型不是字符串或文本节点时,请随时使用它而不是 xsl:value-of

广泛测试。

当测试验证代码按预期工作时,开始重构(如果认为有必要)。为任何变量、参数、模板和函数声明类型是个好主意。这样做可能会发现新的隐藏错误并修复它们可以提高代码的质量。

(可选)决定将哪些命名模板重写为xsl:function

确定您是否仍需要一些旧版本中使用的扩展功能,或者您可以使用 XSLT 的新的、强​​大的功能轻松地重写它们。

最后说明:并非上述所有步骤都是必需的,可以停止并在零错误测试结果时宣布迁移成功。在项目中开始使用所有 XSLT 2.0/XPath 2.0 功能会更简洁。

【讨论】:

感谢 Dimitre (+1) 的精彩概述。据我所知,必须在版本 1 或版本 2 处理器之间进行选择——不能同时拥有并将文档路由到适当的处理器(如果我错了,请纠正我)。在 ASP.NET 和 jQuery 上拥有重要的企业网站(所有工作都必须适合),是否有可能适合的 XSLT 2.0 处理器? @Witman:不客气。路由到不同版本的处理器很容易做到,应该不是问题。 XSLT 2.0 可以向后兼容模式下运行,但这与 XSLT 1.0 处理器的处理并不完全相同。目前有两种适用于 .NET 的 XSLT 2.0 处理器——Saxon.NET 和 XmlPrime (XQSharp)。 Saxon 还有一个 XSLT 2.0 处理器版本,可以在客户端使用——在浏览器中——这就是 Saxon CE。我认为这必须是您自己的决定——您应该同时尝试 Saxon.NET(和 CE)和 XmlPrime,然后做出明智的选择。 感谢您对路由到不同处理器和处理器建议的澄清。 (+1) 如果可以的话,我会“喜欢”这个答案。 :-) 一个非常有用的集合。您是否发表过类似的文章? DOE 代表禁用输出转义。 dpawson.co.uk/xsl/sect2/N2215.html【参考方案2】:

Dimitre 的回答非常全面且 100% 准确(一如既往),但我要补充一点。升级到 2.0 处理器时,您可以选择将版本属性设置为“1.0”并以“向后兼容模式”运行,或者将版本属性更改为“2.0”。人们经常问推荐哪种方法。

我的建议是,如果您的样式表有一套好的测试,请大胆尝试:设置 version="2.0",运行测试,如果有任何问题,请修复它们。通常,问题将是一开始就不太正确的代码,只是偶然发生的。但是,如果您没有一组好的测试并且担心工作负载的可靠性,那么保留 version="1.0" 是一种风险较低的方法:处理器将模拟 XSLT 1.0 的所有怪癖,例如xsl:value-of 忽略除第一项之外的所有内容,以及将数字与字符串进行比较的奇怪规则。

【讨论】:

以上是关于将 XSLT 1.0 升级到 XSLT 2.0的主要内容,如果未能解决你的问题,请参考以下文章

将 XML 作为参数传递和解析到 XSLT 2.0

利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)

如何在 xslt-1.0 中获取绝对值