XSLT将每个结果传递到另一个模板

时间:2018-12-28 12:24:41

标签: xslt foreach parameters

我想将每个循环的a作为参数传递给另一个模板

<xsl:template name="dataTableGroup">
        <xsl:call-template name="test">
            <xsl:with-param name="pContent1">
                    <xsl:for-each
                        select="NewDataSet/Table[generate-id() = generate-id(key('countryKey', concat(Unit, ReportingBusUnitDesc)))]">

                        <tr>
                            <td class="columnTextRight">
                                <xsl:value-of select="ReportingBusUnitDesc"/>
                            </td>
                        </tr>
                    </xsl:for-each>                
            </xsl:with-param>
        </xsl:call-template>


    </xsl:template>

并在此处使用

<xsl:template name="test">
    <xsl:param name="pContent1"/>
    <xsl:for-each select="$pContent1">

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

但是我只得到值而不是节点。从概念上讲,我希望它可以与xslt 1.0一起使用。

1 个答案:

答案 0 :(得分:1)

如果使用XSLT 1.0处理器,则参数值是结果树片段,因此需要首先使用处理器特定的扩展功能,例如<xsl:template name="test"> <xsl:param name="pContent1"/> <xsl:for-each select="exsl:node-set($pContent1)/tr" xmlns:exsl="http://exslt.org/common"> </xsl:for-each> </xsl:template> http://exslt.org/exsl/functions/node-set/index.html),才能将其转换为节点集例如

<xsl:copy-of select="$pContent1"/>

无需复制任何扩展名即可以复制结果树片段的节点。 xsl:for-each应该可以。

为了示例的完整性,我在xsl:stylesheet/transform元素上声明了扩展功能的名称空间,通常您将其放在样式表的根元素exclude-result-prefixes="exsl"上,并另外使用{{1} },以确保名称空间不会出现在任何结果元素上。

使用XSLT 2或3处理器,将变量直接用作包含tr元素的片段节点不会有任何问题。