java xslt转换xml_使用XSLT转换XML2XML

在EDI(电子数据交换)系统中经常会遇到这样的事情,也就是在系统内定义的XML文档是一种格式,而外系统定义的则是另外的一种格式,或者是不同的外系统定义的格式不太一样,例如对于人员有些地方定义为,而其他的组织则使用 或者 .① 这个时候就需要一种XML转换成XML的格式了。

XSLT则就脱颖而出了,XSLT是XSL(EXtensible Stylesheet Language 扩展样式表语言)的一部分,专门负责XML转换成其他格式的一种语言。具体的学习可以参考网上的XSLT的资料。

如果你使用Java的话,很幸运,Java提供了一组API支持了XSLT的使用,可以不使用第三方的库就可以轻松的进行转换。进行转换只需要准备源文件(被转换的XML),转换的模板(XSLT文件),一段Java代码。

样例如下:

源文件:

模板:

Discussion Forum Home Page

Discussion Forum Home Page

Please select a message board to view:

Java代码

importjava.io.File;importjava.io.IOException;importjava.net.URISyntaxException;importjavax.xml.transform.Source;importjavax.xml.transform.Transformer;importjavax.xml.transform.TransformerException;importjavax.xml.transform.TransformerFactory;importjavax.xml.transform.stream.StreamResult;importjavax.xml.transform.stream.StreamSource;public classTestMain {public static void main(String[] args) throwsIOException, URISyntaxException, TransformerException {

TransformerFactory factory=TransformerFactory.newInstance();

Source xslt= new StreamSource(new File("D:\\dev\\learn\\discussionForumHome.xslt"));

Transformer transformer=factory.newTransformer(xslt);

Source text= new StreamSource(new File("D:\\dev\\learn\\discussionForumHome.xml"));

transformer.transform(text,new StreamResult(new File("D:\\dev\\learn\\output.xml")));

}

}

TIP 1.输出中文文件名有问题

如果你直接使用StreamResult进行文件输出时,会出现这样的现象,文件名变成%的ASCII格式,例如

transformer.transform(text, new StreamResult(newFile("D:\\dev\\learn\\小狗.xml")));

输出的文件名为:

%E5%B0%8F%E7%8B%97.xml

这个时候跟踪StreamResult的代码,发现 StreamResult在构造函数里面用文件的ASCII吗作为SystemID了。

setSystemId(f.toURI().toASCIIString());

这个时候可以通过设置OutputStream方式进行设置

StreamResult sr = newStreamResult();

sr.setOutputStream(new FileOutputStream(new File("D:\\dev\\learn\\小狗.xml")));

transformer.transform(text,sr);

注①。举例摘自《Java and XSLT》一书,同时XML文件内容也是如此

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值