你可以在xsl中的模板中调用模板吗?

时间:2010-07-07 14:18:32

标签: xml xslt

你可以在模板中调用模板吗?例如:

如果我想使用

<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>

2 个答案:

答案 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处理器为您执行节点类型检查:)