2009-07-01 23 views
12

Bir regex eşleşmesi yapmak ve değiştirmek için Değiştir işlevini kullanmak istediğim bir XSLT dönüşümü yazıyorum.XSLT Değiştir işlevi bulunamadı

Ancak, Visual Studio 2008 '() yerine'

bildirir bilinmeyen bir XSLT fonksiyonudur.

kodunun kendi bit: Ben yanlış yapıyorum şey

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

var mı?

Teşekkür :)

Düzenleme: XSLT bu sürümünü kullanıyorum, ama bu bir sorun Visual Studio'nun, versiyonudur gibi görünüyor ... Ben bir çözüm bulmaya gerekecek.

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

cevap

30

replace işlevi yalnızca 1.numaralı sürümde değil, XSLT sürüm 2.0 sürümünde kullanılabilir. Sadece version="2.0" belirtmiş olduğunuz için Visual Studio'nun desteklediği anlamına gelmez.

Here's a template on codesling that implements string-replace in XSLT 1.0. Onu kullanabilmeliydin ancak verimliliğini kefil edemem. (Yukarıdaki bağlantıdan Alınan)

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

Böyle derdim:

<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

s seçeneğinizde, select = "'TESTING'" gibi tek tırnaklara ihtiyacınız var. –

9

Değiştir, XSLT 1.0'da geçerli değil. Sizin için çalışabilecek "translate()" komutunuz var, ancak(), .NET Xml XML kodunun bir parçası değil XSLT 2'dir. Yine de bazı üçüncü parti XML kütüphaneleri ile alabilirsiniz.

+1

Projem için tam olarak neyi arıyordum. Teşekkürler! –

+0

Mükemmel, teşekkürler adam: D – codemania23

-1

olarak bildiğim kadarıyla, replace() XLST 2.0 tanıtır oldu. Belgenizin sürüm tanımı nedir? Belki VS 2008'i XLST 2.0 kullanacak şekilde ayarlamalısınız (eğer mümkünse).

0

Eğer Özelliği yerleştirilmiş olması gerekirdi = tırnak arasına dize (XSLT 1.0 kullanılabilir) tercüme işlevi benim için iyi çalıştı basit dize değiştirme için

<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

şöyle.

Sayısal değerler için boşluk bırakmak için kullandım.

+0

Çeviri işlevi yalnızca tek karakterler üzerinde çalışır. – JLRishe

4

Değiştirme yapmak için bir C# komut dosyası yerleştirmeye ne dersiniz?

senin stil altına aşağıdaki ekleyin:

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

stil elemana bir ad özellik ekleyin:

xmlns:scr="urn:scr.this"

Sonra da uygulamak ....

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