Подтвердить что ты не робот

Необязательные параметры при вызове 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"?

Спасибо, Генри

4b9b3361

Ответ 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>