2009-07-01 69 views
12

Tôi đang viết phép chuyển đổi XSLT, trong đó tôi muốn sử dụng hàm Thay thế để thực hiện kết hợp regex và thay thế.Chức năng thay thế XSLT không tìm thấy

Tuy nhiên, Visual Studio 2008 báo cáo rằng

'replace()' là một chức năng XSLT rõ.

Các bit của mã chính nó là:

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

Có điều gì mà tôi đang làm sai?

Cảm ơn :)

Edit: Tôi đang sử dụng phiên bản này của XSLT, nhưng có vẻ như nó là phiên bản Visual Studio của đó là một vấn đề ... Tôi sẽ phải cố gắng tìm một cách giải quyết.

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

Trả lời

30

Chức năng replace chỉ khả dụng trong phiên bản XSLT 2.0, không có trong phiên bản 1.0 which is what Visual Studio uses. Chỉ vì bạn đã chỉ định version="2.0" không có nghĩa là Visual Studio hỗ trợ nó.

Here's a template on codesling that implements string-replace in XSLT 1.0. Bạn sẽ có thể sử dụng nó nhưng tôi không thể xác minh cho hiệu quả của nó.

(Trích từ liên kết ở trên)

<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ạn muốn gọi nó là như thế này:

<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

Bạn cần dấu nháy đơn trong s, chẳng hạn như select = "'TESTING'". –

9

Thay thế không hợp lệ trong XSLT 1.0. Bạn có "dịch()", mà có thể làm việc cho bạn, nhưng thay thế() là XSLT 2, và không phải là một phần của MS .NET XML codebase. Bạn có thể lấy nó với một số thư viện XML của bên thứ ba.

+1

Chính xác những gì tôi đang tìm kiếm dự án của mình. Cảm ơn! –

+0

Hoàn hảo, cảm ơn người đàn ông: D – codemania23

-1

Theo như tôi biết, replace() đã giới thiệu trong XLST 2.0. Định nghĩa phiên bản của tài liệu của bạn là gì? Có thể bạn đã thiết lập VS 2008 để sử dụng XLST 2.0 (nếu có thể).

0

bạn nên đã đặt Tính năng = chuỗi giữa dấu ngoặc kép như sau

<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

Đối thay thế chuỗi đơn giản các dịch chức năng (có sẵn trong XSLT 1.0) làm việc tốt cho tôi.

Tôi đã sử dụng nó để loại bỏ các khoảng trống cho các giá trị số.

+0

Chức năng dịch chỉ hoạt động trên các ký tự đơn. – JLRishe

4

Làm cách nào để nhúng tập lệnh C# để thay thế?

Thêm dòng sau vào dưới cùng của stylesheet của bạn:

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

Thêm một thuộc tính namespace tới phần tử stylesheet:

xmlns:scr="urn:scr.this"

Sau đó thực hiện như ....

<xsl:value-of select="scr:Replace(description/text(), 'ABC', '123')"/> 
Các vấn đề liên quan