2009-07-01 12 views
12

Ich schreibe eine XSLT-Transformation, in der ich die Replace-Funktion verwenden möchte, um eine Regex-Übereinstimmung zu erstellen und zu ersetzen.XSLT Replace-Funktion nicht gefunden

Visual Studio 2008 jedoch berichtet, dass

'replace()' ist eine unbekannte XSLT-Funktion.

Das Stück Code selbst ist:

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

Gibt es etwas, was ich falsch mache?

Thanks :)

Edit: ich diese Version von XSLT verwenden, aber es sieht aus wie Visual Studio-Version ist, die ein Problem ist ... Ich werde versuchen müssen, um Abhilfe zu schaffen.

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

Antwort

30

Die Funktion replace ist nur in XSLT Version 2.0 verfügbar, nicht in Version 1.0 which is what Visual Studio uses. Nur weil Sie version="2.0" angegeben haben, heißt das nicht, dass Visual Studio dies unterstützt.

Here's a template on codesling that implements string-replace in XSLT 1.0. Sie sollten es benutzen können, aber ich kann nicht für seine Effizienz bürgen.

(Entnommen aus dem obigen Link)

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

Sie es so nennen würden:

<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

Sie brauchen einfache Anführungszeichen in Ihren s, zB select = "'TESTING'". –

9

Ersetzen ist in XSLT 1.0 nicht gültig. Sie haben "translate()", was für Sie funktionieren könnte, aber replace() ist XSLT 2 und nicht Teil der MS .NET XML-Codebasis. Sie können es jedoch mit einigen Drittanbieter-XML-Bibliotheken bekommen.

+1

Genau das, was ich für mein Projekt gesucht habe. Vielen Dank! –

+0

Perfekt, danke Mann: D – codemania23

-1

Soweit ich weiß, war replace() einleitet in XLST 2.0. Wie lautet die Versionsdefinition Ihres Dokuments? Vielleicht müssen Sie VS 2008 so einstellen, dass XLST 2.0 verwendet wird (wenn möglich).

0

Sie die Eigenschaft gesetzt haben sollte = String in Anführungszeichen wie folgt

<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

Für einfachen string Ersatz arbeitete die übersetzen Funktion (erhältlich in XSLT 1.0) für mich in Ordnung.

Ich habe es verwendet, um Leerzeichen für numerische Werte zu entfernen.

+0

Die Übersetzungsfunktion funktioniert nur für einzelne Zeichen. – JLRishe

4

Wie wäre es mit der Einbettung eines C# -Skripts für den Ersatz?

Folgendes der Unterseite Ihres Sheet hinzufügen:

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

einen Namespace-Attribut in das Stylesheet Element hinzufügen:

xmlns:scr="urn:scr.this"

als Dann implementieren ....

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