在不同模板上使用xsl:with-param的XSLT调用模板

时间:2013-09-30 10:53:03

标签: xslt

我的实时XSLT文件存在问题。基于此,我在这里提出我的问题。 我有3个xslt文件,例如1.xsl2.xslmaster.xsl。此master.xsl已导入1.xsl2.xsl

在master.xsl上,我使用下面的代码

<xsl:call-template name="content">
<xsl:with-param name="request" select="$request"/>
<xsl:call-template>

同样明智的,1.xsl

<xsl:template name="content">
<xsl:param name="request" as="node()"/>
....
</xsl:template>

2.xsl

<xsl:template name="content">

....
</xsl:template>

当我执行此2.xsl时,我收到以下错误:

XTSE0680: Parameter request is not declared in the called template

实际上,只有在执行1.xsl时才需要请求变量。另外,我没有在2.xsl上的模板上声明虚拟变量。像这样,我实时有很多xslt文件。所以,我无法在许多xslt文件中声明相同的变量,因为它会有更多的时间而且它不会保持一致。

有人能给我一个克服这个想法的想法吗?

1 个答案:

答案 0 :(得分:2)

XSLT 2.0的规则明确地在http://www.w3.org/TR/xslt20/#err-XTSE0680中说:“在xsl:call-template的情况下,将名为x的非隧道参数传递给没有的模板是一个静态错误一个名为x的模板参数,除非为xsl:call-template指令启用了向后兼容的行为。“。

因此,如果您想使用代码

,请使用XSLT 2.0
<xsl:call-template name="content">
<xsl:with-param name="request" select="$request"/>
<xsl:call-template>

然后您需要确保所有被调用的模板content都声明了该参数request

我认为apply-templates的规则不同,因此您可以检查是否不能简单地使用match属性编写模板并使用apply-templates