XSLT Replace function not found

36,921

Solution 1

The replace function is only available in XSLT version 2.0, not in version 1.0 which is what Visual Studio uses. Just because you've specified version="2.0" doesn't mean that Visual Studio supports it.

Here's a template on codesling that implements string-replace in XSLT 1.0. You should be able to use it but I can't vouch for its efficiency.

(Taken from the link above)

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

You'd call it like this:

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

Solution 2

Replace is not valid in XSLT 1.0. You have "translate()", which might work for you, but replace() is XSLT 2, and not part of the MS .NET XML codebase. You can get it with some third party XML libraries though.

Solution 3

How about embedding a c# script to do the replacement?

Add the following to the bottom of your stylesheet:

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

Add a namespace attribute to the stylesheet element:

xmlns:scr="urn:scr.this"

Then implement as....

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

Note: This is only supported on .NET Framework, Code blocks are not supported on .NET Core and .NET 5

Solution 4

For simple string replacement the translate function (available in xslt 1.0) worked fine for me.

I used it to strip out spaces for numeric values.

Share:
36,921
Fiona - myaccessible.website
Author by

Fiona - myaccessible.website

I have a Pluralsight course on web accessibility: Making a Web Form Accessible Web accessibility is more straightforward than you'd think. This course starts with an inaccessible web form and steps through each of the changes necessary to make it accessible, including an introduction to testing with free screen reader software. About Me Director of Software Development at Xibis (web &amp; app development). Blogging about web accessibility at myaccessible.website Please email me at [email protected] or find me on Twitter.

Updated on January 06, 2022

Comments

  • Fiona - myaccessible.website
    Fiona - myaccessible.website over 2 years

    I am writing an XSLT transformation in which I wish to use the Replace function to do a regex match and replace.

    However, Visual Studio 2008 reports that

    'replace()' is an unknown XSLT function.

    The bit of code itself is:

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

    Is there anything that I am doing wrong?

    Thanks :)

    Edit: I am using this version of XSLT, but it looks like it is Visual Studio's version that is a problem...I'll have to try to find a workaround.

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
  • James Skemp
    James Skemp over 14 years
    Exactly what I was looking for for my project. Thanks!
  • David Rivers
    David Rivers over 13 years
    You need single quotes in your <xsl:with-param>s, such as select="'TESTING'".
  • Raven
    Raven over 2 years
    Correct me if I'm wrong but this could fail if you try to replace with something that contains the same as you are replacing, example would be escaping " with \", this would result in a infinite loop