是否可以使用可选参数调用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”声明?
谢谢你, 亨利
答案 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>