23 votes

Paramètres facultatifs lors de l'appel d'un modèle XSL

Existe-t-il un moyen d'appeler un modèle XSL avec des paramètres optionnels ?

Par exemple :

<xsl:call-template name="test">
  <xsl:with-param name="foo" select="'fooValue'" />
  <xsl:with-param name="bar" select="'barValue'" />
</xsl:call-template>

Et la définition du modèle qui en résulte :

<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>

Ce code me donne une erreur "Expression error : variable 'baz' not found". Est-il possible d'omettre la déclaration "baz" ?

Nous vous remercions, Henri

53voto

Welbog Points 32952

Vous utilisez le xsl:param syntaxe erronée.

Faites plutôt ceci :

<xsl:template name="foo">
  <xsl:param name="foo" />
  <xsl:param name="bar" />
  <xsl:param name="baz" select="DEFAULT_VALUE" />
  ...possibly more params...
</xsl:template>

Param prend la valeur du paramètre transmis à l'aide de la méthode xsl:with-param qui correspond au nom du xsl:param déclaration. Si aucune valeur n'est fournie, elle prend la valeur de l'élément select l'attribut XPath complet.

Plus d'informations sont disponibles sur le site W3School's entry on param .

4voto

Personnellement, je préfère procéder de la manière suivante :

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

J'aime l'utiliser explicitement avec du texte afin de pouvoir utiliser XPath sur mon XSL pour effectuer des recherches. Cela s'est avéré utile à de nombreuses reprises pour effectuer des analyses sur un XSL que je n'avais pas écrit ou dont je ne me souvenais pas.

2voto

BeWarned Points 1314

La valeur de la partie select de l'élément param sera utilisée si vous ne passez pas de paramètre.

Vous obtenez une erreur car la variable ou le paramètre $baz n'existe pas encore. Il faudrait qu'il soit défini au niveau supérieur pour qu'il fonctionne dans votre exemple, ce qui n'est pas ce que vous vouliez de toute façon.

De même, si vous passez une valeur littérale à un modèle, vous devez le faire de la manière suivante.

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

1voto

Peter Rader Points 3995

Ne pas utiliser <xsl:param .../> si vous n'en avez pas besoin pour améliorer la lisibilité.

Cela fonctionne très bien :

<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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X