找不到XSLT替换功能

时间:2009-07-01 13:19:07

标签: xml regex xslt xpath replace

我正在编写一个XSLT转换,我希望使用Replace函数进行正则表达式匹配和替换。

但是,Visual Studio 2008会报告

  

'replace()'是一个未知的XSLT函数。

代码本身就是:

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

我有什么问题吗?

谢谢:)

编辑:我正在使用此版本的XSLT,但看起来它是Visual Studio的版本是一个问题......我将不得不尝试找到一种解决方法。

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

6 个答案:

答案 0 :(得分:31)

replace函数仅适用于XSLT 2.0版,而不适用于版本1.0 which is what Visual Studio uses。仅仅因为您指定了version="2.0"并不意味着Visual Studio支持它。

Here's a template on codesling that implements string-replace in XSLT 1.0。你应该可以使用它,但我不能保证它的效率。

(取自上面的链接)

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

你会这样称呼它:

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

答案 1 :(得分:9)

替换在XSLT 1.0中无效。你有“translate()”,它可能适合你,但replace()是XSLT 2,而不是MS .NET XML代码库的一部分。您可以使用某些第三方XML库来获取它。

答案 2 :(得分:5)

如何嵌入c#脚本来进行替换?

将以下内容添加到样式表的底部:

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

将一个名称空间属性添加到样式表元素:

xmlns:scr="urn:scr.this"

然后执行....

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

答案 3 :(得分:4)

对于简单的字符串替换,translate函数(在xslt 1.0中可用)对我来说很好。

我用它去除数值的空格。

答案 4 :(得分:0)

您应该将Feature =字符串放在引号之间,如下所示

<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

答案 5 :(得分:-1)

据我所知,replace()是在XSLT 2.0中引入的。您的文档的版本定义是什么?也许你要设置VS 2008使用XSLT 2.0(如果可能的话)。