[导入]在xslt中调用webservice的方法
在本系统中我需要将一些数据从数据库中取出,后来我基于扩展的问题,决定用webservice来实现,这样就要使用xslt来调用webservice的数据,我使用的C#语言的ASP.NET
首先,因为我调用的webservice不是一个而且经常变化,所以我必须采用动态的调用WebService的技术,我参考了以上文章,照抄了那个写得很不错的函数。
然后就要把xslt来与C#挂钩,这就要使用XSLT扩展,xslt的文件代码如下:
<?xml version="1.0" encoding="UTF-16" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:WebExam="urn:WebExam"> <!--注册命名前缀-->
<xsl:template match="/exam/questionGroups/choiceQuestion">
<xsl:value-of select="WebExam:GetQuestionsString(50000)"/><!--调用函数,50000是一个参数-->
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:WebExam="urn:WebExam"> <!--注册命名前缀-->
<xsl:template match="/exam/questionGroups/choiceQuestion">
<xsl:value-of select="WebExam:GetQuestionsString(50000)"/><!--调用函数,50000是一个参数-->
</xsl:template>
</xsl:stylesheet>
然后写这个函数申明,在C#中建立如下对象:
public class WebService
{
public string GetQuestionsString(string param)
{
return this.InvokeWebservice("http://kunhua/WebExam/action/Question.asmx","WebExam.Action","Question","GetQuestionsString",new object[]{param}).ToString();
}
private object InvokeWebservice(string url, string @namespace, string classname, string methodname, object[] args)
{
// try
// {
System.Net.WebClient wc = new System.Net.WebClient();
System.IO.Stream stream = wc.OpenRead(url+"?WSDL");
System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream);
System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter();
sdi.AddServiceDescription(sd,"","");
System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace);
System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn,ccu);
Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll");
System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if(true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace+"."+classname,true,true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
return mi.Invoke(obj,args);
// }
// catch(Exception ex)
// {
// throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace));
// }
}
}
{
public string GetQuestionsString(string param)
{
return this.InvokeWebservice("http://kunhua/WebExam/action/Question.asmx","WebExam.Action","Question","GetQuestionsString",new object[]{param}).ToString();
}
private object InvokeWebservice(string url, string @namespace, string classname, string methodname, object[] args)
{
// try
// {
System.Net.WebClient wc = new System.Net.WebClient();
System.IO.Stream stream = wc.OpenRead(url+"?WSDL");
System.Web.Services.Description.ServiceDescription sd = System.Web.Services.Description.ServiceDescription.Read(stream);
System.Web.Services.Description.ServiceDescriptionImporter sdi = new System.Web.Services.Description.ServiceDescriptionImporter();
sdi.AddServiceDescription(sd,"","");
System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace);
System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn,ccu);
Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll");
System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
if(true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
}
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace+"."+classname,true,true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodname);
return mi.Invoke(obj,args);
// }
// catch(Exception ex)
// {
// throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace));
// }
}
}
最后就是要把这个对象和xslt注册上,这个要使用XSLT扩展,即:
XslTransform xslt = new XslTransform();
xslt.Load("1.xslt");
XsltArgumentList xslArg = new XsltArgumentList(); //这段代码是关键
WebService obj = new WebService();
xslArg.AddExtensionObject("urn:WebExam", obj);
XmlDocument doc = new XmlDocument();
doc.Load("1.xml");
xslt.Transform(doc,xslArg,Response.Output,null);
xslt.Load("1.xslt");
XsltArgumentList xslArg = new XsltArgumentList(); //这段代码是关键
WebService obj = new WebService();
xslArg.AddExtensionObject("urn:WebExam", obj);
XmlDocument doc = new XmlDocument();
doc.Load("1.xml");
xslt.Transform(doc,xslArg,Response.Output,null);
posted on 2005-03-06 17:38 K_Reverter 阅读(292) 评论(0) 编辑 收藏 举报