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<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<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>
- WSDL2Ajax
- 清洁工到亿万富翁 卖纽扣赚第一桶金
- 完整的代码
- 编写可复用性更好的C++代码——Band对象和COMToys(二)
- 编写可复用性更好的C++代码——Band对象和COMToys(三)
- 编写可复用性更好的C++代码——Band对象和COMToys(四)
- WSDL2Ajax
- 编写可复用性更好的C++代码——Band对象和COMToys(五)
- asp.net不能用于做长时间的服务进程?
- 部分源代码资料
- XQuery技术应用
- 在ASP.NET中使用Excel时,发生拒绝访问?怎么办???
- 编写可复用性更好的C++代码——Band对象和COMToys(六)
- XSLT
- 编写可复用性更好的C++代码——Band对象和COMToys(七)