# 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>

Next