你可以在模板中调用模板吗?例如:
如果我想使用
<xsl:choose>
<xsl:when test="//*[local-name()='RetrieveCCTransRq']">
<xsl:call-template name="SOAPOutput"/>
</xsl:when>
</xsl:choose>
<xsl:template name="SOAPOutput">
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<OutputPayload>
<TotalTransactions>
<xsl:value-of select="count(//Transaction)"/>
</TotalTransactions>
<Transactions>
<xsl:apply-templates/>
</Transactions>
</OutputPayload>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<xsl:template match="Transaction">
<xsl:choose>
<xsl:when test="contains(Type,'Debit')">
<Debit>
<xsl:apply-templates select="Date"/>
<xsl:apply-templates select="PostDate"/>
<xsl:apply-templates select="Description"/>
<xsl:apply-templates select="Amount"/>
</Debit>
</xsl:when>
<xsl:otherwise>
<Credit>
<xsl:apply-templates select="Date"/>
<xsl:apply-templates select="PostDate"/>
<xsl:apply-templates select="Description"/>
<xsl:apply-templates select="Amount"/>
</Credit>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="Date">
<Date>
<xsl:value-of select="."/>
</Date>
</xsl:template>
<xsl:template match="PostDate">
<PostDate>
<xsl:value-of select="."/>
</PostDate>
</xsl:template>
<xsl:template match="Description">
<Description>
<xsl:value-of select="."/>
</Description>
</xsl:template>
<xsl:template match="Amount">
<Amount>
<xsl:value-of select="."/>
</Amount>
</xsl:template>
</xsl:template>
答案 0 :(得分:6)
您可以从另一个模板调用模板,不能像您一样嵌套模板定义。将所有内部模板定义移至顶级,然后重试。
答案 1 :(得分:5)
<xsl:template>
指令只能在全局级别定义(必须是<xsl:stylesheet>
指令的子级)。
另一个建议是避免节点类型的条件测试。而不是:
<xsl:choose> <xsl:when test="//*[local-name()='RetrieveCCTransRq']"> <xsl:call-template name="SOAPOutput"/> </xsl:when> </xsl:choose>
建议使用此:
<xsl:template match="RetrieveCCTransRq">
<!-- Place the body of the named template here -->
</xsl:template>
通过这种方式,您不必编写上面引用的六行代码,您可以轻松地提交任何类型的错误。此外,您已将命名模板转换为匹配模板,获得更多灵活性和可重用性,并且您已经消除了一个程序(拉式)处理。 懒惰和聪明 - 让XSLT处理器为您执行节点类型检查:)