XSLT chaîne de remplacer
Je ne sais pas vraiment XSL mais j'ai besoin de corriger ce code, j'ai réduit-il à la rendre plus simple.
J'obtiens cette erreur
Invalide XSLT/XPath fonction
sur cette ligne
<xsl:variable name="text" select="replace($text,'a','b')"/>
C'est le XSL
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:inm="http://www.inmagic.com/webpublisher/query" version="1.0">
<xsl:output method="text" encoding="UTF-8" />
<xsl:preserve-space elements="*" />
<xsl:template match="text()" />
<xsl:template match="mos">
<xsl:apply-templates />
<xsl:for-each select="mosObj">
'Notes or subject'
<xsl:call-template
name="rem-html">
<xsl:with-param name="text" select="SBS_ABSTRACT" />
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="rem-html">
<xsl:param name="text" />
<xsl:variable name="text" select="replace($text, 'a', 'b')" />
</xsl:template>
</xsl:stylesheet>
Quelqu'un peut me dire quel est le problème avec elle?
- Veuillez noter que le
replace()
fonction est disponible à partir de XPath 2.0 (et donc de XSLT 2.0) en avant et prend en charge les expressions régulières de remplacement.
Vous devez vous connecter pour publier un commentaire.
replace
n'est pas disponible pour XSLT 1.0.Codesling a un modèle de chaîne à remplacer vous pouvez l'utiliser comme un substitut de la fonction:
invoquée comme:
D'autre part, si vous avez littéralement seulement besoin de remplacer un caractère par un autre, vous pouvez appeler
translate
qui a la même signature. Quelque chose comme ceci devrait fonctionner:Aussi, remarque, dans cet exemple, j'ai changé le nom de la variable à "newtext", dans XSLT variables sont immuables, de sorte que vous ne pouvez pas faire l'équivalent de
$foo = $foo
comme vous l'avez fait dans votre code original.translate
, pasreplace
. Lereplace
fonction XPath 2.0 traite son deuxième argument comme un expression régulière et remplace toutes les correspondances de cette expression avec la chaîne de remplacement spécifiée (ce qui peut inclure$n
références à la capture des groupes dans la regex). Letranslate
fonction (1.0 et 2.0) est le caractère unique de unique de caractères de remplacement.<xsl:with-param name="replace" select="'a'" />
avec des guillemets autour de l'un?disable-output-escaping
-l'attribut est manquant. Je suppose qu'il doit être ajouté manuellement et si les deux variantes sont nécessaires, il y a deux modèles?Ici est la fonction XSLT qui fera le même travail à la Chaîne.Fonction de remplacement() de C#.
Ce modèle a les 3 Paramètres comme ci-dessous
texte :- votre chaîne principale
remplacer :- la chaîne que vous souhaitez remplacer
par :- la chaîne qui va répondre par une nouvelle chaîne de
Ci-dessous sont le Modèle
Exemple ci-dessous montre comment l'appeler
Vous pouvez également consulter le l'URL ci-dessous pour plus de détails.
Remarque: Dans le cas où vous souhaitez utiliser le déjà mentionné algo pour les cas où vous avez besoin de remplacer le grand nombre d'occurrences dans la chaîne source (par exemple, de nouvelles lignes dans le texte long) il y a haute probabilité, vous vous retrouverez avec
StackOverflowException
en raison de l'appel récursif.J'ai résolu ce problème grâce à Xalan's (n'a pas à chercher comment le faire dans Saxon) built-in Java de type intégration:
Cannot find a script or an extension object associated with namespace 'xalan://java.lang.String'.
<msxsl:script>
bloc, qui peut appeler à tout .Méthode NETTE, bibliothèques, etc. Cependant .NET prend également en charge la EXSLT fonctions d'extension, de sorte que vous n'avez pas besoin de.Vous pouvez utiliser le code suivant lors de votre processeur fonctionne sur .NET ou utilise MSXML (contrairement à Java ou autre natif de processeurs). Il utilise
msxsl:script
.Assurez-vous d'ajouter l'espace de noms
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
à la racine de votrexsl:stylesheet
ouxsl:transform
élément.En outre, lier
outlet
à aucun espace de noms que vous voulez, par exemplexmlns:outlet = "http://my.functions"
.prefix outlet is not defined
ou'xsl:script' cannot be a child of the 'xsl:stylesheet' element.
si je change msxsl pour mon préfixe. Je devine que c'est une partie spécifique de Microsoft XSLT magie?xsl:script
, maismsxsl:script
, et il dispose d'un espace de noms différent (j'ai mis à jour Jean-réponse).La rouine il est très bien, cependant, il provoque mon application à accrocher, j'ai donc besoin d'ajouter le cas:
avant que la fonction est appelée récursivement.
J'ai eu la réponse à partir d'ici:
Lors de l'essai de la pendaison dans une boucle infinie
Merci!