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>
测试工程目录结构:
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|