将 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-string
、xsl:matching-substring
和 xsl:non-matching-substring
新的 XSLT 指令。
更方便、更强大、更有表现力的分组:xsl:for-each-group
指令。
许多新的、非常强大的 XPath 2.0 函数——例如日期、时间和持续时间等函数。
新的 XPath 运算符intersect
、except
、is
、>>
、<<
、some
、every
、instance of
、castable as
、...等等。
通用 XPath 运算符 >
、<
等现在可用于任何有序值类型(不仅适用于 XPath 1.0 中的数字)。
新的、更安全的值比较运算符:lt
、le
、eq
、gt
、ge
、ne
。
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:stylesheet
或xsl: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的主要内容,如果未能解决你的问题,请参考以下文章
利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)
利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)
利用xslt3 把xml转为json (abp vnext本地化升级的xml到json的资源转换)