15.9.3. External Parameters in XSLT Stylesheets
The XSLT 1.0 standard specifies that parameters may be passed to the XSLT processor from its environment in order to control data transformation, but the details are implementation-specific. Virtuoso's XSLT Processor will accept default values for global parameters from the optional third argument of the xslt() Virtuoso PL function. This argument, if specified, must be a vector of parameter names and values of the form
vector(name1, value1,... nameN, valueN)
, where name1 ... nameN
must be of type varchar
, and value1
... valueN
may be of any Virtuoso datatype, but may not be
null. If a parameter has a null value specified, it is removed from
the vector without any further processing. After removal of null
values, duplicate names are eliminated. If a name occurs more than
once in the vector, only the last one will be retained.
When the XSLT Processor begins the transformation of the document, it
creates two stacks of variables, one for global variables and one for
local variables. Initially the stacks are empty.
Then it prepares temporary indexes for all
<xsl:key>
elements; all future calls
of key()
function
will return without any searches through the source document.
Only after the processing of all keys of the stylesheet, the
XSLT Processor pushes all
parameters from the third argument of
the xslt()
function
into the stack of local variables.
Then, as described in the XSLT specification, it
initializes top-level variables and parameters. For every
<xsl:variable>
or
<xsl:param>
element found at the
top-level of the main stylesheet or at the top level of some imported
stylesheet, the processor calculates the value and pushes the created
variable into the stack of local variables. The
<xsl:param>
element is ignored if the
specified name is already declared in the vector of parameters or in
some stylesheet imported before. When all top-level variables and
parameters are initialized, the content of the stack of local
variables is moved into the stack of global variables, and the stack
of local variables is made empty. During the rest of the XSLT
transformation, these variables will be used as global variables. They
may be temporarily shadowed by inner declarations of local variables
- though not by declarations of local parameters - but they
cannot be changed.
Note that expressions for values of variables and parameters may contain
calls of key()
function,
because temporary indexes are ready to use before the first such
expression is calculated. Expressions of
<xsl:key>
elements may not refer to any
parameters or variables, due to the same reason.