Неожиданно столкнулся с проблемой: при попытке передачи переменной в шаблон с помощью <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, для которой передается значение в шаблон, должна быть объявлена в самом начале шаблона. Иначе трансформатор считает, что переменная не объявлена в данном шаблоне.