web-dev-qa-db-ja.com

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'が見つかりません」というエラーを表示します。 「baz」宣言を省略できますか?

ありがとう、ヘンリー

20
HumanSky

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>

Paramは、xsl:with-paramステートメントの名前と一致するxsl:paramを使用して渡されたパラメーターの値を取ります。何も指定されていない場合は、完全なXPathのselect属性の値を取ります。

詳細については、 W3Schoolのparamに関するエントリ を参照してください。

49
Welbog

個人的に、私は次のことをすることを好みます:

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

XSLでXPathを使用して検索を実行できるように、テキストで明示的に使用するのが好きです。私が書いたことがない、または覚えていないXSLで分析を行うときに、これは何度も役に立ちました。

4
Jay R

パラメータを渡さない場合は、param要素のselect部分の値が使用されます。

変数またはパラメーター$ bazがまだ存在しないため、エラーが発生します。あなたの例でそれが機能するためにはトップレベルで定義されなければならないでしょう、それはとにかくあなたが望んでいたものではありません。

また、リテラル値をテンプレートに渡す場合は、次のように渡す必要があります。

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

読みやすさを向上させるために<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>
1
Peter Rader