XSL: передающие переменные между шаблонами

Действительно ли возможно передать переменную от одного родительского шаблона до его дочернего элемента?

<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

13
задан binaryguy 30 January 2010 в 16:17
поделиться

3 ответа

Вы можете пропустить параметры на именованные шаблоны, которые вы звоните через , например:

<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 от родителя родительского элемента«, в то время как моя версия означает », что« трактируйте цепочку элементов предка, пока не найдете первую с именем структуру , и получить свой путь атрибут ».

32
ответ дан 1 December 2019 в 17:39
поделиться

Точный код для вызова будет:

<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>
4
ответ дан 1 December 2019 в 17:39
поделиться

Две проблемы с структурой Шаблон :

  1. Вы применяете шаблоны, выбирающие папки , но имеют сопоставление шаблона на папке . Либо измените его в папку , или если у вас есть шаблон папок , убедитесь, что он проходит значение VAR1 значение параметра вниз до папки шаблон.
  2. Ваш с параметрами @Select использует '{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>
5
ответ дан 1 December 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: