介绍:
XSL 指扩展样式表语言(EXtensible Stylesheet Language)。
它是W3C 的标准,主要用于将一种 XML 文档转换为另外一种 XML 文档,或者可被浏览器识别的其他类型的文档,比如 HTML 和 XHTML。通常,XSLT 是通过把每个 XML 元素转换为 (X)HTML 元素来完成这项工作的。
通过 XSLT,您可以向或者从输出文件添加或移除元素和属性。您也可重新排列元素,执行测试并决定隐藏或显示哪个元素,等等。(个人理解:就是把一个XML转换成其他文本的工具,可以转换成纯文本,HTML代码,XML等,感觉有点象个脚本解释器)
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。(个人理解:相当于一个后台请求,可以把请求到的页面中的内容返回回来;例如,用HttpClient 去请求一个HTML页面,可以得到该HTML页面的源码字符串,即HTML代码,如果访问一个XML,则返回一个XML的字符串,要用它需要有commons-httpclient.jar这个JAR包,可以从http://wiki.apache.org/jakarta-httpclient/HttpClientPowered下载)
使用目的:
FLEX中可以使用HTTPService来与后台进行数据交互,传递的格式经常是XML型,这些XML通常是由一个Servlet查库或间接查库后拼接而成的(不建议直接拼接,最好是用DOM4J生成DOM文档操作,最后toString()出来);
但有些时候,同一批数据需要以不同种XML格式输出,这些复杂的转换工作其实在程序内部也能实现,但过程相对麻烦,并且不灵活,如果后来需要再加入一个属性或更改一个结点的名称等,就必须要重新更改JAVA文件或AS文件并重新编译了;这个时候如果用XSLT做这个转换工作,则省去了复杂的DOM文档操作,并且如果以后要更改格式,只需要更改XSLT文件即可,而XLS文件是以XML文件的格式保存的,所以不需要再次编译。
具体实例:
先看看XSLT是怎么工作的,例如有一个ServletA,它最后输出的XML格式如下:
经过如下的XSL的转换
最后的结果就会是:
是不是很简单,下面就是如何把这个转换工作放到JAVA中去完成,
步骤如下:
1、创建ServletB;
2、通过HttpClient取得ServletA的XML结果;
3、用XSLT转换ServletA的结果;
4、输出转换后的结果。
第一步跟第四步就省略了,下面列出步骤二和步骤三的代码样例:
步骤二
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; HttpClient client = new HttpClient(); String path = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath(); PostMethod method = new PostMethod(path+"/ServletA"); //设置请求字符集 method.addRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8"); /*如果有参数,可以通过这样设置参数 NameValuePair nvpUserName = new NameValuePair("User", session.getAttribute("UserName").toString()); NameValuePair nvpPassWord = new NameValuePair("Password", session.getAttribute("PassWord").toString());*/ StringBuffer sbuffer = new StringBuffer(); try { //将参数放入请求中 //method.setRequestBody(new NameValuePair[] {nvpUserName,nvpPassWord}); //执行请求动作 client.executeMethod(method); //取得请求状态码,状态码200为请求成功,404为未找到文件,500表示请求的程序错误 int nHttpState = method.getStatusCode(); if(nHttpState == 200) { BufferedReader br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), "UTF-8")); String line = null; while ((line = br.readLine()) != null) { sbuffer.append(line); } br.close(); } else { //Handle error } method.releaseConnection(); } catch(Exception e) { //Handle Exception System.out.println("Exception name is "+e.getClass().getName()+", message is " + e.getMessage()); } //这里的sbuffer即为ServletA中的XML内容
步骤三:
import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; //这里的sourceXml即为上面的sbuffer中的内容,xsltPath为XSL文件的存放路径, //最后返回出来的就是转换之后的格式了 public String formatByXslt(String sourceXml, String xsltPath) { Source xmlSource = new StreamSource(new StringReader(sourceXml)); File xsltFile = new File(xsltPath); Source xslSource = new StreamSource(xsltFile); StringWriter sw = new StringWriter(); Result result = new StreamResult(sw); TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer; String sTransitionResult = ""; try { transformer = tFactory.newTransformer(xslSource); transformer.transform(xmlSource, result); sTransitionResult = sw.toString(); sw.flush(); sw.close(); } catch(TransformerException te) { //Handle TransformerException } catch(IOException ie) { //Handle IOException } catch(Exception e) { //Handle Unknown Exception } return sTransitionResult; }
暂时就写这么多,希望对大家有帮助:)
另:XSLT语法并不难学,估计认真一天加上实际动手操作一下,很快就能基本掌握。