2009-07-01 18 views
12

Sto scrivendo una trasformazione XSLT in cui desidero utilizzare la funzione Sostituisci per eseguire una corrispondenza regolare e sostituirla.XSLT Sostituisci funzione non trovata

Tuttavia, Visual Studio 2008 riporta che

'replace()' è una funzione XSLT sconosciuta.

Il bit di codice stesso è:

<xsl:otherwise> 
    <td style="border: solid 1px black; background-color:#00CC66;"> 
      <xsl:variable name="FeatureInfo" select="Text" /> 
       <xsl:value-of select="replace($FeatureInfo,'Feature=','TESTING')"/> 
    </td> 
</xsl:otherwise> 

C'è qualcosa che sto facendo male?

Grazie :)

Edit: Sto usando questa versione di XSLT, ma sembra che sia la versione di Visual Studio, che è un problema ... dovrò cercare di trovare una soluzione.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

risposta

30

La funzione replace è disponibile solo in XSLT versione 2.0, non in versione 1.0 which is what Visual Studio uses. Solo perché hai specificato version="2.0" non significa che Visual Studio lo supporta.

Here's a template on codesling that implements string-replace in XSLT 1.0. Dovresti essere in grado di usarlo ma non posso garantire per la sua efficienza.

(Tratto da link qui sopra)

<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> 

si definirebbe così:

<xsl:otherwise> 
    <td style="border: solid 1px black; background-color:#00CC66;"> 
    <xsl:variable name="FeatureInfo" select="Text" /> 
    <xsl:call-template name="string-replace-all"> 
     <xsl:with-param name="text" select="$FeatureInfo"/> 
     <xsl:with-param name="replace" select="Feature="/> 
     <xsl:with-param name="by" select="TESTING"/> 
    </xsl:call-template> 
    </td> 
</xsl:otherwise> 
+3

Hai bisogno di virgolette singole in s, come select = "'TESTING'". –

9

Sostituisci non valido in XSLT 1.0. Hai "translate()", che potrebbe funzionare per te, ma replace() è XSLT 2 e non fa parte della base di codice XML di MS .NET. Puoi ottenerlo con alcune librerie XML di terze parti.

+1

Esattamente quello che stavo cercando per il mio progetto. Grazie! –

+0

Perfetto, grazie uomo: D – codemania23

-1

Per quanto ne so, era replace() introduce in XLST 2.0. Qual è la definizione della versione del tuo documento? Forse devi impostare VS 2008 per utilizzare XLST 2.0 (se possibile).

0

si dovrebbe avere messo la feature = stringa tra virgolette come segue

<xsl:otherwise><td style="border: solid 1px black; background-color:#00CC66;"> <xsl:variable name="FeatureInfo" select="Text" /> <xsl:call-template name="string-replace-all">  <xsl:with-param name="text" select="$FeatureInfo"/>  <xsl:with-param name="replace" select="'Feature='"/>  <xsl:with-param name="by" select="TESTING"/> </xsl:call-template> </td></xsl:otherwise> 

Thanks 
4

Per la semplice sostituzione di stringa la funzione translate (disponibile in XSLT 1.0) ha funzionato bene per me.

L'ho usato per rimuovere spazi per valori numerici.

+0

La funzione di traduzione funziona solo su singoli caratteri. – JLRishe

4

Per quanto riguarda l'incorporamento di uno script C# per eseguire la sostituzione?

Aggiungere il seguente alla parte inferiore del foglio di stile:

<msxsl:script language="C#" implements-prefix="scr"> <![CDATA[ public string Replace(string stringToModify, string pattern, string replacement) { return stringToModify.Replace(pattern, replacement); } ]]> </msxsl:script>

Aggiungere un attributo namespace all'elemento foglio di stile:

xmlns:scr="urn:scr.this"

quindi implementare come ....

<xsl:value-of select="scr:Replace(description/text(), 'ABC', '123')"/>