Ich kenne XSL nicht wirklich, aber ich muss diesen Code korrigieren. Ich habe ihn reduziert, um ihn einfacher zu machen.
Ich erhalte diesen Fehler
Ungültige XSLT / XPath-Funktion
in dieser Zeile
<xsl:variable name="text" select="replace($text,'a','b')"/>
Dies ist die 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>
Kann mir jemand sagen, was daran falsch ist?
replace()
Funktion ab XPath 2.0 (und damit XSLT 2.0) verfügbar ist und das Ersetzen regulärer Ausdrücke unterstützt.Antworten:
replace
ist für XSLT 1.0 nicht verfügbar.Codesling verfügt über eine Vorlage zum Ersetzen von Zeichenfolgen, die Sie als Ersatz für die Funktion verwenden können:
aufgerufen als:
Wenn Sie dagegen buchstäblich nur ein Zeichen durch ein anderes ersetzen müssen, können Sie anrufen,
translate
das eine ähnliche Signatur hat. So etwas sollte gut funktionieren:Beachten Sie außerdem, dass ich in diesem Beispiel den Variablennamen in "newtext" geändert habe. In XSLT sind Variablen unveränderlich, sodass Sie nicht das Gleiche tun können,
$foo = $foo
wie Sie es in Ihrem ursprünglichen Code getan haben .quelle
translate
nicht daranreplace
. Diereplace
Funktion in XPath 2.0 behandelt ihr zweites Argument als regulären Ausdruck und ersetzt alle Übereinstimmungen dieses Ausdrucks durch die angegebene Ersetzungszeichenfolge (die möglicherweise$n
Verweise auf die Erfassung von Gruppen im regulären Ausdruck enthält ). Dietranslate
Funktion (in 1.0 und 2.0) ersetzt Einzelzeichen für Einzelzeichen.<xsl:with-param name="replace" select="'a'" />
mit Anführungszeichen um das a stehen?Hier ist die XSLT-Funktion, die ähnlich wie die String.Replace () -Funktion von C # funktioniert.
Diese Vorlage hat die folgenden 3 Parameter
Text : - Ihre Hauptzeichenfolge
Ersetzen : - Die Zeichenfolge, die Sie ersetzen möchten
von : - der Zeichenfolge, die mit einer neuen Zeichenfolge antwortet
Unten ist die Vorlage
Das folgende Beispiel zeigt, wie man es aufruft
Sie können auch die folgende URL für die Details verweisen .
quelle
Hinweis: Wenn Sie das bereits erwähnte Algo für Fälle verwenden möchten, in denen Sie eine große Anzahl von Instanzen in der Quellzeichenfolge ersetzen müssen (z. B. neue Zeilen im Langtext), besteht eine hohe Wahrscheinlichkeit, dass Sie
StackOverflowException
aufgrund der Rekursion enden Anruf.Ich habe dieses Problem dank der in Java eingebauten Java-Typ-Einbettung von Xalan behoben (ich habe nicht nachgesehen, wie man es auf Sächsisch macht ):
quelle
Cannot find a script or an extension object associated with namespace 'xalan://java.lang.String'.
<msxsl:script>
Block hinzufügen , der jede .NET-Methode, -Bibliothek usw. aufrufen kann. Obwohl .NET auch die EXSLT-Erweiterungsfunktionen unterstützt, müssen Sie dies nicht tun.Sie können den folgenden Code verwenden, wenn Ihr Prozessor unter .NET ausgeführt wird oder MSXML verwendet (im Gegensatz zu Java-basierten oder anderen nativen Prozessoren). Es verwendet
msxsl:script
.Stellen Sie sicher, dass Sie den Namespace
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
zu Ihrem Stammxsl:stylesheet
oderxsl:transform
Element hinzufügen .Binden Sie außerdem beispielsweise
outlet
an einen beliebigen Namespacexmlns:outlet = "http://my.functions"
.quelle
prefix outlet is not defined
oder'xsl:script' cannot be a child of the 'xsl:stylesheet' element.
wenn ich msxsl für mein Präfix ändere. Ich vermute, dies ist eine Microsoft-spezifische XSLT-Magie?xsl:script
, abermsxsl:script
, und es hat einen anderen Namespace (ich habe Johns Antwort aktualisiert).Ich treffe diese Antwort immer wieder. Aber keiner von ihnen listet die einfachste Lösung für xsltproc (und wahrscheinlich die meisten XSLT 1.0-Prozessoren) auf:
quelle
str:replace()
Funktion NICHT . Keiner der anderen großen XSLT 1.0-Prozessoren - Xalan, Saxon 6.5 und Microsoft.Die Rouine ist ziemlich gut, aber meine App bleibt hängen, daher musste ich den Fall hinzufügen:
bevor die Funktion rekursiv aufgerufen wird.
Ich habe die Antwort von hier bekommen: Beim Test hängen in einer Endlosschleife
Danke dir!
quelle