K_Reverter的网页开发记录

要么不做,要么就当作艺术品来做!

导航

[导入]在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>

 

然后写这个函数申明,在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 @namespacestring 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
);


 

posted on 2005-03-06 17:38  K_Reverter  阅读(292)  评论(0编辑  收藏  举报