XSLT - 捕获参数

时间:2010-05-13 19:46:58

标签: asp.net xslt

情况是我有两个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的新人。

2 个答案:

答案 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