正如在过去的几篇专栏文章中所看到的那样,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提供了一些非常有用的字符串操作函数,比如将字符串作为标志放入标志元素节点集的函数,以及连接节点集中所有节点的字符串值的函数。