2011-11-23 116 views
0

我无法将参数传递给模板。如何将一个参数从一个XSLT模板传递到另一个?

<!-- // Product/Instances --> 
<xsl:template match="/data/products/instances"> 
    <ul> 
     <xsl:apply-templates select="item"> 
      <xsl:with-param name="idp" select="@id"/> 
     </xsl:apply-templates> 
    </ul> 
</xsl:template> 

<!-- // Product/Instances/Instance --> 
<xsl:template match="/data/products/instances/item"> 
    <xsl:param name="idp"/> 
    <p>$idp: <xsl:value-of select="$idp"/></p> <!-- $idp is empty --> 
    <xsl:for-each select="/data/instances/entry"> 
     <xsl:if test="@id = $idp"> 
      <p><xsl:value-of select="code"/></p> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

/data/products/instances/item具有名为id的属性,其具有的整数的值。

虽然第二个模板及其for-each循环正在处理中(我通过输出其中的虚拟输出来测试它们),但$idp参数的值未传递给第二个模板。

谢谢。

回答

1

您需要显示足够的详细信息才能重现问题,否则很难判断出了什么问题。

我认为你不需要任何参数,你应该使用一个关键

<xsl:key name="k1" match="data/instances/entry" use="@id"/> 

<!-- // Product/Instances --> 
<xsl:template match="/data/products/instances"> 
    <ul> 
     <xsl:apply-templates select="item"/> 
    </ul> 
</xsl:template> 

<!-- // Product/Instances/Instance --> 
<xsl:template match="/data/products/instances/item"> 

    <xsl:for-each select="key('k1', @id)"> 

      <p><xsl:value-of select="code"/></p> 

    </xsl:for-each> 
</xsl:template> 
3

的问题是,当你的应用模板,你目前的情况下是在实例元素等@id的属性指的是实例元素的属性ID,而不是属性项目要选择的元素(尚未在该点选择)。

在给出的示例中,实际上并不需要传入参数。只需在匹配模板中使用一个变量即可。在XSL的Insteaf:PARAM,请执行下列操作:

<xsl:variable name="idp" select="@id"/> 

这将得到id的值属性为你,因为你是定位在这一点上,项目元素。

+0

+1一个正确的答案。 –

+0

谢谢!您提供的'xsl:variable'解决方案是可行的。关于'xsl:with-param',我发现即使在执行''时,我也无法获得第二个整数输出模板。我也试过'item/@ id',认为上下文可能是问题。 –

相关问题