原来作页面展现的时候,通过使用list标签来排版保存在Scope中的数据对象,这种方法虽然也简洁、符合编程习惯,唯一的不好处就是存在一个model。最近在一个门户网站的实施的过程中,用到了别的系统WebService数据,正好他们的返回数据是xml格式的String。而对方的model我们是无法控制的、客户最终要展现哪些model的属性也尚未确定。于是在别人的提醒下,想到了XSLT能够直接将数据展现出来,中间免去了解析xml和建立model的麻烦,而且不用调出原来的list标签,以免给人留下话资。。。
闲话少说,描述下使用的过程:
1、CXF接受第三方系统的数据(XML),此时需要建立一个与第三方系统方法一样的Proxy接口。省略
2、新建xsl展现模板
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
??? <table width="100%" cellpadding="3" cellspacing="1">
????? <colgroup>
??????? <col width="400"/><col width="250"/><col width="320"/><col width="80"/>
????? </colgroup>
????? <xsl:for-each select="root/productlist/product">
????? <tr>
??????? <td class="product-list-content"> <xsl:value-of select="productName" /> </td>
??????? <td class="product-list-content"> <xsl:value-of select="prodTypeName" /> </td>
??????? <td class="product-list-content"> <xsl:value-of select="insurerName" /> </td>
??????? <td>
????????? <a target="_blank">
??????????? <xsl:attribute name="href">/wps/myportal/fanhua/chanpinyufuwu/productmarket/detail?productId=<xsl:value-of select="productId"/></xsl:attribute>查看
????????? </a>
??????? </td>
????? </tr>
????? </xsl:for-each>
??? </table>
??? <script language="javascript">var totalPages = <xsl:value-of select="root/pageCount"/></script>
</xsl:template>
</xsl:stylesheet>
3、使用jaxp来转换xml,
public static String parseHtmlCode(String xmlContent,String xsl){
??StringWriter writer = new StringWriter();
??StringReader reader = new StringReader(xmlContent);
??StreamSource style = new StreamSource(
????XmlTransfer.class.getClassLoader().getResourceAsStream(xsl) );
??String verstr = "<?xml version=/"1.0/" encoding=/""+XML_ENCODING+"/"?>";
??try {
???Transformer transformer = TransformerFactory.newInstance().newTransformer(style);
???transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,XML_ENCODING);
???transformer.transform(new StreamSource(reader),new StreamResult(writer));
???
???String htmlCode = writer.toString();
???if (htmlCode.startsWith(verstr)){
??? ?htmlCode = htmlCode.substring(verstr.length());
???}
???writer.close();
???reader.close();
???return htmlCode;
??} catch (Exception e) {
???e.printStackTrace();
???return null;
??}finally{
????? writer = null;
????? reader = null;
??}
?}
?
?
附录:如果是IE下,也就不用第三步,可以直接将xml字符串保存为一个文件,在<?xml ?>行下添加下面这句就可以直接显示:
<?xml-stylesheet type="text/xsl" href="productList.xsl"?>