Необязательные параметры при вызове XSL-шаблона
Можно ли вызвать шаблон XSL с дополнительными параметрами?
Например:
<xsl:call-template name="test">
<xsl:with-param name="foo" select="'fooValue'" />
<xsl:with-param name="bar" select="'barValue'" />
</xsl:call-template>
И получившееся определение шаблона:
<xsl:template name="foo">
<xsl:param name="foo" select="$foo" />
<xsl:param name="bar" select="$bar" />
<xsl:param name="baz" select="$baz" />
...possibly more params...
</xsl:template>
Этот код даст мне ошибку "Ошибка выражения: переменная" база "не найдена". Можно ли оставить декларацию "baz"?
Спасибо,
Генри
Ответы
Ответ 1
Вы используете неправильный синтаксис xsl:param
.
Сделайте это вместо:
<xsl:template name="foo">
<xsl:param name="foo" />
<xsl:param name="bar" />
<xsl:param name="baz" select="DEFAULT_VALUE" />
...possibly more params...
</xsl:template>
Параметр принимает значение параметра, переданного с помощью xsl:with-param
, которое соответствует имени оператора xsl:param
. Если ни один не предоставлен, он принимает значение атрибута select
для полного XPath.
Более подробную информацию можно найти на запись W3School по параметру.
Ответ 2
Лично я предпочитаю делать следующее:
<xsl:call-template name="test">
<xsl:with-param name="foo">
<xsl:text>fooValue</xsl:text>
</xsl:with-param>
Мне нравится явно использовать текст, чтобы я мог использовать XPath на моем XSL для выполнения поиска. Это пригодилось много раз, когда вы делали анализ на XSL, я не писал или не помню.
Ответ 3
Значение в части выбора элемента param будет использоваться, если вы не передадите параметр.
Вы получаете ошибку, потому что переменная или параметр $baz еще не существует. Он должен быть определен на верхнем уровне, чтобы он работал в вашем примере, а это не то, что вы хотели в любом случае.
Также, если вы передаете буквенное значение шаблону, вы должны передать его так.
<xsl:call-template name="test">
<xsl:with-param name="foo">fooValue</xsl:with-param>
Ответ 4
Пожалуйста, не используйте <xsl:param .../>
, если вам это не нужно для повышения удобочитаемости.
Это отлично работает:
<xsl:template name="inner">
<xsl:value-of select="$message" />
</xsl:template>
<xsl:template name="outer">
<xsl:call-template name="inner">
<xsl:with-param name="message" select="'Welcome'" />
</xsl:call-template>
</xsl:template>