xsl:apply-templates
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.
Category: instruction
Content: (
xsl:sort
| xsl:with-param
)*
Permitted parent elements:
any XSLT element whose content model is sequence
constructor; any literal result element
Attributes
|
|
Sequence of nodes to be processed. If this attribute is omitted, then all the immediate children of the current node are processed. |
|
|
Identifies the processing mode. If this
attribute is present, only templates with a matching |
Notes on the Saxon implementation
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. See Patterns in XSLT 3.0 for more details. All of the extensions to the
syntax of match patterns are implemented in Saxon 9.6.
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]
was 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'
). The ~typename
syntax was
supported in Saxon 9.5, but no longer in Saxon 9.6.
For xsl:apply-templates
to be streamable, the W3C rules require that
the select
expression must be "striding", which essentially means
that it may use the child axis but not the descendant axis (to ensure that
selected nodes do not overlap each other). Saxon attempts to be more liberal
than this, and allow streaming also when the descendant axis is used (the
implementation will buffer output in memory if the selected nodes actually
overlap). This extension applies only if Saxon streamability extensions are
enabled (on the command line or by configuration properties). The equivalent
extension for xsl:for-each
and xsl:iterate
has been
dropped in Saxon 9.6, because it was found to cause problems when local
variables were used.
Details
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 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:
-
For sorted processing, one or more child xsl:sort elements may be included. These define the sort order to be applied to the selection. The sort keys are listed in major-to-minor order.
-
To supply parameters to the called template, one or more xsl:with-param elements may be included. The values of these parameters are available to the called template. If the
xsl:with-param
element specifiestunnel="yes"
, then the parameter is passed transparently through to templates called at any depth, but it can only be referenced by anxsl:param
element that also specifiestunnel="yes"
. If the default value,tunnel="no"
is used, then the parameter value is available only in the immediately called template, and only if thexsl:param
element specifiestunnel="no"
(explicitly or by defaulting the attribute).
The selected nodes are processed in a particular context. This context includes:
-
A current node: the node being processed.
-
A current node list: the list of nodes being processed, in the order they are processed (this affects the value of the
position()
andlast()
functions). -
A set of variables, which initially is those variables defined as parameters.
The full syntax of select expressions is outlined in XPath Expression Syntax; some examples of the most useful forms of select expression are given in the example below.
Examples
Some examples of the most useful forms of select expression:
Expression |
Meaning |
|
Process all immediate child elements with tag
|
|
Process all immediate child elements (but not character data within the element) |
|
Process the |
|
Process all |
|
Process all attributes of the current element |
|
Process all grandchild |
|
Process all child |
|
Process all child |
|
Process the first child |
|
Process the last child |
|
Process the last child |