XSLT Parameters Overview
Parameters can be passed to either named or unnamed templates. Inside the template, parameters must be declared and can then be referenced by prefixing their name with the dollar sign ($).
Declaring Parameters
The scope of a parameter can be global or local. A parameter whose value is set by Junos OS at script initialization must be defined as a global parameter. Global parameter declarations are placed just after the style sheet declarations. A script can assign a default value to the global parameter, which is used in the event that Junos OS does not give a value to the parameter.
<?xml version="1.0" standalone="yes"?> <xsl stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0" xmlns:ext="http://xmlsoft.org/XSLT/namespace" version="1.0"> <!-- global parameter --> <xsl:param name="interface1"/>
Local parameters must be declared at the beginning of a block
and their scope is limited to the block in which they are declared.
Inside a template, you declare parameters using the <xsl:param>
tag and name
attribute. Optionally, declare
default values for each parameter by including the select
attribute, which can contain XPath expressions. If a template is invoked without the parameter, the
default expression is evaluated, and the results are assigned to the
parameter. If you do not define a default value in the template, the
parameter defaults to an empty string.
The following named template print-host-name
declares the parameter message
and defines
a default value:
<xsl:template name="print-host-name"> <xsl:param name="message" select="concat('host-name: ', system/host-name)"/> <xsl:value-of select="$message"/> </xsl:template>
The template accesses the value of the message
parameter by prefixing the parameter name with the dollar sign ($).
Passing Parameters
When you invoke a template, you pass arguments into the template
using the <xsl:with-param>
element and name
attribute. The value of the <xsl:with-param>
name
attribute must match the name of
a parameter defined in the actual template; otherwise the parameter
is ignored. Optionally, for each parameter you pass to a template,
you can define a value using either the select
attribute or the contents of the <xsl:with-param>
element.
The parameter value that gets used in a template depends on
how the template is called. The following three examples, which call
the print-host-name
template, illustrate
the possible calling environments.
If you call a template but do not include the <xsl:with-param>
element for a specific parameter, the default expression defined
in the template is evaluated, and the results are assigned to the
parameter. If there is no default value for that parameter in the
template, the parameter defaults to an empty string. The following
example calls the named template print-host-name
but does not include any parameters in the call. In this case, the
named template will use the default value for the message
parameter that was defined in the print-host-name
template, or an empty string if no default exists.
<xsl:template match="configuration"> <xsl:call-template name="print-host-name"/> </xsl:template>
If you call a template and include a parameter, but do not define
a value for the parameter in the calling environment, the script passes
in the current value of the parameter if it was previously initialized,
or it generates an error if the parameter was never declared. The
following example calls the named template print-host-name
and passes in the message
parameter,
but does not include a value. If message
is declared and initialized in the script, and the scope is visible
to the block, the current value of message
is used. If message
is declared in the
script but not initialized, the value of message
will be an empty string. If message
has
not been declared, the script produces an error.
<xsl:template match="configuration"> <xsl:call-template name="print-host-name"> <xsl:with-param name="message"/> </xsl:call-template> </xsl:template>
If you call a template, include the parameter, and define a
value for the parameter, the template uses the provided value. The
following example calls the named template print-host-name
with the message
parameter and a defined
value, so the template uses the new value.
<xsl:template match="configuration"> <xsl:call-template name="print-host-name"> <xsl:with-param name="message" select=concat"('Host-name passed in: ', system/host-name)"/> </xsl:call-template> </xsl:template>
Example: Parameters and Match Templates
The following template matches on /
, the root of the XML document. It then generates an element named <outside>
, which is added to the output document,
and instructs the Junos OS management process (mgd) to recursively apply templates to the configuration/system
subtree. The parameter host
is used in
the processing of any matching nodes.The value of the host
parameter is the value of the host-name
statement at the [edit system
] level of the configuration
hierarchy.
<xsl:template match="/"> <outside> <xsl:apply-templates select="configuration/system"> <xsl:with-param name="host" select="configuration/system/host-name"/> </xsl:apply-templates> </outside> </xsl:template>
The following template matches the <system>
element, which is the top of the subtree selected in the previous
example. The host
parameter is declared
with no default value. An <inside>
element
is generated, which contains the value of the host
parameter that was defined in the <xsl:with-param>
tag in the previous example.
<xsl:template match="system"> <xsl:param name="host"/> <inside> <xsl:value-of select="$host"/> </inside> </xsl:template>
Example: Parameters and Named Templates
The following named template report-changed
declares two parameters: dot
, which defaults
to the current node, and changed
, which
defaults to the changed
attribute of the
node dot
.
<xsl:template name="report-changed"> <xsl:param name="dot" select="."/> <xsl:param name="changed" select="$dot/@changed"/> <!-- ... --> </xsl:template>
The next stanza calls the report-changed
template and defines a source for the changed
attribute different from the default source defined in the report-changed
template. When the report-changed
template is invoked, it will use the newly defined source for the changed
attribute in place of the default source.
<xsl:template match="system"> <xsl:call-template name="report-changed"> <xsl:with-param name="changed" select="../@changed"/> </xsl:call-template> </xsl:template>
Likewise, the template call can include the dot
parameter and define a source other than the default current node,
as shown here:
<xsl:template match="system"> <xsl:call-template name="report-changed"> <xsl:with-param name="dot" select="../../> </xsl:call-template> </xsl:template>