java xml,xsl,html文件转换
package com.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
/**
* 测试xmlxsl html 的应用
* @author xrxianga
* @date 20120926
*/
public class xmlVSxslTest {
/**
* 测试
* @param args
* @throws Exception
*/
public static void main(String[] args)throws Exception{
String xmlFile = "src/com/test/xml.xml";
String xslFile ="src/com/test/xsl.xsl";
String htmlFileName ="d:/html.html";
String xmlFileName = "com/test/test0332xsl.xml";
String xslFileName ="com/test/input0332.xsl";
//测试把xml文件转换为html文件
xmlVSxslTest.Transform(xmlFile,xslFile,htmlFileName);
//测试把xml文件通过xsl模板转换需要的xml格式文件
String str =parseXmlResource(xmlFileName,"utf-8");
String src = returnXml(str,xslFileName,"utf-8");
System.out.println(src);
}
/**
* 把xml文件转换为html文件
* @param xmlFileName 转换的文件,xml文件路径
* @param xslFileName 转换的模板,xsl文件路径
* @param htmlFileName 保存文件路径以及文件
* @throws Exception
*/
public static void Transform(String xmlFileName,StringxslFileName,String htmlFileName)throws Exception {
TransformerFactory tFac =TransformerFactory.newInstance();
Source xslSource = newStreamSource(xslFileName);
Transformer t =tFac.newTransformer(xslSource);
File xmlFile = newFile(xmlFileName);
File htmlFile = newFile(htmlFileName);
Source source = newStreamSource(xmlFile);
Result result = newStreamResult(htmlFile);
t.transform(source,result);
}
/**
* 检查xml文件
* @param resource xml检查的路径
* @param encoding 字符编码
* @return String 返回需要的xml字符串
* @throws Exception
*/
public static String parseXmlResource(String resource,Stringencoding)throws Exception{
//在指定类中的加载器中得到输入流中读取指定资源
InputStream inputStream =xmlVSxslTest.class.getClassLoader().getResourceAsStream(resource);
//得到一个新的输入源的字节流
InputSource inputSource = newInputSource(inputStream);
//设置字符编码
inputSource.setEncoding(encoding);
//定义工厂API ,使应用程序获得从XML文件生成DOM对象树的解析器。
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
//创建一个新实例的文档生成器使用当前配置的参数。
DocumentBuilder builder =factory.newDocumentBuilder();
//在给定的输入源的内容解析为一个XML文档并返回一个新的DOM 文件对象
Document document = builder.parse(inputSource);
//获得一个TransformerFactory的新实例
TransformerFactory tf =TransformerFactory.newInstance();
//创建一个新的变压器,执行复制的源代码的结果
Transformer t = tf.newTransformer();
//设置输出编码
t.setOutputProperty("encoding",encoding);
//创建一个新的字节数组输出流
ByteArrayOutputStream bos = newByteArrayOutputStream();
//关键代码document.getDocumentElement()是为了不给生成的xml增加头部声明
//创建一个新的DOM节点的输入源
//文档元素的子节点的属性
//从字节流,构建一个StreamResult
t.transform(new DOMSource(document.getDocumentElement()),new StreamResult(bos));
//将缓冲区的内容转换为字符串,根据指定的字符编码将字节转换成字符
String xml = bos.toString(encoding);
return xml ;
}
/**
* 转换文件(xml通过xsl转换)
* @param xml 转换文件
* @param xsl 转换模板
* @param encoding 字符编码
* @return String 返回转换后的xml字符串
* @throws Exception
*/
public static String returnXml(String xml,String xsl,Stringencoding)throws Exception{
//获取字符串输入流
StringWriter stringWriter = new StringWriter();
//获取打印输出流,并设置输出为字符流形式
PrintWriter printWriter = newPrintWriter(stringWriter);
//根据输入的String,获取XML字符串是输入源
Source srcSource = new StreamSource(newByteArrayInputStream(xml.getBytes(encoding)));
//设置转换结果输出为打印流
Result destResult = new StreamResult(printWriter);
//获取转换模板
ClassLoader cl = xmlVSxslTest.class.getClassLoader();
InputStream is = cl.getResourceAsStream(xsl);
Source xslSource = new StreamSource(is);
//创建转换工厂
TransformerFactory transFact =TransformerFactory.newInstance();
//创建转换对象
Transformer trans =transFact.newTransformer(xslSource);
//实行转换
trans.transform(srcSource,destResult);
//把转换结果赋值到 返回的字符串中
String xmlParsed = stringWriter.toString();
//关闭打印流
printWriter.close();
return xmlParsed ;
}
}
<?xml version="1.0"encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0"encoding="UTF-8" indent="yes"cdata-section-elements="DataContent " />
<xsl:template match="/">
<packet>
<xsl:apply-templates/>
</packet>
</xsl:template>
<xsl:template match="cstmRoot">
<xsl:for-each select="base">
<xsl:element name="BASE">
<xsl:element name="row">
<xsl:attributename="C_APP_CDE"><xsl:value-ofselect=".//appCode"/></xsl:attribute>
<xsl:attributename="C_APP_NME"><xsl:value-ofselect=".//appName"/></xsl:attribute>
<xsl:attributename="C_INSRNT_CDE"><xsl:value-ofselect=".//appCode"/></xsl:attribute>
<xsl:attributename="C_INSRNT_CNM"><xsl:value-ofselect=".//appName"/></xsl:attribute>
<xsl:attributename="T_SIGN_TM"><xsl:value-ofselect=".//signTime"/></xsl:attribute>
<xsl:attribute name="T_INSRNC_BGN_TM"><xsl:value-ofselect=".//beginTime"/></xsl:attribute>
<xsl:attributename="C_DPT_CDE"><xsl:value-ofselect=".//deptCode"/></xsl:attribute>
<xsl:attributename="C_SLS_CDE"><xsl:value-ofselect="/cstmRoot/user/userID"/></xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="vhl">
<xsl:element name="VHL">
<xsl:element name="row">
<xsl:attributename="C_LCN_NO"><xsl:value-ofselect=".//license"/></xsl:attribute>
<xsl:attribute name="C_YL3"><xsl:value-ofselect=".//plateType"/></xsl:attribute>
<xsl:attributename="C_VHL_TYP"><xsl:value-ofselect=".//vhlType"/></xsl:attribute>
<xsl:attributename="C_USE_ATR"><xsl:value-ofselect=".//useAttr"/></xsl:attribute>
<xsl:attribute name="C_FST_REG_DTE"><xsl:value-ofselect=".//regDate"/></xsl:attribute>
<xsl:attributename="C_VHL_FRM"><xsl:value-ofselect=".//vhlFrame"/></xsl:attribute>
<xsl:attributename="C_ENG_NO"><xsl:value-ofselect=".//engineNo"/></xsl:attribute>
<xsl:attributename="C_CLASS_DTL"><xsl:value-ofselect=".//class"/></xsl:attribute>
<xsl:attributename="C_BRND_CDE"><xsl:value-ofselect=".//brand"/></xsl:attribute>
<xsl:attributename="C_DRV_OWNER"><xsl:value-ofselect=".//drvOwner"/></xsl:attribute>
<xsl:attributename="N_VHL_VAL"><xsl:value-ofselect=".//vhlPrice"/></xsl:attribute>
<xsl:attributename="N_SET_NUM"><xsl:value-ofselect=".//seat"/></xsl:attribute>
<xsl:attributename="N_TON_NUM"><xsl:value-ofselect=".//tonnage"/></xsl:attribute>
<xsl:attributename="C_YL18"><xsl:value-ofselect=".//tonnage"/></xsl:attribute>
<xsl:attributename="C_EXT_MSR"><xsl:value-ofselect=".//displacement"/></xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="rdr">
<xsl:element name="RDR">
<xsl:for-each select="row">
<xsl:element name="row">
<xsl:attributename="C_INSRNC_CDE"><xsl:value-ofselect=".//insCode"/></xsl:attribute>
<xsl:attributename="C_YL4"><xsl:value-ofselect=".//grade"/></xsl:attribute>
<xsl:attributename="N_AMT"><xsl:value-ofselect=".//norm"/></xsl:attribute>
<xsl:attributename="N_YL3"><xsl:value-ofselect=".//nyl3"/></xsl:attribute>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0"encoding="UTF-8"?>
<cstmRoot>
<user>
<userID>3700000000</userID>
<aa>
123
</aa>
</user>
<base>
<!-- appCode投保人代码(可传当前客户编码) -->
<appCode>371225713357</appCode>
<!-- appName投保人名称(可传当前客户名称) -->
<appName>闫强</appName>
<!-- signTime签单时间(可传当前日期。格式yyyy-MM-dd) -->
<signTime>2012-05-07</signTime>
<!-- beginTime起保时间(建议传当前日期的下一天的零时零分零秒。格式”yyyy-MM-dd HH:mm:ss“)。终保时间不传,默认为起保时间+1年、再减1秒。 -->
<beginTime>2012-05-08 00:00:00</beginTime>
<!-- deptCode投保机构(可传当前登陆人员的所在机构代码——登陆返回的机构代码) -->
<deptCode>37032300</deptCode>
</base>
<vhl>
<!-- license车牌号码(注意,新车传”*-*”) -->
<license>浙JEYP8</license>
<!-- plateType号牌种类(只传代码) -->
<plateType>02</plateType>
<!-- vhlType车辆种类(只传代码) -->
<vhlType>302001001</vhlType>
<!-- useAttr使用性质(只传代码) -->
<useAttr>309001</useAttr>
<!-- regDate初登年月(只接受”yyyy-MM-dd”的格式) -->
<regDate>2012-03-14</regDate>
<!-- vhlFrame车架号(只接受17字符) -->
<vhlFrame>12JHS3WSLLL211LWX</vhlFrame>
<!-- engineNo发动机号-->
<engineNo>12JHS3WSLLL211LWX</engineNo>
<!-- class交管所车辆种类(只传代码,如“K33”) -->
<class>K33</class>
<!-- brand车辆型号-->
<brand>JHD1983JHQ</brand>
<!-- drvOwner车主名称(为减少输入,可与投保人名称一致)-->
<drvOwner>张三</drvOwner>
<!-- vhlPrice新车购置价-->
<vhlPrice>70600</vhlPrice>
<!-- seat座位数(要求输入的是整数)-->
<seat>3</seat>
<tonnage>1000</tonnage>
<!-- displacement排量(要求输入的是小数或空字符串““)-->
<displacement>1023</displacement>
</vhl>
<rdr>
<row>
<!-- insCode险别代码 -->
<insCode>033201</insCode>
<!-- grade档次 -->
<grade></grade>
<!-- norm限额 -->
<norm>122000</norm>
<!-- nyl3 险别“车上人员(乘客)…”的数量 -->
<nyl3></nyl3>
</row>
</rdr>
<tgt>
<!-- 以下的系数中,不需要设置的,可以不传相应的节点 -->
<!-- drvArea指定行驶区域系数(传入区域代码。”303007013 省内”、”30300711固定路线”和”30300712 场内”)-->
<drvArea></drvArea>
<!-- drv指定驾驶员 (“311004“)-->
<drv></drv>
<!-- age指定驾驶员年龄(345023~345027)-->
<age></age>
<!-- drvAge指定驾驶员驾龄(304002006~304002008)-->
<drvAge></drvAge>
<!-- drvSex指定驾驶员性别(345011、345028)-->
<drvSex></drvSex>
<!-- mileage平均年行驶里程(0.90~1.30的小数)-->
<mileage></mileage>
<!-- multiple同时投保车损险、三责险(0.95~1.00的小数)-->
<multiple></multiple>
<!-- driving安全驾驶系数(0.90的小数)-->
<driving></driving>
</tgt>
</cstmRoot>
<?xml version="1.0"encoding="utf-8"?>
<book>
<title>XML与JSP</title>
<chapter>
<title>第1章 认识XML与DTD</title>
<section>
<title>XML的产生</title>
<example>HelloWorld.html</example>
</section>
</chapter>
<chapter>
<title>第2章 XML名称空间</title>
<section>
<title>名称空间在元素和属性中的应用</title>
<section>
<title>名称空间在元素中的应用</title>
<example>people.xml</example>
</section>
<section>
<title>缺省名称空间</title>
<example>book.xml</example>
</section>
<section>
<title>名称空间在属性中的应用</title>
<example>book2.xml</example>
</section>
</section>
<section>
<title>名称空间和DTD</title>
</section>
</chapter>
</book>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="1.0"encoding="utf-8" standalone="yes"/>
<xsl:template match="/">
<html>
<head>
<title>使用XML+XSLT生成的HTML文件</title>
</head>
<body>
<xsl:apply-templates select="book"/>
</body>
</html>
</xsl:template>
<xsl:template match="chapter">
<br/>
<br/>
<xsl:value-ofselect="./title"/>
<xsl:apply-templatesselect="./section"/>
</xsl:template>
<xsl:template match="chapter/section">
<br/>
<br/>
<xsl:text></xsl:text>
<!--<xsl:numberformat="1. " level="multiple"/>-->
<xsl:number format="1." level="multiple" count="chapter | section"from="book"/>
<xsl:value-of select="./title"/>
<xsl:apply-templatesselect="./section"/>
</xsl:template>
<xsl:templatematch="chapter/section/section">
<br/>
<br/>
<xsl:text> </xsl:text>
<!--<xsl:numberformat="1. " level="multiple"/>-->
<xsl:number format="1." level="multiple" count="chapter | section"from="book"/>
<xsl:value-ofselect="./title"/>
<xsl:numbervalue="123456789" grouping-separator=","grouping-size="3"/>
</xsl:template>
</xsl:stylesheet>
测试工程目录结构: