2009-02-10 10 views
4

J'essaye d'émuler le comportement de StringBuilder dans un XSL. Y a-t-il un moyen de faire cela. Il semble assez difficile compte tenu du fait que XSLT est un langage de programmation fonctionnelPeut-on émuler StringBuilder dans XSLT?

+0

Que voulez-vous dire par "Emulate StringBuilder"? StringBuilder fait un certain nombre de choses, dont la plus courante est l'ajout de chaînes, mais il peut aussi remplacer des sous-chaînes, rechercher une sous-chaîne, compter sa longueur, etc. Qu'est-ce que vous recherchez en particulier? Juste ajouter? Recherche? Quelle? – Welbog

+0

Je cherche juste la fonctionnalité d'ajout. –

+0

Il n'est pas possible de changer la valeur d'une variable en XSLT, une fois qu'elle a été définie. C'est par définition parce que XSLT est un langage fonctionnel. Cela ne veut pas dire qu'il n'y a pas mises en œuvre rapide de * chaînes immuables * (encore plus rapide que la chaîne .NET) - en savoir plus à ce sujet dans ma réponse –

Répondre

2

Vous pouvez obtenir les concatences cumulées simplement avec un peu de récursivité si vous regardez un ensemble de nœuds (du moment que vous pouvez construire le xpath pour trouver l'ensemble de nœuds), peut ajouter des morceaux arbitraires dans et hors du flux, il commence à devenir salissant.

Essayez ceci pour commencer (ne s'y joindre):

<xsl:template match="/"> 
    <xsl:variable name="s"> 
     <xsl:call-template name="stringbuilder"> 
      <xsl:with-param name="data" select="*" /><!-- your path here --> 
     </xsl:call-template> 
    </xsl:variable> 
    <xsl:value-of select="$s" /><!-- now contains a big concat string --> 
</xsl:template> 

<xsl:template name="stringbuilder"> 
    <xsl:param name="data"/> 
    <xsl:param name="join" select="''"/> 
    <xsl:for-each select="$data/*"> 
     <xsl:choose> 
      <xsl:when test="not(position()=1)"> 
       <xsl:value-of select="concat($join,child::text())"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="child::text()"/> 
      </xsl:otherwise> 
     </xsl:choose>  
    </xsl:for-each> 
</xsl:template> 

Toutes sortes d'extensions qui peuvent être requis: peut-être vous voulez couper, peut-être que vous voulez tunnel à travers des hiérarchies ainsi. Je ne suis pas sûr qu'une solution générale pare-balles existe.

+0

La variable $ join ne sert à rien. C'est déroutant et trompeur! Au lieu de "concat ($ join, child :: text())" utilisez simplement "text()". L'ensemble est inutile. utiliser un seul: "xsl: copy-of select = '$ data/text()'" –

+0

Vous êtes vraiment un type spécial de troll n'êtes-vous pas Dimitre? TRÈS TRÈS CLAIREMENT le paramètre de jointure est facultatif (voir où il a un select?) qui permet au constructeur de fonctionner comme une méthode .join (voir où je dis "ne se joint pas"?) qui nécessite la boucle, qui fournit une extension ("pour les débutants"?). – annakata

+0

@annakata Je ne comprends absolument pas ce qui est "TRÈS TRÈS CLAIREMENT" pour vous. Je me sens très curieux de savoir ce que cela peut être. Pouvez-vous expliquer et donner un petit exemple de l'utilisation du paramètre "join"? –

4

Regardez les fonctions concat() et string-join(), c'est peut-être ce que vous recherchez.

+0

Je cherche simplement la fonctionnalité appending. Et cela signifie que je veux stocker le résultat après l'ajout dans la même variable –

+0

Non, ce ne sera pas possible. Les variables sont immuables dans XSLT, vous ne pouvez pas les changer. Vous pouvez peut-être utiliser la récursivité pour obtenir un résultat similaire. Que veux-tu faire exactement? Pouvez-vous poster du code à votre question? – Tomalak

+0

Je pense que la récursivité peut fonctionner ici. Merci à tous. –

1

Vous pouvez utiliser tous disponibles standard XPath 2.0 string functions, comme concat(), substring(), substring-before(), substring-after(), string-join(), ..., etc.

Cependant, si vous avez besoin d'une mise en œuvre très rapide de chaînes (encore plus vite que la classe de chaîne .NET) vous serez probablement intéressé par le C# implementation du finger-tree data structure et the extension functions I provided pour le processeur XSLT saxon qui enveloppent la chaîne à base d'arbres doigt.