运行环境:Windows7 + Visual Studio 2008 + IIS7.5
开发语言:ASP.Net(C#) + XSLT
目的:使用C#对XSLT进行转换
Xslt代码特点:包括脚本,脚本语言使用的是javascript,使用了concat函数,使用了document加载xml
症状:Altova中运行xml转换XSLT转换没有问题,但使用C#进行转换的时候报错,详细错误如下:
“/”应用程序中的服务器错误。
不支持包含 Clr 类型“ConcatString”的扩展函数参数或返回值。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Exception: 不支持包含 Clr 类型“ConcatString”的扩展函数参数或返回值。
诊断结果:
在Altova中转换没有问题,说明Xslt基本上没有问题,可能是.Net的特殊要求靠成的。
解决方案:
首先当然不能忘记百度了,外事问谷歌,内事问百度嘛,先问百度再问谷歌,结果大失所望,郎个大的互联网,居然没有人出现过这个问题。还是问谷歌吧,结果倒是有几条英文的,但都是在使用blog的时候出现这种问题,而且最终问题都没有解决,真是郁闷。看来只好自已动手丰衣足食了。
解决思路,既然网上找不到答案,也找不到解决的方法,那只好自己找条路了,最好还是最少代码法,什么意思呢,就删代码,一点一点地删,最终可以发现出问题的地方,根据我多年的经验,百试不爽。根据出错的提示,我起初怀疑是出在concat上,因为提示中有concatstring。但经过半个小时的折腾,终于发现问题的所在,问题是出在script的代码段,就是采用javascript的代码中,我的代码是这样的:
<![CDATA[ //获取静态文件 function getStaticFile(domain, file, type) { file = domain + file; if(type == "css") return '<link href="' + file + '" mce_href="' + file + '" rel="stylesheet" type="text/css" />'; else return '<mce:script language="javascript" mce_src="' + file + '"></mce:script>'; } function getStaticFiles(domain, file, type) { file = file.split(","); var result = ""; for(var i = 0; i <= file.length; i ++) { result += getStaticFile(domain, file[i], type) ; } return result; } ]]>
问题很奇怪,我在getStaticFiles函数的最后,直接return没问题,getStaticFile函数直接返回也没问题,但结果经过for循环之后,就报错了。最后的排错结果居然是+=上,把result += getStaticFile(domain, file[i], type) + "\n";改为result = result + getStaticFile(domain, file[i], type) ;,问题解决,非常奇怪。不知道为什么+=在C#的脚本会出现问题,有知道的朋友不妨给我留言,不胜感激。
注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/
本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/
浙公网安备 33010602011771号