daillo 2012-06-07
1.简介
Smooks是一个用于出力XML和非XML数据(CVS,EDI,JAVA...)的JAVA可扩展框架。
主要有以下特性:
1)JAVA绑定:根据数据源(XML,CSV,EDI...)活得JAVA对象,亦可以实现JAVA对象到数据源的格式化。
2)转化:数据格式之间的转化,如XML-XML,CSV-XML...
3)大数据处理:能处理大型数据(GBs)-分割,转换,路由到JMS,文件,数据库等。
4)数据完整性填充:利用数据库等数据源填充数据。
5)复杂数据验证
6)基于ORM框架的数据存储:可以使用持久层框架(如Ibatis,Hibernate...)或者DAO读取或者存储数据。
7)可以将以上特性结合使用。
Smooks的工作是将结构化/层次化的数据流转变成“事件”流,然后交与“访问者逻辑(Visitor Logic)”进行分析,生成结果。而且Smooks本身提供了很多Vistor的实现来完成下面的功能:
1)JAVA绑定
2)数据分割和路由
3)大数据处理
本文将主要介绍Smooks通过XSL来实现XML之间的转换
2.结合XSL实现XML之间的转换
|-example
|-Xml2XmlXslTest.java
|-xslConfig.xml
|-xslConfig.xsl
|-input.xml
xslConfig.xml
<?xml version="1.0"?> <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:xsl="http://www.milyn.org/xsd/smooks/xsl-1.1.xsd"> <xsl:xsl applyOnElement="Order"> <xsl:template>xslConfig.xsl</xsl:template> </xsl:xsl> </smooks-resource-list>
xslConfig.xsl
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:preserve-space elements="*"/> <xsl:template match="/Order"> <ORDER> <xsl:copy-of select="CUSTOMER" /> <xsl:copy-of select="PAYMENT" /> <ORDERITEM_LIST> <xsl:for-each select="OrderItemList/OrderItem"> <xsl:variable name="id"> <xsl:value-of select="Product/Id"/> </xsl:variable> <xsl:choose> <xsl:when test="Amount > 1"> <ORDERITEM> <PRODUCT> <ID><xsl:value-of select="substring($id,3)"/></ID> <NAME><xsl:value-of select="Product/Name"/></NAME> <PRIZE><xsl:value-of select="Product/Prize"/></PRIZE> </PRODUCT> <AMOUNT><xsl:value-of select="Amount"/></AMOUNT> </ORDERITEM> </xsl:when> <xsl:otherwise> <ORDERITEM> <PRODUCT> <ID><xsl:value-of select="substring($id,3)"/></ID> </PRODUCT> </ORDERITEM> </xsl:otherwise> </xsl:choose> </xsl:for-each> </ORDERITEM_LIST> </ORDER> </xsl:template> </xsl:stylesheet>
input.xml
<Order> <CUSTOMER> <username>USER</username> </CUSTOMER> <PAYMENT> <PRIZE>300</PRIZE> </PAYMENT> <OrderItemList> <OrderItem> <Product> <Id>001003</Id> <NAME>book1</NAME> <PRIZE>100</PRIZE> </Product> <Amount>2</Amount> </OrderItem> <OrderItem> <Product> <Id>001004</Id> <NAME>book2</NAME> <PRIZE>100</PRIZE> </Product> <Amount>1</Amount> </OrderItem> </OrderItemList> </Order>
Xml2XmlXslTest.java
package example; import java.io.IOException; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.milyn.Smooks; import org.xml.sax.SAXException; public class Xml2XmlXslTest { /** * @param args * @throws SAXException * @throws IOException */ public static void main(String[] args) throws IOException, SAXException { Smooks smooks = new Smooks("xslConfig.xml"); Source xmlSrc = new StreamSource(Xml2XmlXslTest.class.getResourceAsStream("/input.xml")); Result xmlRst = new StreamResult(System.out); smooks.filterSource(xmlSrc, xmlRst); } }