Ik ken XSL niet echt, maar ik moet deze code corrigeren. Ik heb hem verkleind om het eenvoudiger te maken.
Ik krijg deze foutmelding
Ongeldige XSLT/XPath-functie
op deze regel
<xsl:variable name="text" select="replace($text,'a','b')"/>
Dit is de 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>
Kan iemand me vertellen wat er mis mee is?
Antwoord 1, autoriteit 100%
replace
is niet beschikbaar voor XSLT 1.0.
Codesling heeft een sjabloon voor string-replacedie u kunt gebruik als vervanging voor de functie:
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
<xsl:when test="$text = '' or $replace = ''or not($replace)" >
<!-- Prevent this routine from hanging -->
<xsl:value-of select="$text" />
</xsl:when>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:value-of select="$by" />
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="by" select="$by" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
aangeroepen als:
<xsl:variable name="newtext">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="$text" />
<xsl:with-param name="replace" select="a" />
<xsl:with-param name="by" select="b" />
</xsl:call-template>
</xsl:variable>
Aan de andere kant, als je letterlijk maar één teken door een ander hoeft te vervangen, kun je translate
die een vergelijkbare handtekening heeft. Iets als dit zou goed moeten werken:
<xsl:variable name="newtext" select="translate($text,'a','b')"/>
Houd er rekening mee dat ik in dit voorbeeld de variabelenaam heb gewijzigd in “newtext”, in XSLT zijn variabelen onveranderlijk, dus je kunt het equivalent van $foo = $foo
niet doen zoals jij had in uw originele code.
Antwoord 2, autoriteit 26%
Hier is de XSLT-functie die vergelijkbaar is met de String.Replace()-functie van C#.
Dit sjabloon heeft de 3 parameters zoals hieronder
tekst:- uw belangrijkste tekenreeks
vervang:- de tekenreeks die u wilt vervangen
door:- de tekenreeks die zal antwoorden met een nieuwe tekenreeks
Hieronder vindt u de sjabloon
<xsl:template name="string-replace-all">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:value-of select="$by" />
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="by" select="$by" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Het onderstaande voorbeeld laat zien hoe je het moet noemen
<xsl:variable name="myVariable ">
<xsl:call-template name="string-replace-all">
<xsl:with-param name="text" select="'This is a {old} text'" />
<xsl:with-param name="replace" select="'{old}'" />
<xsl:with-param name="by" select="'New'" />
</xsl:call-template>
</xsl:variable>
U kunt ook de onder URL voor de details verwijderen .
3, Autoriteit 9%
Opmerking: Als u de reeds genoemde algo wilt gebruiken voor gevallen waarin u een groot aantal gevallen in de bronstring moet vervangen (bijv. Nieuwe lijnen in lange tekst) is er High waarschijnlijkheid, u zult eindigen met StackOverflowException
vanwege de recursieve oproep.
Ik heb dit probleem opgelost dankzij Xalan ‘s (heeft er niet uitzien hoe het in Saksisch ) is ingebouwd Java-type Inbedding:
<xsl:stylesheet version="1.0" exclude-result-prefixes="xalan str"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
xmlns:str="xalan://java.lang.String"
>
...
<xsl:value-of select="str:replaceAll(
str:new(text()),
$search_string,
$replace_string)"/>
...
</xsl:stylesheet>
4, Autoriteit 4%
Ik blijf dit antwoord raken. Maar geen van hen geeft een lijst van de gemakkelijkste oplossing voor XSLTPROC (en waarschijnlijk de meeste XSLT 1.0-processors):
- Voeg de naam van de exSlt-strings toe aan de stylesheet, d.w.z.:
<xsl:stylesheet
version="1.0"
xmlns:str="http://exslt.org/strings"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- Gebruik het dan zoals:
<xsl:value-of select="str:replace(., ' ', '')"/>
5
De rouine is redelijk goed, maar het zorgt ervoor dat mijn app hangt, dus ik moest de zaak toevoegen:
<xsl:when test="$text = '' or $replace = ''or not($replace)" >
<xsl:value-of select="$text" />
<!-- Prevent thsi routine from hanging -->
</xsl:when>
Voordat de functie recursief wordt genoemd.
Ik heb het antwoord van hier:
Bij het testen in een oneindige lus
Bedankt!