.net 4 xslt转换扩展function坏了

我正在升级asp.net v3.5网络应用程序。 到v4,我在XmlDataSource对象上使用的XSLT转换遇到了一些问题。

XSLT文件的一部分:

                     

问题似乎就在于此

  

删除它并用普通文本替换它,它将工作。 我设置XML数据源的方式:

  xmlDataSource.TransformArgumentList.AddExtensionObject("ds:HttpUtility", new System.Web.HttpUtility()); xmlDataSource.Data = Cache.FetchPageMenu(); 

我一直在微软页面上搜索v4的任何变化,但找不到任何变化。 所有这些在v3.5(以及v2之前)中运行良好。 没有收到任何错误,数据只是没有显示。

问题似乎是.NET 4.0为HttpUtility.HtmlEncode引入了额外的重载。 高达.NET 3.5,存在以下重载:

 public static string HtmlEncode(string s); public static void HtmlEncode(string s, TextWriter output); 

.NET 4.0还具有以下方法:

 public static string HtmlEncode(object value); 

这会导致XslTransformException

(不明确的方法调用。扩展对象’ds:HttpUtility’包含多个’HtmlEncode’方法,它们有1个参数。

您可能没有看到exception,因为它被捕获到某个地方而没有立即报告。

使用.NET Framework类作为扩展对象是一件脆弱的事情,因为新的Framework版本可能会破坏您的转换。

修复方法是创建自定义包装类并将其用作扩展对象。 此包装类可能没有具有相同数量参数的重载:

 class ExtensionObject { public string HtmlEncode(string input) { return System.Web.HttpUtility.HtmlEncode(input); } } //... XsltArgumentList arguments = new XsltArgumentList(); arguments.AddExtensionObject("my:HttpUtility", new ExtensionObject());