情况是我有两个xslt文件:一个是从我的ASP.NET代码中调用的,然后导入了第二个xslt文件。
我想要完成的是将参数传递给第一个参数,以便第二个xslt(在第一个xslt导入的那个)可以读取它。
我的c#代码如下所示:
var oArgs = new XsltArgumentList();
oArgs.AddParam("fbLikeFeatureName", "", "Facebook_Like_Button");
ltlContentBody.Text = xmlUtil.TransformXML(oXmlDoc, Server.MapPath(eSpaceId + "/styles/ExploringXSLT/ExploreContentObjects.xslt"), true);
我正在以这种方式抓住第一个xslt的参数:
<xsl:param name="fbLikeFeatureName" />
然后,将它传递给第二个xslt(之前,我导入该文件):
<xsl:call-template name="Articles">
<xsl:with-param name="fbLikeFeatureName"></xsl:with-param>
</xsl:call-template>
最后,我在第二个xslt文件中捕获参数如下:
<xsl:value-of select="$fbLikeButtonName"/>
我做错了什么?我是xslt的新人。
答案 0 :(得分:2)
将参数传递给Articles
模板时,您没有设置该参数的值。尝试
<xsl:call-template name="Articles">
<xsl:with-param name="fbLikeButtonName" select="$fbLikeFeatureName"/>
</xsl>
和十
<xsl:template name="Articles">
<xsl:param name="fbLikeButtonName"/>
...
<xsl:value-of select="$fbLikeButtonName"/>
...
</xsl:template>
使用with-param
时,name属性设置为被调用模板使用的参数名称(在本例中为Articles
)。然后,您可以使用select
(或xsl:with-param
的正文)来设置值。
答案 1 :(得分:1)
您无需将参数从第一个样式表“传递”到导入的样式表。当您在第一个样式表的顶层声明参数时,它将自动对所有导入的样式表可见。请考虑以下样式表:
template1.xsl:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="template2.xsl"/>
<xsl:param name="input-param"/>
<xsl:template match="/">
<xsl:apply-templates select="doc"/>
</xsl:template>
</xsl:stylesheet>
导入template2.xsl:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="doc">
<xsl:value-of select="$input-param"/>
</xsl:template>
</xsl:stylesheet>
然后我转换了以下文档:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="template1.xsl"?>
<doc/>
将输入参数“input-param”设置为“This is a test”。我得到以下输出(Saxon-B 9.1.0.7):
This is a test