Вы можете передавать параметры именованным шаблонам, которые вы вызываете через <xsl:call-template>
, например ::10000 *
<xsl:call-template name="name">
<xsl:with-param name="param" select="xpathexpr"/>
</xsl:call-template>
<xsl:template name="name">
<xsl:param name="param"/>
...
</xsl:template>
Когда вы вызываете именованный шаблон, контекстный узел является текущим контекстом. Таким образом, чтобы вызвать именованный шаблон для дочерних узлов, вам нужно изменить текущий контекст с помощью <xsl:for-each>
:
<xsl:for-each select="child">
<xsl:call-template name="name">
<xsl:with-param name="param" select="xpathexpr"/>
</xsl:call-template>
</xsl:for-each>
В вашем случае, тем не менее, нет необходимости передавать параметры, поскольку переменная, которую вы пытаетесь использовать, является чем-то, к чему можно перейти из контекстного узла. И вам не нужно использовать все эти переменные (и при этом вы не должны давать переменной имя, столь бесполезное, как var1
):
<xsl:template match="folder">
<xsl:variable name="linkarg" value="concat(../../@path, '\\', @name)"/>
<xsl:variable name="linktext" value="concat(../../@path, '\', @name)"/>
<th colspan="2" align="left" bgcolor="#FF5500">
<a onclick="foo('{$linkarg}')">
<xsl:value-of select="$linktext"/>
</a>
</th>
</xsl:template>
Кроме того, у меня будет соблазн использовать ancestor::structure[1]/@path
вместо ../../@path
, потому что это делает намерение намного более явным; ваша версия означает «получить атрибут path
из родительского элемента родительского элемента», а моя версия означает «проходить по цепочке элементов-предков до тех пор, пока вы не найдете первый с именем structure
и не получите его атрибут path
. «