8.4 XSLT的内置模板规则
正如前面所介绍的,XSLT样式单就是一系列的<template…/>元素定义的样式定义,如果该样式里定义的模板没有任何动态的内容(没有其他XSLT标签),该模板所匹配的XML节点将被直接替换成它所包含的内容。
如果定义XSLT模板规则时忘记了为某个节点定义模板规则,那XSLT是不是就会忽略对该节点的转换呢?答案是否定的,XSLT内置了几个通用模板定义,如果开发者没有对某个节点定义模板规则,XSLT内置的模板规则就会起作用。
XSLT内置的第1条模板规则可以匹配所有元素节点和根节点,如下所示:
这条模板规则非常简单,它通知XSLT处理器依次处理当前节点集所包含的每个子节点。由于XSLT已经内置了这条模板规则,所以如果对某个节点无须特殊处理,而只是希望XSLT依次处理它所包含的每个子节点,那该节点就无须定义任何模板规则,使用这个内置的模板规则即可。
如果开发者为某个元素节点或根节点指定了自己的模板规则,这条内置的模板规则就将失效——这是因为开发者定义的模板规则总是具有更高的优先级。
提示
关于模板优先级的详细介绍,请参阅本章第10节的内容。
XSLT内置的第2条模板规则也可以匹配所有元素节点和根节点,只不过这条模板规则指定了mode属性,如下所示:
值得指出的是,上面的模板规则中的mode属性值m,它的作用相当于一个通配符,可以匹配任何mode属性值。例如如下代码:
如果该XSLT样式单文档中找不到匹配的样式定义,则XSLT将自动应用如下模板规则:
XSLT内置的第3条模板规则可以匹配所有文本节点和属性节点,如下所示:
这条转换规则非常简单,总是直接输出文本节点和属性节点的文本内容。
例如对于如下XML文档:
程序清单:codes\08\8.4\book.xml
即使该XML文档对应的book.xslt文档不包含任何转换规则,仅仅是一份空XSLT文档,使用浏览器浏览该页面也可以看到图8.14所示结果:
图8.14 使用内置模板规则进行转换
从图8.14可以看出,即使XSLT样式单文档中不包含任何样式定义,XSLT也一样会使用内置的模板规则进行转换,因此可以看到所有文本节点的内容都被输出在了当前页面中。
但该转换结果中并没有输出<book…/>元素的isbn属性,这是因为虽然第3条内置的模板规则会处理所有属性节点,但由于第1条内置的模板规则没有指定处理属性节点,所以不会看到输出isbn属性的值。
注意
实际使用过程中,如果没有对属性节点应用<xsl:apply-templates match="@*">,属性节点的值就不会被转换。为此,可以将第1条内置模板规则修改为如下形式:
通过覆盖第1条内置的模板规则,在XSLT转换时就会自动输出所有文本节点和属性节点的内容了。
XSLT内置的第4条模板规则可以匹配所有处理指令和注释,如下所示:
这条模板规则对处理指令和注释不做任何处理,这意味着如果XSLT没有对处理指令和注释定义模板规则,则XSLT不会输出处理指令和注释里包含的数据。