Comment obtenir le dernier indice d'un caractère dans une chaîne de caractères?
J'ai la tâche suivante:
Il y a un élément xml contenant une longue chaîne. J'ai besoin d'utiliser xsl pour transformer cet élément dans un certain nombre de html <input>
balises. Il fonctionne comme ceci: si la chaîne est plus longue que celle d'un <input>
champ peut contenir sans défilement, je garde le même modèle de manière récursive pour créer un autre champ de saisie avec la remainig texte.
Le problème est que la chaîne est souvent coupée en deux au milieu de la parole qui n'est pas sympa.
Donc j'ai besoin de trouver la position de la dernière space
caractère qui n'est pas plus grande que la taille de la sous-chaîne qui s'inscrit dans la <input>
balise et d'imprimer uniquement la sous-chaîne avant sur la ligne.
J'ai donc préparer une sous-chaîne de longueur maximale, qui peut s'adapter dans le domaine, mais je n'ai aucune idée de comment faire pour obtenir l'index de la dernière space
en elle et de le passer comme paramètre dans le prochain appel de la fonction.
UPD: voici ce que j'ai obtenu jusqu'à présent
<xsl:template name="multilineInput">
<xsl:param name="input" select="."/>
<xsl:param name="maxFirst" select="."/>
<xsl:param name="firstLineWidth" select="."/>
<input>
<xsl:attribute name="readonly">readonly</xsl:attribute>
<xsl:attribute name="class">input_multiline</xsl:attribute>
<xsl:attribute name="style">width = "<xsl:value-of select="$firstLineWidth"/>"</xsl:attribute>
<xsl:attribute name="type">text</xsl:attribute>
<xsl:attribute name="value"><xsl:value-of select="substring($input, 1, $maxFirst)"/></xsl:attribute>
</input>
<xsl:if test="$maxFirst < string-length($input)">
<xsl:call-template name="multilineInput">
<xsl:with-param name="input" select="substring($input, $maxFirst+1, string-length($input)-$maxFirst)"/>
<xsl:with-param name="maxFirst" select="110"/>
<xsl:with-param name="firstLineWidth" select="'980'"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
OriginalL'auteur svz | 2012-09-28
Vous devez vous connecter pour publier un commentaire.
Cette transformation imlements un moyen simple et efficace de l'algorithme: le dernier espace dans une chaîne de caractères est le premier espace dans la chaîne inversée:
Lorsque cette transformation est appliquée sur n'importe quel document XML (non utilisé), le voulait, résultat correct est produit:
OriginalL'auteur Dimitre Novatchev
Le récursive modèle peut être utilisé pour retourner le dernier index d'un délimiteur:
Elle peut être invoquée comme ceci:
Et retours:
41
Vous pouvez attribuer le résultat du modèle d'appel à une variable comme ceci:
Ok, maintenant que nous avons obtenu ce 41, je ne suis pas sûr de comprendre comment l'utiliser correctement. Il imprime la valeur, mais je ne sais pas comment je dois le passer comme paramètre à un autre modèle ou comment je dois modifier mon template actuel de faire usage de cette. J'ai ajouté un exemple de ce que j'ai en ce moment et seront reconnaissants pour une explication. Merci.
Votre question est bien défini et a été entièrement résolus. S'il vous plaît, pensez à bien comment définir une nouvelle question avec le problème que vous êtes maintenant face -- il doit y avoir une complète (mais petite) document XML source, l'exact résultat voulu, et la description des règles du jeu que la transformation doit mettre en œuvre. S pour utiliser le résultat de l'appel d'un modèle -- vous devez appeler le modèle à l'intérieur du corps d'un
xsl:variable
-- puis utilisez cette variable, dans notre cas, sa valeur sera de 41.Novatchev, je vous Remercie. Juste ne pense pas que cela valait la peine de poster une nouvelle question.
Oui, 41 est la position correcte. Je pensais à une
0
index de base; la suite de travailler avec plusieurs langues et connaissance de Java et de JavaScript. J'ai aussi mis ma réponse à la poignée à plusieurs cas de bord que j'ai remarqué.OriginalL'auteur Mads Hansen
Vous pouvez utiliser le EXSLT
split
modèle (description; la mise en œuvre) outokenize
de diviser la chaîne en place par des espaces. Ensuite, vous pouvez imprimer tous les nœuds de texte à l'exception de la dernière, et/ou de l'utilisation de la longueur du dernier nœud de texte pour obtenir l'index de la dernière de l'espace.Voir aussi ce modèle qui pourraient s'adapter à vos besoins.
Malheureusement, il n'y a pas de EXSLT de soutien dans le processeur XSL.
La mise en œuvre je lien ne nécessite pas une prise en charge spéciale. C'est juste une norme XSLT 1.0 modèle.
OriginalL'auteur LarsH