我应该如何将参数从一个XSLT模板传递到另一个?

时间:2011-11-23 12:43:53

标签: xslt xslt-1.0

我无法将参数传递给模板。

<!-- // 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参数的值未传递给第二个模板。

感谢。

2 个答案:

答案 0 :(得分:3)

问题在于,当您执行apply-templates时,您当前的上下文位于实例元素上,因此属性 @id 指的是属性ID 实例元素,而不是您要选择的元素的属性(此时尚未选择)。

在给出的这个示例中,实际上不需要传递参数。只需在匹配模板中使用变量即可。在 xsl:param 的Insteaf中,执行以下操作:

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

这将为您获取 id 属性的值,因为您在此处位于元素上。

答案 1 :(得分: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>