xsl与xml转换示例

 

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>

 

 

测试工程目录结构:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值