Ошибка передачи переменной в шаблон при помощи xsl:with-param

Неожиданно столкнулся с проблемой: при попытке передачи переменной в шаблон с помощью <xsl:with-param />.

Трансформер считал, что переменная не объявлена, хотя само выражение <xsl:param name="name" /> было составлено без ошибок. Не нашел сходу информацию, способную разъяснить мне причину ошибки (в докладе Нормана Уолша на самом деле прямо говориться, что param в шаблоне должен быть объявлен либо в самом верху, либо должен быть первым потомком).

Чтобы было нагляднее, покажу «неправильный код»:

<xsl:call-template name="field">
<xsl:with-param name="head" select="0"/>
</xsl:call-template>

<xsl:template name="field">
<xsl:variable name="from" select='/page/parameters/GET[@name="f"]/@value'/>
<xsl:param name="head"/>
<xsl:if test="$head!='0'">
<h1>Локация <xsl:value-of select="coord"/></h1>
</xsl:if>
</xsl:template>

а затем «правильный»:

<xsl:call-template name="field">
<xsl:with-param name="head" select="0"/>
</xsl:call-template>

<xsl:template name="field">
<xsl:param name="head"/>
<xsl:variable name="from" select='/page/parameters/GET[@name="f"]/@value'/>
<xsl:if test="$head!='0'">
<h1>Локация <xsl:value-of select="coord"/></h1>
</xsl:if>
</xsl:template>

Как можно заметить (если смотреть внимательно), примеры отличаются только порядком объявления переменных. Так вот, как выяснилось опытным путем, переменная xsl:param, для которой передается значение в шаблон, должна быть объявлена в самом начале шаблона. Иначе трансформатор считает, что переменная не объявлена в данном шаблоне.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *