Top-level xsl:param
and
xsl:variable
elements
both define variables by
binding a name to a value. This variable can be dereferenced
elsewhere in the stylesheet using the form
$
.
Once set, the value of an XSLT variable is fixed and cannot
be changed. However if the variable is defined with a
top-level name
xsl:param
element instead of an
xsl:variable
element, then the default value
can be changed before the transformation begins.
For example, the DocBook XSL stylesheets have a number of parameters that set various formatting options. I use these settings:
<xsl:param name="fop.extensions">1</xsl:param> <xsl:param name="page.width.portrait">7.375in</xsl:param> <xsl:param name="page.height.portrait">9.25in</xsl:param> <xsl:param name="page.margin.top">0.5in</xsl:param> <xsl:param name="page.margin.bottom">0.5in</xsl:param> <xsl:param name="region.before.extent">0.5in</xsl:param> <xsl:param name="body.margin.top">0.5in</xsl:param> <xsl:param name="page.margin.outer">1.0in</xsl:param> <xsl:param name="page.margin.inner">1.0in</xsl:param> <xsl:param name="body.font.family">Times</xsl:param> <xsl:param name="variablelist.as.blocks" select="1"/> <xsl:param name="generate.section.toc.level" select="1"/> <xsl:param name="generate.component.toc" select="0"/>
The initial (and thus final) value of any parameter can be
changed inside your Java code using these three methods of
the
Transformer
class:
public abstract void setParameter(String name, Object value);
public abstract Object getParameter(String name);
public abstract void clearParameters();
The setParameter()
method provides a
value for a parameter that overrides any value used in the
stylesheet itself. The processor is responsible for
converting the Java object type passed to a reasonable XSLT
equivalent. This should work well enough for
String
,
Integer
,
Double
, and
Boolean
as well as DOM types like
Node
and
NodeList
. However, I
wouldn’t rely on it for anything more complex like a
File
or a
Frame
.
The getParameter()
method returns
the value of a parameter previously set by Java. It will not
return any value from the stylesheet itself, even if it has
not been overridden by the Java code. Finally, the
clearParameters()
method eliminates
all Java mappings of parameters so that those variables are
returned to whatever value is specified in the stylesheet.
For example, in Java the above list of parameters for the
DocBook stylesheets could be set with a JAXP Transformer
object like this:
transformer.setParameter("fop.extensions", "1"); transformer.setParameter("page.width.portrait", "7.375in"); transformer.setParameter("page.height.portrait", "9.25in"); transformer.setParameter("page.margin.top", "0.5in"); transformer.setParameter("region.before.extent", "0.5in"); transformer.setParameter("body.margin.top", "0.5in"); transformer.setParameter("page.margin.bottom", "0.5in"); transformer.setParameter("page.margin.outer", "1.0in"); transformer.setParameter("page.margin.inner", "1.0in"); transformer.setParameter("body.font.family", "Times"); transformer.setParameter("variablelist.as.blocks", "1"); transformer.setParameter("generate.section.toc.level", "1"); transformer.setParameter("generate.component.toc", "0");
Here I used strings for all the values.
However, in a few cases I could have used a
Number
of some kind instead.