The xsl:template
element defines a processing rule for source elements or other nodes of a
particular type.
The type of node to be processed is identified by a pattern, written in the
mandatory match
attribute. The most common form of pattern is simply an
element name. However, more complex patterns may also be used:
The full syntax of patterns is given in XSLT Pattern Syntax
The following examples show some of the possibilities:
Pattern |
Meaning |
XXX |
Matches any element whose name (tag) is XXX |
* |
Matches any element |
XXX/YYY |
Matches any YYY element whose parent is an XXX |
XXX//YYY |
Matches any YYY element that has an ancestor named XXX |
/*/XXX |
Matches any XXX element that is immediately below the root (document) element |
*[@ID] |
Matches any element with an ID attribute |
XXX[1] |
Matches any XXX element that is the first XXX child of its parent element. (Note that this kind of pattern can be very inefficient: it is better to match all XXX elements with a single template, and then use xsl:if to distinguish them) |
SECTION[TITLE="Contents"] |
Matches any SECTION element whose first TITLE child element has the value "Contents" |
A/TITLE | B/TITLE | C/TITLE |
Matches any TITLE element whose parent is of type A or B or C |
text() |
Matches any character data node |
@* |
Matches any attribute |
/ |
Matches the document node |
The xsl:template
element has an optional mode
attribute. If this is present, the template
will only be matched when the same mode is used in the invoking xsl:apply-templates
element.
The value can be a list of mode names, indicating that the template matches more than one mode; this list
can include the token #default
to indicate that the template matches the default (unnamed)
mode. Alternatively the mode
attribute can be set to #all
, to indicate that the
template matches all modes. (This can be useful in conjunction with xsl:next-match
: one
can write a template rule that matches in all modes, and then call xsl:next-match
to continue
processing in the original mode.)
There is also an optional name
attribute. If this is present, the template may be invoked
directly using xsl:call-template
. The match attribute then becomes optional.
If there are several xsl:template
elements that all match the same
node, the one that is chosen is determined by the optional priority
attribute: the template
with highest priority wins. The priority is written as a floating-point number; the default priority
is 1. If two matching templates have the same priority, the one that appears last in the stylesheet
is used.
The following examples illustrate different kinds of template and match pattern.
Example 1: a simple XSLT template for a particular element. This example causes all <ptitle> elements in the source document to be output as HTML <h2> elements.
<xsl:template match="ptitle">
<h2>
<xsl:apply-templates/>
</h2>
</xsl:template>