WSDL2Ajax

来源:互联网 发布:e。target js 编辑:程序博客网 时间:2024/05/17 04:27

<?xml version="1.0"?>

<!--
 Web服务AJAX接口生成器(XSLT)
 
 根据WSDL文档定义,自动生成AJAX访问Web服务的函数接口,

已测试google搜索的wsdl  

尚未完成功能:
 1、服务请求的参数只能是简单类型,不支持对象和数组
 2、返回类型支持简单类型和复杂对象,不支持数组,而且复杂对象中只能包含简单类型
-->
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:wsdlns="http://schemas.xmlsoap.org/wsdl/"
 xmlns:wsdlsoapns="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="text"/>

    <xsl:variable name="targetNameSpace"><xsl:value-of select="/wsdlns:definitions/@targetNamespace"/></xsl:variable>
   
    <!--
 ########因为服务访问端点的地址,有可能针对wsdl里面的每个service都不同,而目前还为解决地址的传递,所以此文档只适合
 一个wsdl文档中只有一个service的情况############
 -->
 <xsl:variable name="location"><xsl:value-of select="/wsdlns:definitions/wsdlns:service/wsdlns:port/wsdlsoapns:address/@location"/></xsl:variable>

    <xsl:template match="/wsdlns:definitions">
  <!--ibm ajax-ws包导入-->
  
  <script type="text/javascript" src="scripts/prototype.js"></script>
  
  <script type="text/javascript" src="scripts/ws.js"></script>
  
  
  
     <script language="javascript">
     
     
     
     <!--声明复杂对象-->
     <xsl:apply-templates select="wsdlns:types/xs:schema/xs:complexType"/>
     
     <!--声明SOAP响应解析函数-->
     <xsl:apply-templates select="wsdlns:portType" mode="parse"/>
     
     <!--声明callback函数-->
     <xsl:apply-templates select="wsdlns:portType/wsdlns:operation" mode="callback"/>
     
     <!--声明服务对象及其成员函数-->
     <xsl:apply-templates select="wsdlns:service"/>

     
     
     </script>
     
    </xsl:template>
   
   
    <!--形成复杂对象的javascript对象声明  模板-->
    <xsl:template match="xs:complexType">
  //<xsl:value-of select="@name"/>复杂对象声明
     function <xsl:value-of select="@name"/>()
  {
     
   <xsl:apply-templates select="xs:sequence/xs:element"/>
   <xsl:apply-templates select="xs:all/xs:element"/>
     }
     
     
    
    </xsl:template>
   
    <!--处理SOAP响应消息,形成结果对象  模板-->
 <xsl:template match="wsdlns:portType" mode="parse">
  <xsl:for-each select="wsdlns:operation">
   <xsl:apply-templates select="wsdlns:output" mode="parse"/>
  </xsl:for-each>
  
    </xsl:template> 
   
    <xsl:template match="wsdlns:output" mode="parse">
  <xsl:variable name="message" select="@message"/>
  <xsl:apply-templates select="/wsdlns:definitions/wsdlns:message[@name=substring-after($message,':')]" mode="parse"/>
    </xsl:template>
    <xsl:template match="wsdlns:message" mode="parse">
  function parse_<xsl:value-of select="@name"/>(responseText) {
   var xmlDoc = new ActiveXObject("Msxml2.DOMDocument");
   xmlDoc.async = false;
   xmlDoc.loadXML(responseText);
   <xsl:variable name="typename" select="substring-after(wsdlns:part/@type,':')"/>
   <xsl:choose>
    <xsl:when test="/wsdlns:definitions/wsdlns:types/xs:schema/xs:complexType/@name=$typename">
     var <xsl:value-of select="$typename"/>_value = new <xsl:value-of select="$typename"/>();
     <xsl:call-template name="complextyperesp">
     <xsl:with-param name="msgname" select="@name"/>
     <xsl:with-param name="typename" select="$typename"/>
     </xsl:call-template>
     
     return <xsl:value-of select="$typename"/>_value;
    </xsl:when>
    <xsl:otherwise>
     
     
     var currNode;
     currNode = xmlDoc.documentElement.selectSingleNode("/SOAP-ENV:Envelope/SOAP-ENV:Body/<xsl:value-of select="@name"/>/return/<xsl:value-of select="$typename"/>");
     return currNode.text;
    </xsl:otherwise>
   </xsl:choose>
  }
    </xsl:template>
 
 <xsl:template match="xs:complexType" mode="parse" name="complextyperesp">
  <xsl:param name="msgname"/>
  <xsl:param name="typename"/>
  var currNode;
  
  <xsl:for-each select="/wsdlns:definitions/wsdlns:types/xs:schema/xs:complexType[@name=$typename]/xs:all/xs:element">
   <!--currNode = xmlDoc.documentElement.selectSingleNode("/SOAP-ENV:Envelope/SOAP-ENV:Body/<xsl:value-of select="$msgname"/>/return/<xsl:value-of select="@name"/>");-->
   currNode = xmlDoc.documentElement.selectSingleNode("/SOAP-ENV:Envelope/SOAP-ENV:Body");
   var oNodeList = currNode.childNodes;
   for (var i=0; i&lt;oNodeList.length; i++) {
    var Item = oNodeList.item(i);
    if(Item.nodeType == 1) {
     currNode = Item;
     break;
    } 
   }
   currNode = currNode.selectSingleNode("return/<xsl:value-of select="@name"/>");
   <xsl:value-of select="$typename"/>_value.<xsl:value-of select="@name"/> = currNode.text;
  </xsl:for-each>
  <xsl:for-each select="/wsdlns:definitions/wsdlns:types/xs:schema/xs:complexType[@name=$typename]/xs:sequence/xs:element">
   <!--currNode = xmlDoc.documentElement.selectSingleNode("/SOAP-ENV:Envelope/SOAP-ENV:Body/<xsl:value-of select="$msgname"/>/return/<xsl:value-of select="@name"/>");-->
   currNode = xmlDoc.documentElement.selectSingleNode("/SOAP-ENV:Envelope/SOAP-ENV:Body");
   var oNodeList = currNode.childNodes;
   for (var i=0; i&lt;oNodeList.length; i++) {
    var Item = oNodeList.item(i);
    if(Item.nodeType == 1) {
     currNode = Item;
     break;
    } 
   }
   currNode = currNode.selectSingleNode("return/<xsl:value-of select="@name"/>");
   <xsl:value-of select="$typename"/>_value.<xsl:value-of select="@name"/> = currNode.text;
  </xsl:for-each>
 </xsl:template>

    <!--声明callback函数-->
    <xsl:template match="wsdlns:operation" mode="callback">
  //<xsl:value-of select="@name"/>消息的回调函数
  function callback_<xsl:value-of select="@name"/>(call,envelope){
   var responseText = arguments[2];
   //alert(responseText);
   var return_obj = parse_<xsl:value-of select="substring-after(wsdlns:output/@message,':')" />(responseText);
   
  };
  
  
    </xsl:template>
   
   
    <!--复杂对象的成员变量声明  模板-->
    <xsl:template match="xs:element">
  this.<xsl:value-of select="@name"/> = "";
    </xsl:template>
   
   
    <!--web服务接口声明  模板-->
    <xsl:template match="wsdlns:service">
     <xsl:value-of select="@name"/> = Class.create();
     <xsl:value-of select="@name"/>.prototype = {
   initialize : function() {
    
     },
   <!--成员函数声明-->
   <xsl:apply-templates select="wsdlns:port"/>
     };
     
    
    </xsl:template>
   
    <!--为每个service下面的port生成函数-->
    <xsl:template match="wsdlns:port">
  <!--//binding=<xsl:value-of select="@binding"/>
  //name=<xsl:value-of select="@name"/>
  //location=<xsl:value-of select="wsdlsoapns:address/@location"/> -->
  <xsl:variable name="name" select="@name"/>
  <xsl:apply-templates select="/wsdlns:definitions/wsdlns:portType[@name=$name]"/>
    </xsl:template>
   
    <!--根据porttype生成函数列表 -->
    <xsl:template match="wsdlns:portType">
  <xsl:for-each select="wsdlns:operation">
   <xsl:value-of select="@name"/>:function(<xsl:apply-templates select="wsdlns:input" mode="func_params"/>) {
   var call = new WS.Call('<xsl:value-of select="$location"/>');
   var nsuri = '<xsl:value-of select="$targetNameSpace"/>';
   var qn_op = new WS.QName('<xsl:value-of select="@name"/>',nsuri);
   //var qn_op_resp = new WS.QName('getObjResponse',nsuri); 
   var respMsg;
   call.invoke_rpc(
     qn_op,
     new Array(
      <xsl:apply-templates select="wsdlns:input" mode="call_params"/>
      
     ),null,
     callback_<xsl:value-of select="@name"/>
      );
    return respMsg; 
   }<xsl:if test="position()!=last()">,</xsl:if>
   
  </xsl:for-each>
  
    </xsl:template>
   
    <!--根据porttype中的operation生成函数实体 -->
    <!--<xsl:template match="wsdlns:operation">
  
  <xsl:value-of select="@name"/>:function(<xsl:apply-templates select="wsdlns:input" mode="func_params"/>) {
   var call = new WS.Call('<xsl:value-of select="$location"/>');
   var nsuri = '<xsl:value-of select="$targetNameSpace"/>';
   var qn_op = new WS.QName('<xsl:value-of select="@name"/>',nsuri);
   //var qn_op_resp = new WS.QName('getObjResponse',nsuri); 
   var respMsg;
   call.invoke_rpc(
    qn_op,
    new Array(
     <xsl:apply-templates select="wsdlns:input" mode="call_params"/>
     
    ),null,
    function(call,envelope) {
    
      respMsg = arguments[2];
     //envelope.get_body().get_all_children()[0].get_all_children()[0];//.get_value();
     
     
    
    }
     );
   return respMsg; 
  }
  
  
    </xsl:template>-->
   
    <!--根据operation下的input构造函数输入参数-->
    <xsl:template match="wsdlns:input" mode="func_params">
  <xsl:variable name="message" select="@message"/>
  <xsl:apply-templates select="/wsdlns:definitions/wsdlns:message[@name=substring-after($message,':')]" mode="func_params"/>
    </xsl:template>
    <xsl:template match="wsdlns:message" mode="func_params">
  <xsl:for-each select="wsdlns:part">
   
   
   <xsl:value-of select="@name"/>_value<xsl:if test="not(position() = last())">,</xsl:if>
  </xsl:for-each>
    </xsl:template>
   
    <!--
 根据operation下的input构造函数调用时输入的值
 ########目前还不支持输入参数是复杂对象的情况###########
 -->
    <xsl:template match="wsdlns:input" mode="call_params">
  <xsl:variable name="message" select="@message"/>
  <xsl:apply-templates select="/wsdlns:definitions/wsdlns:message[@name=substring-after($message,':')]" mode="call_params"/>
    </xsl:template>
    <xsl:template match="wsdlns:message" mode="call_params">
  <xsl:for-each select="wsdlns:part">
   {name:'<xsl:value-of select="@name"/>',value:<xsl:value-of select="@name"/>_value}<xsl:if test="not(position() = last())">,</xsl:if>
  </xsl:for-each>
    </xsl:template>
   
   
   
   
</xsl:stylesheet>   

原创粉丝点击