Is it possible to pass a variable from one parent template to its child element ?
<xsl:template match="structure">
<xsl:variable name="var"><xsl:value-of select="@path" /></xsl:variable>
<xsl:apply-templates select="folders">
<xsl:with-param name="var1" select="'{var}'"/>
</xsl:apply-templates>
</xsl:template>
this template will match:
<xsl:template match="folder">
<xsl:param name="var1"/>
<xsl:value-of select="$var1"/>
</xsl:template>
You see I wanna use var as var1 in the matched template.
How can I make this work?
edit: the structure is like this:
<structure path="C:\xampplite\htdocs\xampp">
<folders>
<folder name="img">
<date>01/28/10 21:59:00</date>
<size>37.4 KB</size>
</folder>
</folders>
</structure>
edit2:
<xsl:template match="folder">
<xsl:variable name="var1"><xsl:value-of select="../../@path"/></xsl:variable>
<xsl:variable name="var2"><xsl:value-of select="@name" /></xsl:variable>
<xsl:variable name="var3"><xsl:value-of select="$var1"/>\<xsl:copy-of select="$var2"/> </xsl:variable>
<th colspan="2" align="left" bgcolor="#FF5500"><a onclick="foo('{$var3}')"><xsl:value-of select="$var3"/></a></th>
in the jscript function the string is without its backslashes. anyone knows why?
C:xampplitehtdocsxamppimg
Two problems with the
structure
template:folders
, but have a template matching onfolder
. Either change it tofolder
, or if you have afolders
template make sure that it passes thevar1
parameter value down to thefolder
template.'{var}'
, which selects that literal string{var}
. If you want to select thevar
variable, then remove the surrounding quotes and curly braces and just select$var
.Applied changes to your
structure
template:When using XSLT 2.0, it is possible to pass parameters to child templates, by adding
tunnel="yes"
to the<xsl:with-param .../>
at the callsite, and to the</xsl:with-param .../>
element at the called template as well. Just do:For further information, please refer to the section
10.1.2 Tunnel parameters
in the XSLT 2.0 specification.An extended example
With tunnel parameters, you could even do this:
Because of the tunnel attribute, the
var1
parameter is passed from the initial template through all intermediate templates into the"folder/date"
template.Just remember that the
tunnel="yes"
attribute declaration must be present both on the<xsl:param name="var1" tunnel="yes"/>
AND the corresponding<xsl:with-param name="var1" tunnel="yes" select="..."/>
attribute.The exact code for the call would be:
Another way to access the @path attribute of the root node would be modifying your template to:
You can pass parameters to named templates that you call via
<xsl:call-template>
, e.g.:When you call a named template, the context node is the current context. So to call a named template for child nodes, you need to change the current context by using
<xsl:for-each>
:In your case, though, there's no need to pass parameters, since the variable that you're trying to use is something that's navigable to from the context node. And you don't need to use all those variables (nor should you ever give a variable a name as useless as
var1
):Also, I'd be tempted to use
ancestor::structure[1]/@path
rather than../../@path
, because it makes the intention a lot more explicit; your version means "get thepath
attribute from the parent of the parent element", while my version means "traverse up the chain of ancestor elements until you find the first one namedstructure
, and get itspath
attribute."