2010-07-07 4 views
4

pouvez-vous appeler un modèle dans un modèle? par exemple:pouvez-vous appeler un modèle dans un modèle en xsl

Si je voulais utiliser

<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

Qu'avez-vous essayé? Quel résultat avez-vous obtenu? Était-ce ce que vous attendiez? Si non, qu'attendiez-vous, et en quoi cela différait-il de ce que vous aviez? –

+0

J'ai corrigé votre formatage. À l'avenir, lorsque vous publiez du code XML, essayez de le mettre en retrait pour plus de lisibilité. –

+0

Bonne question (+1). Voir ma réponse pour l'explication et pour une recommandation de style de code. :) –

Répondre

5

Une instruction <xsl:template> ne peut être défini au niveau mondial (doit être un enfant de l'instruction <xsl:stylesheet>).

Une autre recommandation consiste à éviter les tests conditionnels d'un nœud de type. Au lieu de cela:

<xsl:choose> 
    <xsl:when test="//*[local-name()='RetrieveCCTransRq']"> 

    <xsl:call-template name="SOAPOutput"/> 
    </xsl:when> 
</xsl:choose> 

il est recommandé d'utiliser ce:

<xsl:template match="RetrieveCCTransRq"> 

    <!-- Place the body of the named template here --> 

</xsl:template> 

De cette façon, vous ne devez pas écrire les six lignes de code cités ci-dessus, que vous pourriez facilement commettre n'importe quel type d'erreur. En outre, vous avez converti un modèle nommé en un modèle correspondant, en obtenant plus de flexibilité et de réutilisabilité, et vous avez éliminé une partie du traitement procédural (en mode déroulant). Soyez paresseux et intelligent - laissez le processeur XSLT faire la vérification de type de nœud pour vous :)

6

Vous pouvez appeler un modèle à partir d'un autre modèle, vous ne pouvez pas modèle nid DEFINITIONS que vous avez fait. Déplacez toutes les définitions de modèle interne au niveau supérieur et réessayez.

Questions connexes