The xsl:apply-templates element causes navigation from the current element, usually but not necessarily to process its children. Each selected node is processed using the best-match xsl:template defined for that node.

The xsl:apply-templates element takes an optional attribute, mode, which identifies the processing mode. If this attribute is present, only templates with a matching mode parameter will be considered when searching for the rule to apply to the selected elements.

It also takes an optional attribute, select.

If the select attribute is omitted, apply-templates causes all the immediate children of the current node to be processed: that is, child elements and character content, in the order in which it appears. Character content must be processed by a template whose match pattern will be something like */text(). Child elements similarly are processed using the appropriate template, selected according to the rules given below under xsl:template.

If the select attribute is included, the result must be a sequence of nodes. All nodes selected by the expression are processed.

The xsl:apply-templates element is usually empty, in which case the selected nodes are processed in the order they are selected (this will usually be document order, but this depends on the select expression that is used). However the element may include xsl:sort and/or xsl:param elements:

The selected nodes are processed in a particular context. This context includes:

Some examples of the most useful forms of select expression are listed below:




Process all immediate child elements with tag XXX


Process all immediate child elements (but not character data within the element)


Process the TITLE children of the parent element


Process all XXX child elements having an attribute named AAA


Process all attributes of the current element


Process all grandchild ZZZ elements


Process all child XXX elements that have a child ZZZ

XXX[@WIDTH and not(@width="20")]

Process all child XXX elements that have a WIDTH attribute whose value is not "20"


Process the first child AUTHOR element


Process the last child APPENDIX element having a NUMBER attribute


Process the last child APPENDIX element provided it has a NUMBER attribute

The full syntax of select expressions is outlined in XPath Expression Syntax.

In XSLT 3.0, the xsl:apply-templates instruction can select atomic values as well as nodes, and the match pattern syntax of xsl:template is extended to allow atomic values as well as nodes to be matched. As of Saxon 9.5, most of the extensions to match pattern syntax are implemented.

Earlier drafts of XSLT 3.0 introduced a pattern syntax ~typename: for example ~xs:integer would match any integer. With experience this was found not to be very useful, and it has been dropped. Instead a new pattern syntax ?{expression} is introduced: this matches any item for which the effective boolean value of the expression (evaluated with that item as the context item) is true. For example ?{. gt 0} will match any item (necessarily a number) that is greater than zero., while ?{nilled()} matches any element that is nilled (@xsi:nil='true'). Saxon 9.5 supports both the ~typename and the ?{expression} constructs.