“Expression régulière”style remplacer en XSLT 1.0
J'ai besoin d'effectuer une rechercher et remplacer à l'aide de XSLT 1.0 qui est vraiment adapté à des expressions régulières. Malheureusement, elles ne sont pas disponibles en 1.0 et je suis également incapables d'utiliser les bibliothèques d'extension tels que EXSLT en raison des paramètres de sécurité je ne peux pas changer.
La chaîne, je travaille avec des regards comme:
19;#John Smith;#17;#Ben Reynolds;#1;#Terry Jackson
J'ai besoin de remplacer les numéros et ; #
caractères avec un ,
. Pour l'exemple ci-dessus serait de changer:
John Smith, Ben Reynolds, Terry Jackson
Je sais récursif de la fonction de chaîne est nécessaire, probablement à l'aide de sous-chaîne et de la traduire, mais je ne suis pas sûr où commencer.
Quelqu'un aurait-il quelques conseils sur la façon de faire ce travail? Voici ce que j'ai commencé avec:
<xsl:template name="TrimMulti">
<xsl:param name="FullString" />
<xsl:variable name="NormalizedString">
<xsl:value-of select="normalize-space($FullString)" />
</xsl:variable>
<xsl:variable name="Hash">#</xsl:variable>
<xsl:choose>
<xsl:when test="contains($NormalizedString, $Hash)">
<!-- Do something and call TrimMulti -->
</xsl:when>
</xsl:choose>
</xsl:template>
OriginalL'auteur Alex Angas | 2009-06-25
Vous devez vous connecter pour publier un commentaire.
J'espère que vous n'avez pas simplifié le problème de trop pour lui demander, parce que ce ne devrait pas être beaucoup d'un problème.
Vous pouvez définir un modèle et de manière récursive l'appeler aussi longtemps que vous gardez l'entrée de la chaîne de format uniforme.
Par exemple,
J'ai testé ce modèle avec l'appel suivant:
Et a obtenu le résultat suivant:
Qui semble être ce que vous êtes après.
L'explication de ce qu'il fait est facile à expliquer si vous êtes familier avec la programmation fonctionnelle. Le
InputString
paramètre est toujours dans la forme[number];#[name];#[rest of string]
. Chaque appel de laTrimMulti
modèle de côtelettes au large de la[number];#
partie et imprime le[name]
partie, puis passe le reste de l'expression de lui-même de manière récursive.Le cas de base est quand
InputString
est dans la forme[number];#[name]
, auquel cas leRemainingString
variable ne contiennent pas;#
. Puisque nous savons que c'est la fin de l'entrée, nous n'avons pas sortie une virgule de ce temps.Angas: Ouais, XSLT + de manipulation de chaîne = une douleur dans le cul. Heureusement, dans votre cas particulier, les noms ne sont pas très difficile à analyser. J'ai vu bien pire.
Fonctionne parfaitement et je la comprends. Merci!!!!
Là vous allez. 🙂 +1
AHA! Je vous l'ai dit!
OriginalL'auteur Welbog
Si le ';' et '#' caractères ne sont pas valides dans l'entrée parce qu'ils sont des délimiteurs alors pourquoi ne pas la fonction de traduction de travail? Il peut être laid (vous devez spécifier tous les caractères valides dans le deuxième argument et de les répéter dans le troisième argument), mais il serait plus facile à déboguer.
OriginalL'auteur Don