您的位置:首页 > 其它

xsl与xml转换示例

2016-01-05 23:41 330 查看
java xml,xsl,html文件转换

java文件代码:

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 ;

}

}

input0332.xsl文件内容:
<?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>

test0332xsl.xml文件内容:
<?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.xml文件内容:
<?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>
xsl.xsl文件内容:
<?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>

测试工程目录结构:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: