XSLT-tekenreeks vervangen

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%

replaceis 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 translatedie 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 = $fooniet 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 StackOverflowExceptionvanwege 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):

  1. 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">
  1. 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!

Other episodes