SMOOKS--XSL

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);
	}

}

相关推荐