2010-07-22 3 views
1

Donc, je sais que vous ne pouvez pas accéder à des variables en dehors de la portée, qu'ils sont immuables, que XSLT est fonctionnel non impératif, etc ...XSLT 2.0 Comment faire des compteurs et des variables à travers différentes boucles et structure

Mais j'ai besoin d'une approche d'usage général pour quelque chose qui serait trivial avec les variables mutables globales (cela semble mal juste le dire :). Voici un exemple ...

<xsl:template match="t1"> 
    <xsl:if test="someLogic"> 
    <!-- I know, can't do this but just to explain... --> 
    <xsl:variable name="varName">numberOrText, maybe even some arithmetic like $varName+1</xsl:variable> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="t2"> 
    <xsl:value-of select="$varName"/> 
</xsl:template> 

Et le défi est qu'il pourrait y avoir un certain nombre de modèles comme t1 et t2 à tout moment au cours du traitement et des modèles que les deux modifier et utiliser la variable.

Peut-être qu'une partie du problème est que les valeurs dépendent de l'ordre de traitement, mais c'est délibéré - c'est ce qui est nécessaire.

Une possibilité que j'ai pensé était de passer les valeurs partout comme paramètres. Mais le problème est que le modèle d'une feuille peut avoir besoin de le changer, puis le traitement remonte ... il perd ce changement. À moins qu'il y ait un moyen pour un modèle de renvoyer des paramètres et puis je pourrais transmettre ces paramètres retournés? En pensant à un langage de programmation fonctionnel purement générique, il semble que c'est comme cela que l'on peut faire cela - appeler récursivement, mais en utilisant les valeurs de retour pour d'autres appels afin de pouvoir "reporter" les valeurs. J'ai vu cela fait en utilisant des extensions - en appelant des méthodes Java ou quelque chose comme ça et puis vous pouvez avoir des valeurs mutables globales, mais ... Je préfère vraiment ne pas "tricher" comme ça.

Tous les pointeurs, idées, etc., sont les bienvenus.

+1

Une autre idée ... qui suit l'idée de "retourner" ... Tous les modèles prennent les valeurs en tant que paramètres. À la fin de chaque modèle, affiche un noeud avec des attributs avec toutes les valeurs que je veux transmettre. Chaque appel à apply-templates est enveloppé dans une variable et immédiatement après l'appel, effectuez un certain type de valeur sur la variable pour que le dernier nœud reçoive les valeurs "retournées". Effectuez une seconde passe sur l'ensemble pour supprimer les nœuds "retour". Hmm ... ça sonne plutôt moche, mais on dirait que ça pourrait marcher. Je me réjouis de meilleures idées. – mentics

+0

Je pense que cela peut être fait avec un motif de traversée d'arbre et un paramètre de tunnel les plus fins. Seulement avec l'entrée et la sortie, il est possible de dire exactement comment. –

Répondre

0

Je pense que la réponse a été incluse dans ma question et d'autres commentaires. En citer quelques-uns:

"d'une certaine façon pour un modèle de retourner les paramètres, puis je pourrais transmettre ces paramètres retournés? Penser à un langage de programmation fonctionnel pur usage général, il semble que c'est comme ça que l'on pourrait faire this-- appel récursivement, mais en utilisant les valeurs de retour pour les appels ultérieurs afin que l'on puisse "reporter" les valeurs. " De l'utilisateur 357812: "Je pense que cela peut être fait avec un motif de traversée d'arbre et un paramètre tunnel les plus fins. Seulement avec l'entrée et la sortie, il est possible de dire exactement comment."

Questions connexes