XSL Plusieurs de rechercher et de remplacer la fonction
Je suis en essayant d'utiliser le XSL translate() de la fonction à créer quelque chose comme une recherche et remplacer la fonction comme suit:
<xsl:template name="create-id">
<xsl:param name="id" />
<xsl:call-template name="search-and-replace">
<xsl:with-param name="str" select="$id" />
<xsl:with-param name="search">0123456789</xsl:with-param>
<xsl:with-param name="replace">abcdefghij</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="search-and-replace">
<xsl:param name="str" />
<xsl:param name="search" />
<xsl:param name="replace" />
<xsl:variable name="newstr" select="translate($str, $search,
$replace)" />
<xsl:choose>
<xsl:when test="contains($newstr, $search)">
<xsl:call-template name="search-and-replace">
<xsl:with-param name="str" select="$newstr" />
<xsl:with-param name="search" select="$search" />
<xsl:with-param name="replace" select="$replace" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$newstr" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Cependant, quelque chose à propos de ma logique est faux qu'il semble l'être de dépouiller le dernier caractère dans la chaîne renvoyée. Ma conjecture est que translate() est seulement le remplacement de la première occurrence de chaque caractère de la chaîne et n'est pas vraiment récursive.
Des pensées ou d'entrée serait appréciée.
Post quelques exemples d'entrée et de sortie que vous voyez, avec ce que vous vous attendez à voir. Translate() ne peut pas faire ce que vous pensez qu'il fait, mais sans exemple nous ne pouvons pas dire ce que c'est.
translate() ne fait pas ce que vous en pensez. Ce n'est pas une bonne idée de faire des suppositions sur ce qu'est une fonction en fait, en regardant son nom: lire la spec en premier.
Bonne question, +1. Voir ma réponse complète XSLT 1.0 solution aux multiples remplacer le problème. Explication détaillée est fournie, trop.
translate() ne fait pas ce que vous en pensez. Ce n'est pas une bonne idée de faire des suppositions sur ce qu'est une fonction en fait, en regardant son nom: lire la spec en premier.
Bonne question, +1. Voir ma réponse complète XSLT 1.0 solution aux multiples remplacer le problème. Explication détaillée est fournie, trop.
OriginalL'auteur John | 2011-03-12
Vous devez vous connecter pour publier un commentaire.
La
translate()
fonction peut seulement remplacer un caractère par un autre caractère unique (ou avec les caractères vide (supprimer)). Il ne peut donc pas résoudre le problème de la chaîne de remplacement.Ici est un XSLT 1.0 solution à la remplacer problème:
lorsque cette transformation est appliquée sur le document XML suivant:
le voulait, résultat correct est produit:
Explication:
Un modèle nommé qui s'appelle elle-même de manière récursive est utilisé.
Tous les multiples de remplacement modèle --> remplacement paires sont prévues dans un seul paramètre externe, qui pour des raisons de commodité est indiquée en ligne, comme le niveau global de l'élément
<my:params>
.La récursivité prend chaque caractère dans la chaîne source (de gauche à droite) et trouve le premier motif qui commence par ce caractère à cette position dans la chaîne.
Le remplacement peut être non seulement une chaîne de caractères, mais aussi n'importe quel nœud. Dans ce cas précis, on remplace chaque caractère NL avec un
<br/>
élément.Vous êtes les bienvenus.
il ressemble à ce qui se passe à travailler pour moi. Cependant, j'ai besoin d'avoir au moins deux ensembles de paramètres pour définir la feuille de style. Comme mon expérience de travail avec les espaces de noms XSL est quelque peu limitée, comment pourrait-on modifier votre code pour passer à définir et à passer dans deux différents jeux de paramètres pour la multiReplace appel?
Le
<my:params>
arbre doit être passé en paramètre, ou peut-être dans un fichier XML distinct et le nom du fichier doit être passé en paramètre à la transformation. Maintenant, en passant de paramètres externes à la transformation dépend du processeur XSLT utilisés, il faut lire sa documentation. Je chose que votre meilleur itinéraire est d'accepter cette réponse et ensuite poser une question supplémentaire, en précisant le processeur XSLT vous utilisez et en demandant à la façon dont les paramètres doivent être transmises pour ce processeur XSLT. Je ou beaucoup d'autres peut donner de bonnes réponses.OriginalL'auteur Dimitre Novatchev
La définition de la
translate($arg, $mapString, $transString)
fonction est:Qui est, il n'est pas de remplacer une sous-chaîne par une autre chaîne, mais plutôt des cartes personnages à d'autres personnages. Pour la sous-chaîne de remplacement, utilisez quelque chose comme
OriginalL'auteur jelovirt
Semble que votre ne sera jamais vrai comme vous l'avez déjà remplacé tous les caractères de $recherche $à remplacer dans
à l'avance.
OriginalL'auteur Quincy
str:remplacer de exslt. C'est exactement ce que vous voulez, et qui est déjà écrit et le test par certains xslt gourous. La source xslt est également disponible il y.
La condition xsd doivent encore travailler, car il n'utilise pas de quelque chose de spécial.
OriginalL'auteur earlNameless