Необязательные параметры при вызове шаблона XSL - PullRequest
19 голосов
/ 06 мая 2009

Есть ли способ вызвать шаблон 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 »не найдена». Можно ли пропустить декларацию "Баз"?

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

Ответы [ 4 ]

48 голосов
/ 06 мая 2009

Вы используете неверный синтаксис 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 full XPath.

Более подробную информацию можно найти в Записи W3School по параметру .

4 голосов
/ 07 мая 2009

Лично я предпочитаю делать следующее:

<xsl:call-template name="test">  
   <xsl:with-param name="foo">
      <xsl:text>fooValue</xsl:text>
   </xsl:with-param>

Мне нравится явно использовать текст, чтобы я мог использовать XPath на своем XSL для выполнения поиска. Много раз это пригодилось, когда я выполнял анализ XSL, который я не писал или не помнил.

2 голосов
/ 06 мая 2009

Значение в части select элемента param будет использоваться, если вы не передадите параметр.

Вы получаете ошибку, поскольку переменная или параметр $ baz еще не существует. Это должно быть определено на верхнем уровне, чтобы оно работало в вашем примере, а это совсем не то, что вы хотели.

Также, если вы передаете литеральное значение в шаблон, вы должны передать его следующим образом.

<xsl:call-template name="test">  
    <xsl:with-param name="foo">fooValue</xsl:with-param>
1 голос
/ 25 ноября 2015

Пожалуйста, не используйте <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...