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?
Répondre
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.
La variable $ join ne sert à rien. C'est déroutant et trompeur! Au lieu de "concat ($ join, child :: text())" utilisez simplement "text()". L'ensemble
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
@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"? –
Regardez les fonctions concat()
et string-join()
, c'est peut-être ce que vous recherchez.
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 –
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
Je pense que la récursivité peut fonctionner ici. Merci à tous. –
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.
- 1. Stringbuilder dans CIL (MSIL)
- 2. StringBuilder AppendFormat avec @
- 3. Émuler un serveur radius dans .NET
- 4. Comment émuler "AppendDataBoundItems" dans ComboBox de Silverlight?
- 5. Comment émuler le comportement 'include' dans MATLAB?
- 6. XSLT - activer la fonction XPath dans XSLT
- 7. comment émuler un bon motif
- 8. Problème avec StringBuilder et les littéraux XML
- 9. Les chaînes StringBuilder sont-elles immuables?
- 10. différences entre StringBuilder en Java et C#
- 11. StringBuilder: comment obtenir la chaîne finale?
- 12. stringbuilder append remplacer mon enregistrement if (! IsPostback)
- 13. Variables dynamiques dans XSLT
- 14. prédicats emboîtées dans xslt
- 15. variables dans xslt
- 16. Format SSN dans XSLT?
- 17. Importations multiples dans XSLT
- 18. Expression régulière dans XSLT
- 19. HTML pour émuler Vista Command Link?
- 20. Comment faire pour émuler ScriptManager.RegisterStartupScript() dans le projet ASP.NET MVC
- 21. Comment émuler l'opérateur de complément de langage dans .hgignore?
- 22. Comment émuler les paramètres printf de Python dans Ruby?
- 23. Comment puis-je émuler ErrorProvider dans .NET Compact Framework?
- 24. Comment émuler C# en tant qu'opérateur dans Java
- 25. Webtextedit Mousemove événement dans XSLT
- 26. Traitement XSLT dans/depuis ruby
- 27. Utilisation de RegEx dans XSLT
- 28. XSLT Résultats
- 29. MVC - Sortie HTML du code, préférable d'utiliser Response.OutputStream ou StringBuilder
- 30. XSLT foreach
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
Je cherche juste la fonctionnalité d'ajout. –
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 –