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:




Matches any element whose name (tag) is XXX


Matches any element


Matches any YYY element whose parent is an XXX


Matches any YYY element that has an ancestor named XXX


Matches any XXX element that is immediately below the root (document) element


Matches any element with an ID attribute


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)


Matches any SECTION element whose first TITLE child element has the value "Contents"


Matches any TITLE element whose parent is of type A or B or C


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>