2016-05-15 7 views
1

Ich möchte String mit xslt 1.0 zu finden und zu ersetzen. Das Problem ist, dass ich mehrere Strings mit unterschiedlichen Werten ersetzen .. Zum Beispiel meiner Eingabe xml ist als untenXSLT string replace, mehrere Strings

<process xmlns:client="http://xmlns.oracle.com/ErrorHandler" xmlns="http://xmlns.oracle.com/ErrorHandler"> 
    <client:result>The city name is $key1$ and Country name is $key2$ </client:result> 
</process> 

Ergebnis sein sollte

<process xmlns:client="http://xmlns.oracle.com/ErrorHandler" xmlns="http://xmlns.oracle.com/ErrorHandler"> 
    <client:result>The city name is London and Country name is England </client:result> 
</process> 

$ key1 $ und $ key2 $ ab Der Eingabestring sollte durch London und England ersetzt werden. Ich habe viele Beispiele gefunden, um einzelne Strings zu finden und zu ersetzen, aber ich bin mir nicht sicher, wie man mehrere Strings mit anderen Werten ersetzen kann. Irgendwelche Vorschläge?

Vielen Dank im Voraus

+1

ein möglichen Verfahren Siehe hier: http://stackoverflow.com/questions/33527077/change-html-dynamically-thru-xsl/33529970#33529970 –

Antwort

1

Es wäre viel einfacher, wenn Sie XSLT 2.0 oder höher verwenden könnte. Es könnte so einfach sein wie:

replace(replace(., '\$key1\$', 'London'), '\$key2\$', 'England') 

Wenn Sie jedoch mit XSLT 1.0 stecken, könnten Sie use a recursive template to perform the replace, und rufen Sie es für jedes der Token Sie (mit dem Produkt der vorherigen Anrufe als Eingabe ersetzen möchten zum nächsten):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:client="http://xmlns.oracle.com/ErrorHandler" 
    version="1.0"> 

    <xsl:template name="replace-string"> 
     <xsl:param name="text"/> 
     <xsl:param name="replace"/> 
     <xsl:param name="with"/> 
     <xsl:choose> 
      <xsl:when test="contains($text,$replace)"> 
       <xsl:value-of select="substring-before($text,$replace)"/> 
       <xsl:value-of select="$with"/> 
       <xsl:call-template name="replace-string"> 
        <xsl:with-param name="text" 
         select="substring-after($text,$replace)"/> 
        <xsl:with-param name="replace" select="$replace"/> 
        <xsl:with-param name="with" select="$with"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$text"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="client:result"> 
     <xsl:variable name="orig" select="string(.)"/> 
     <xsl:variable name="key1"> 
      <xsl:call-template name="replace-string"> 
       <xsl:with-param name="text" select="$orig"/> 
       <xsl:with-param name="replace" select="'$key1$'"/> 
       <xsl:with-param name="with" select="'London'"/> 
      </xsl:call-template> 
     </xsl:variable> 
     <xsl:variable name="key2"> 
      <xsl:call-template name="replace-string"> 
       <xsl:with-param name="text" select="$key1"/> 
       <xsl:with-param name="replace" select="'$key2$'"/> 
       <xsl:with-param name="with" select="'England'"/> 
      </xsl:call-template> 
     </xsl:variable> 

     <xsl:copy> 
      <xsl:value-of select="$key2"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Vielen Dank –

Verwandte Themen