我无法将参数传递给模板。
<!-- // 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
参数的值未传递给第二个模板。
感谢。
答案 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>