调用XSL模板时的可选参数

时间:2009-05-06 17:28:22

标签: xslt

是否可以使用可选参数调用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”声明?

谢谢你, 亨利

4 个答案:

答案 0 :(得分:48)

您使用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传递的参数值。如果没有提供,则它将select属性的值设为完整XPath。

更多详情可在W3School's entry on param找到。

答案 1 :(得分:4)

就个人而言,我更喜欢做以下事情:

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

我喜欢明确地使用文本,以便我可以在我的XSL上使用XPath来进行搜索。在对我没有写或不记得的XSL进行分析时,它已经多次派上用场了。

答案 2 :(得分:2)

如果不传递参数,将使用param元素的select部分中的值。

您收到错误,因为变量或参数$ baz尚不存在。它必须在顶层定义才能在你的例子中工作,这不是你想要的。

此外,如果您将文字值传递给模板,那么您应该像这样传递它。

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

答案 3 :(得分:1)

如果您不需要<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>