8.9 使用命名模板
使用命名模板也是一种提高代码复用的方式:如果XSLT样式单中有多个相同的模板定义,就可以将这部分模板片段抽取出来定义成一个命名模板。
将某个模板片段定义成命名模板之后,样式单文档就可以在多个地方重用这个模板片段了。命名模板还能提高XSLT样式单的可维护性:如果有一天需要修改这部分样式定义,只需要直接修改命名模板定义即可,无须在每个模板定义中逐项修改。
使用命名模板大致遵循如下两个步骤:
(1)定义命名模板。定义<template…/>元素时可以指定一个name属性,其值即该命名模板的名称。为<template…/>元素指定了name属性值之后,通常无须再指定match属性。
(2)通过<call-template…/>元素使用命名模板。
使用<call-template…/>元素时可指定一个name属性,表明需要调用哪个命名模板。除此之外,<call-template…/>元素内可以定义多个<with-param…/>元素,用于改变命名模板里的参数值。
例如对于如下XML文档:
程序清单:codes\08\8.9\book.xml
如果需要使用XSLT转换上面的XML文档,使用两个不同的表格来分别显示该XML文档,可以定义如下XSLT样式单文档:
程序清单:codes\08\8.9\book.xslt
上面的XSLT样式单文档中定义了两个模板规则,这两个模板规则都用于转换book.xml文档中的<book…/>元素,而且其中大部分代码完全一样,只是定义的表格背景色和边框有区别而已。在这种情况下,我们可以使用一份命名模板封装上面的模板定义,然后在两份模板中直接调用命名模板。如以下XSLT样式单所示:
程序清单:codes\08\8.9\namedTemplate.xslt
上面的XSLT样式单中第一段粗体字代码定义了一个名为table的命名模板,其中定义了bg-color和border两个参数,这样就使该命名模板的部分内容可以动态改变,从而实现了将一份命名模板当成多个模板使用的目的。
使用包含命名模板的XSLT文档转换上面的XML文档,用浏览器浏览可看到图8.25所示结果。
图8.25 使用命名模板
提示
其实可以把命名模板类比为一个方法。有过编程经验的读者都知道:如果一个程序中有多段代码类似,就可以把这段代码定义成一个方法,那些需要这段代码的地方直接调用该方法即可。命名模板中定义的参数可以类比为方法的形参,程序调用方法时将负责为形参赋值,而XSLT样式单调用命名模板时将负责为参数赋值。