2010-06-15 22 views
5

Tôi nhận được lỗi sau trong khi cố triển khai hàm mở rộng C# trong XSLT.Thông báo lỗi trong XSLT với chức năng mở rộng C#

thông số chức năng mở rộng hoặc giá trị trả về có CLR type 'Char []' không được hỗ trợ **

mã:.

<xsl:variable name="stringList"> 
    <xsl:value-of select="extension:GetList('AAA BBB CCC', ' ')"/> 
</xsl:variable> 

<msxsl:script language="C#" implements-prefix="extension"> 
<![CDATA[ 

public string[] GetList(string str, char[] delimiter) 
{ 
    ... 
    ... 
    return str.Split(delimiter, StringSplitOptions.None); 
} 

]]> 
</msxsl:script> 

Có thể ai đó giải thích thông báo lỗi này và làm thế nào để vượt qua nó?

EDIT: Tôi cần một giải pháp vẫn cho phép tôi triển khai chức năng chia tách và sử dụng mảng được trả về.

Cảm ơn!

+0

@iHeartGreek: Bạn yêu cầu ai đó giải thích lỗi này. Bây giờ, nếu bạn muốn có một chức năng tokenize, bạn phải hỏi một câu hỏi khác. Điều này có thể được thực hiện trong XSLT thuần túy, không cần phần mở rộng hay kịch bản. –

+0

@Alejandro: Không .. đó là ý định ban đầu của tôi. Có lỗi giải thích và làm thế nào để vượt qua nó. Bản chỉnh sửa của tôi đã làm cho nó rõ ràng hơn rằng "làm thế nào để vượt qua nó" có nghĩa là tôi cần để có thể vẫn làm những gì tôi muốn. Xin lỗi vì sự nhầm lẫn và cảm ơn vì những đóng góp của bạn. Tôi đã chọn câu trả lời khác theo cách nào đó do việc anh ta/cô ấy sử dụng một lời giải thích dễ đọc. Cảm ơn mặc dù! : D – developer

+0

@iHeartGreek: Có. Tôi không tìm kiếm bạn để xác nhận câu trả lời của tôi. Tôi đang nói rằng những gì bạn muốn bây giờ (khác với câu hỏi đầu tiên của bạn) nó có thể được thực hiện với XSLT thuần túy. Bằng cách này, câu hỏi của bạn có thể giúp người khác không nghĩ rằng để tách một chuỗi là cần thiết để sử dụng một phần mở rộng. –

Trả lời

6

Phương pháp mở rộng XSLT phải trả lại loại được hỗ trợ trong các phép biến đổi XSL. Bảng dưới đây cho thấy các loại XPath W3C và corresponging loại .NET của họ:

 
W3C XPath Type  | Equivalent .NET Class (Type) 
------------------------------------------------------ 
String    | System.String 
Boolean    | System.Boolean 
Number    | System.Double 
Result Tree Fragment | System.Xml.XPath.XPathNavigator 
Node Set    | System.Xml.XPath.XPathNodeIterator 

Bảng này được lấy từ phần loại Mapping giữa XSLT và .NET trong MSDN Magazine article này.

Thay vì trả lại một mảng string[] bạn sẽ phải trả lại một XPathNodeIterator như nó được thực hiện trong ví dụ sau:

<msxsl:script implements-prefix="extension" language="C#"> 
<![CDATA[ 

public XPathNodeIterator GetList(string str, string delimiter) 
{ 
    string[] items = str.Split(delimiter.ToCharArray(), StringSplitOptions.None); 
    XmlDocument doc = new XmlDocument(); 
    doc.AppendChild(doc.CreateElement("root")); 
    using (XmlWriter writer = doc.DocumentElement.CreateNavigator().AppendChild()) 
    { 
     foreach (string item in items) 
     { 
      writer.WriteElementString("item", item); 
     } 
    } 
    return doc.DocumentElement.CreateNavigator().Select("item"); 
} 
]]> 
</msxsl:script> 

Trong XSL bạn chuyển đổi thì bạn có thể duyệt qua các yếu tố trong tập hợp nút quay trở lại sử dụng xsl:for-each:

<xsl:template match="/"> 
    <root> 
     <xsl:for-each select="extension:GetList('one,two,three', ',')"> 
      <value> 
       <xsl:value-of select="."/> 
      </value> 
     </xsl:for-each> 
    </root> 
</xsl:template> 
+0

Vì vậy, tôi hoàn toàn không thể có bất kỳ loại danh sách nào? Tôi cần sử dụng chức năng chia nhỏ này, điều này cho tôi một danh sách. Làm thế nào bạn sẽ đề nghị nhận được xung quanh này? (đây là phần khác của câu hỏi của tôi .. làm thế nào để vượt qua lỗi .. nhưng tôi sẽ cập nhật câu hỏi của tôi để phản ánh điều này rõ ràng hơn ..) – developer

+0

@iHeartGreek: Tôi đã cập nhật với một ví dụ. Điều đó có giải quyết được vấn đề của bạn không? –

+0

cảm ơn! Tôi tin rằng điều này sẽ làm việc. Và sau đó tôi nhận được mỗi giá trị bằng cách sử dụng cho mỗi trong quyền xsl? – developer

0

Từ http://msdn.microsoft.com/en-us/library/533texsx(VS.71).aspx

Các đối số được cung cấp và các giá trị trả về được xác định bởi các hàm script phải là một trong các kiểu XPath hoặc XSLT của W3C. Bảng sau đây cho thấy các loại W3C tương ứng, các lớp .NET tương đương (Type) và loại W3C có phải là Loại XPath hay XSLT hay không.

Các vấn đề liên quan