Действительно ли возможно передать переменную от одного родительского шаблона до его дочернего элемента?
<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>
этот шаблон будет соответствовать:
<xsl:template match="folder">
<xsl:param name="var1"/>
<xsl:value-of select="$var1"/>
</xsl:template>
Вы видите, что я хочу использовать var в качестве var1 в подобранном шаблоне.
Как я могу сделать эту работу?
править: структура похожа на это:
<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>
в функции jscript строка без ее обратных косых черт. кто-либо знает почему?
C:xampplitehtdocsxamppimg
Вы можете пропустить параметры на именованные шаблоны, которые вы звоните через
, например:
<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 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>
Кроме того, я был бы соблазнен использовать : Структура [1] / @ Path
, а не ../../@ путь
, потому что он делает намерение намного более явным; Ваша версия означает «получить путь PATH
от родителя родительского элемента«, в то время как моя версия означает », что« трактируйте цепочку элементов предка, пока не найдете первую с именем структуру
, и получить свой путь
атрибут ».
Точный код для вызова будет:
<xsl:template match="structure">
<xsl:variable name="var"><xsl:value-of select="@path" /></xsl:variable>
<xsl:apply-templates select="folders/folder">
<xsl:with-param name="var1" select="$var"/>
</xsl:apply-templates>
</xsl:template>
другой способ доступа к атрибуту @Path root root, будет изменять ваш шаблон:
<xsl:template match="folder">
<xsl:value-of select="../../../@path"/>
</xsl:template>
Две проблемы с структурой
Шаблон :
папки
, но имеют сопоставление шаблона на папке
. Либо измените его в папку
, или если у вас есть шаблон папок
, убедитесь, что он проходит значение VAR1
значение параметра вниз до папки
шаблон. '{var}'
, который выбирает эту буквальную строку {var}
. Если вы хотите выбрать переменную var
, затем удалите окружающие цитаты и фигурные скобки и просто выберите $ var
. Прикладные изменения в вашу структуру
Шаблон:
<xsl:template match="structure">
<xsl:variable name="var"><xsl:value-of select="@path" /></xsl:variable>
<xsl:apply-templates select="folder">
<xsl:with-param name="var1" select="$var"/>
</xsl:apply-templates>
</xsl:template>