2009-07-01 18 views
12

Estoy escribiendo una transformación XSLT en la que deseo usar la función Reemplazar para hacer una coincidencia de expresiones regulares y reemplazar.XSLT Reemplazar función no encontrada

Sin embargo, Visual Studio 2008 informa que

'replace()' es una función XSLT desconocido.

El bit de código en sí mismo es:

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

¿Hay algo que estoy haciendo mal?

Gracias :)

Editar: estoy usando esta versión de XSLT, pero parece que es la versión de Visual Studio que es un problema ... Voy a tener que tratar de encontrar una solución.

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

Respuesta

30

La función replace solo está disponible en XSLT versión 2.0, no en la versión 1.0 which is what Visual Studio uses. El hecho de que haya especificado version="2.0" no significa que Visual Studio lo admita.

Here's a template on codesling that implements string-replace in XSLT 1.0. Debería poder usarlo, pero no puedo garantizar su eficacia.

(Tomado del enlace anterior)

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

que se podría llamar así:

<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

Necesita comillas simples en su s, como select = "'TESTING'". –

9

Reemplazar no es válido en XSLT 1.0. Tiene "translate()", que podría funcionar para usted, pero replace() es XSLT 2 y no parte de la base de código XML de MS .NET. Sin embargo, puede obtenerlo con algunas bibliotecas XML de terceros.

+1

Exactamente lo que estaba buscando para mi proyecto. ¡Gracias! –

+0

Perfecto, gracias hombre: D – codemania23

-1

Por lo que yo sé, replace() fue introduce en XLST 2.0. ¿Cuál es la definición de versión de su documento? Quizás deba configurar VS 2008 para utilizar XLST 2.0 (si es posible).

0

que debería haber colocado la función = cadena entre comillas como sigue

<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

Para el reemplazo de cadena sencilla la función de traducir (disponible en XSLT 1.0) funcionó bien para mí.

Lo usé para eliminar espacios para valores numéricos.

+0

La función de traducir solo funciona en caracteres individuales. – JLRishe

4

¿Qué le parece incrustar un script C# para hacer el reemplazo?

Añadir lo siguiente a la parte inferior de la hoja de estilos:

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

Añadir un atributo de espacio de nombres para el elemento de hoja de estilo:

xmlns:scr="urn:scr.this"

A continuación, aplicar como ....

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