xsl:template

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 syntax of patterns is given in more detail 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.

Examples:

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>