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.