IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  XML  >

用于数据的 XML: 用 EXSLT 扩展 XSLT 的功能

了解一下 EXSLT 标准以及它如何扩展 XSLT 1.0 的功能

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Kevin Williams (kevin@blueoxide.com), CTO, Blue Oxide Technologies,LLC

2002 年 12 月 01 日

专栏图标本专栏文章简要概述了 XSLT 1.0 的 EXSLT 标准化扩展。它确定了由 EXSLT 扩展所提供的一些比较重要的功能,并包括了一些有关这些功能的用法指南。

正如在过去的几篇专栏文章中所看到的那样,XSLT 1.0 提供了很好的文本转换功能,但实际上它还不够完善,不足以提供好的数据操作能力。客观地说,它从未打算要做到这一点;设计 XSLT 1.0 时,它的创建者无法知道它将会有怎样的复杂用法。但是,XSLT 1.0 规范的的确确提供了通过额外的元素和函数来扩展 XSLT 功能的机制。规范中的相关段落如下:

元素扩展机制允许将名称空间指定为扩展名称空间。当将名称空间指定为扩展名称空间,并且模板中出现带有该名称空间中名称的元素时,那么认为该元素是指令而不是文字结果元素。名称空间确定了指令的语义。
如果 FunctionCall 表达式中的 FunctionName 不是 NCName (也就是说,如果它包含了一个冒号),那么就将它当作是对扩展函数的调用。使用求值上下文中的名称空间声明将 FunctionName 扩展成一个名称。

这意味着,如果 XSLT 处理器开发人员想要添加更多的功能,他们可以随意而为 - 只要支持该功能的元素和函数名称出现在他们自己的名称空间里。利用这一特性而获得的首要成就之一就是 Mike Kay 的 Saxon XSLT 处理器:通过包括 saxon: 名称空间中的元素和属性,开发人员可以创建能执行复杂源文档操作的样式表。其弊端是这些样式表不再是可移植的了:它们在非 Saxon 处理器中不能正常运行。同样地,XSLT 的某些 Java 实现通过使用 java: 名称空间允许从样式表直接进行 Java 调用,从而扩展功能,但是在不支持该名称空间中元素和属性的处理器上,该样式表无法正常工作。

EXSLT 是什么?

为使 XSLT 扩展更加可移植,一组开发人员已经创建出了 EXSLT 规范。这是在设法标识对 XSLT 1.0 的有用扩展功能并将它们分成可在“照菜单点”的基础上实现的功能组。EXSLT 工作是开放式的;希望对此做出贡献的任何人都可以如愿以偿。

目前所定义的 EXSLT 模块有:

  • Dates and Times提供了大量的日期操作功能,包括计算两个日期之间的差,以及检索本地系统的当前日期和时间。
  • Dynamic为处理动态生成的 XPath 表达式提供了一种机制,来完成各种任务,包括检索值并选择最小和最大值。
  • Common提供了几个基本扩展函数,比如用于创建多个输出文件的机制和返回一个字符串的函数,该字符串包含了传入该函数的对象的类型。
  • Functions为用户提供了用来定义他们自己函数的机制。
  • Math提供了简单的数学函数,比如三角函数和对数函数。
  • Regular Expressions提供了正则表达式处理功能,包括选择字符串中与给定正则表达式相匹配的子字符串的函数,以及用不同的文字值替换匹配的子字符串的函数。
  • Sets提供了用于节点集操作的函数,包括返回两个节点集的交集和返回出现在一个节点集中而不在另一节点集中的节点。
  • Strings提供了一些非常有用的字符串操作函数,比如将字符串作为标志放入标志元素节点集的函数,以及连接节点集中所有节点的字符串值的函数。




回页首


使用 EXSLT

因为 EXSLT 还没有被任何标准团体正式接受,所以 EXSLT 中功能的实现往往是有时成功有时不成功。这些函数可能有几种不同的实现方法,下面根据递减的可移植性次序列出了这些方法:

XSLT 模板。EXSLT 中的许多函数只是那些可以通过使用 XSLT 模板来完成的等价行为的快捷方式。对于这些函数,EXSLT 作者已经提供了可以导入到现有样式表的 XSLT 模板。这种方法提供了最强的可移植性,因为所有符合 XSLT 1.0 的处理器都能正确解释该模板并提供该功能。

EXSLT 函数。如果您正在使用的 XSLT 处理器支持来自 XSLT 中函数名称空间的函数元素,那么您可以利用为某些函数所提供的 EXSLT 函数实现。这种方法的可移植性比 XSLT 模板的稍微差点,但是您可以将该函数用作样式表中其它表达式的一部分。

特定于语言的实现。对于某些函数,它们简单得足以用类似 JavaScript 这样的语言来实现,您可以将这些函数的实现加到支持那些语言的处理器中,从而可以使用这些实现。诸如 math 名称空间中的那些函数在这点上是非常理想的。

由特定处理器进行的本机实现。包括了对 EXSLT 函数本机支持的处理器能够提供大多数的功能。某些 EXSLT 函数(比如动态名称空间中的那些函数)只能在本机实现。

根据您需要使用哪个函数以及您的样式表所需的可移植性程度,这些解决方案中可能有一些最符合您的需要。您可以在 EXSLT 网站上找到有关 EXSLT 中每个函数或元素实现状态的完整文档。





回页首


那么 EXSLT 对您来说是个好主意吗?

照例,EXSLT 是否适合某个特定的编程任务,这确实要取决于您的特定环境。如果您正在编写可能“锁定”于某一特定处理器平台的样式表(比如用于转换服务器上文档的样式表),那么您可能会选择实现您所需的扩展函数和元素的处理器。如果您需要可移植的样式表(例如,用于客户机端的样式化,或是在多个 XSLT 处理器的环境中),那么您可能需要将 XSLT 限制用于那些可以用 XSLT 模板实现的函数。好消息是 XSLT 2.0 包含了许多函数和元素,它们与那些在 EXSLT 中所找到的相似或相同 - 因此如果您现在致力于 EXSLT 实现,那么将它们移植到 XSLT 2.0 应当会是相当简单的任务。您甚至可以使用一个样式表来将许多 EXSLT 样式表转换成 XSLT 2.0 样式表 - 但那是另一篇专栏文章的内容了。



参考资料



关于作者

Kevin Williams 是 Blue Oxide Technologies, LLC 的 CTO,该公司设计能帮助其它公司利用面向服务的因特网的软件工具。请访问他们的网站: http://www.blueoxide.com。如有意见,可以通过 kevin@blueoxide.com与他联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款