For an outermost expression (an expression not occurring within another expression), the current node is always the same as the context node (which will be returned by the .
or self
syntax). The following two are symantically equivalent.
<xsl:value-of select="current()"/>
<xsl:value-of select="."/>
In an inner expression (e.g. in square brackets), the current node is still the same as it would have been in an outermost expression. Thus within all of the following three expressions the current
function (not the entire expressions) returns the same node. Moreover, the latter two are semantically equivalent.
<xsl:value-of select="current()"/>
<xsl:value-of select="foo/bar[current() = X]"/>
<xsl:variable name="current" select="current()"/>
<xsl:value-of select="foo/bar[$current = X]"/>
And the next code is also semantically equivalent to the latter two, since the .
occurs in an outermost expression.
<xsl:variable name="current" select="."/>
<xsl:value-of select="foo/bar[$current = X]"/>
But the .
always relate to the narrowest context. Thus in
<xsl:value-of select="foo/bar[. = X]"/>
the .
returns the bar
node, which may be different from the current node.