XSL转换(XSLT)

@author ixenos

定义:


XSL转换机制可以指定将XML文档转换为其他格式的规则,例如,txt纯文本、XHTML或其他任何XML格式。

用途:


XSLT通常用来将某种机器可读的XML格式转译为另一种机器可读的XML格式,或者将XML转译为适合人类阅读的表示格式

步骤:


1、 需要提供XSLT样式表,它描述了XML文档向某种格式转换的规则

2、 XSLT处理器读入XML文档XSLT样式表,产生所要的输出

XSLT样式表:


<?xml version=”1.0” encoding=”utf-8”?>

<xsl:stylesheet

Xmlns:xsl=http://www.w3c.org/1999/XSL/Transform

Version=”1.0”>

<xsl:output method=”html”/> //指定输出的格式为HTML,其他有XML、text

Template1 模板

.

.

.

Template2

</xsl:stylesheet>

模板示例:

<xsl:template match=”/staf/employee”>

<tr><xsl:apply-templates/></tr>

</xsl:template>

match属性的值是一个XPath表达式

该模板表示:每当看懂啊XPath集/staff/employee中的一个节点时

(1)   产生字符串<tr>

(2)   对于要处理的子元素继续应用模板(会递归!)

(3)   当处理完所有所有子元素后,产生字符串</tr>

把属性值复制到输出中的模板:

<xsl:template match=”/staff/employee/hiredate”>

<td><xsl:value-of  select=”@year”/>-<xsl:value-of  select=”@month”/>-<xsl:value-of select=”@day”/></td>

</xsl:template>

这里xsl:value-of语句用于计算,由select的XPath值指定的节点集(属性节点)的,字符串值

XML转HTML示例:


<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

version="1.0">

<xsl:output method="html"/> //指定输出为html格式

<xsl:template match="/staff"> //使用XPath来分别定位

<table border="1"><xsl:apply-templates/></table>

</xsl:template>

<xsl:template match="/staff/employee"> //使用XPath来分别定位

<tr><xsl:apply-templates/></tr>

</xsl:template>

<xsl:template match="/staff/employee/name"> //使用XPath来分别定位

<td><xsl:apply-templates/></td>

</xsl:template>

<xsl:template match="/staff/employee/salary"> //使用XPath来分别定位

<td>$<xsl:apply-templates/></td>

</xsl:template>

<xsl:template match="/staff/employee/hiredate"> //使用XPath来分别定位

<td><xsl:value-of select="@year"/>-<xsl:value-of

select="@month"/>-<xsl:value-of select="@day"/></td>

</xsl:template>

</xsl:stylesheet>

转换成纯文本示例:


<?xml version="1.0"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

version="1.0">

<xsl:output method="text" omit-xml-declaration="yes"/>

<xsl:template match="/staff/employee">

employee.<xsl:value-of select="position()"  //注意中间生造了文本employee.

/>.name=<xsl:value-of select="name/text()"/>

employee.<xsl:value-of select="position()"

/>.salary=<xsl:value-of select="salary/text()"/>

employee.<xsl:value-of select="position()"

/>.hiredate=<xsl:value-of select="hiredate/@year"

/>-<xsl:value-of select="hiredate/@month"

/>-<xsl:value-of select="hiredate/@day"/>

</xsl:template>

</xsl:stylesheet>

Java平台下的XSL转换(XSLT):


(1)为每个样式表设置一个转换器工厂,得到一个转换器对象,并让它把一个源转换成结果

File styleSheet = new File(fileName); //某个xsl文件

StreamSource  styleSource = new StreamSource(styleSheet);

Transformer t = TransformerFactory.newInstance().newTransformer(styleSource);

t.transform(source, result);

(2)谈谈source和 result

Source接口有四个实现类:DOMSource、SAXSource、StAXSource、StreamSource,这些类使我们能通过文件、流、Reader、URL、DOM树节点来传入一个source

比如:来自DOM树节点的DOMSource(传入Document就相当于整个树)

Result接口有三个实现类:DOMResult、SAXResult、StreamResult

如果要把转换结果存储到DOM树中,那就再创建一个新的文档节点包装到DOMResult中:

Document doc = builder.newDocument();

t.transform(source,  new DOMResult(doc));

如果要把转换结果保存到文件中,可以使用StreamResult

t.transform(source,  new StreamResult(file));

题外话: 将非XML的遗留数据转换成XML的一个小技巧


Source中的SAXSource可以 从XMLReader接口的SAX实现获得!可以不必从一个现有XML文件开始工作。

先上代码:

t.transform(new SAXSource(new EmployeeReader(),  new InputSource(new FileInputStream(filename))), result);

其中EmployeeReader就是XMLReader的SAX实现类,InputSource就是文件来源,result决定保存的形式

当然,大多数XSLT应用程序都已经有了XML格式的输入数据,此时只需在一个StreamSource对象上调用transform方法即可:

t.transform(new StreamSource(file),  result);

JavaEE XML XSL转换(XSLT)的更多相关文章

  1. XSLT可扩展样式表语言转换 System.Xml.Xsl、XslCompiledTransform类

    XML文件 books.xml: <?xml version="1.0" encoding="utf-8" ?> <bookstore> ...

  2. 微软BI 之SSIS 系列 - XML Task 中XSLT 样式表转换错误记录

    开篇介绍 此文章专门记录 XSLT 样式表转换过程中的语法问题 错误一 值与属性的倒置 修改了几次样式表,但还是一如既往的报错,报错信息如下: [XML Task] Error: An error o ...

  3. XML、XSL、XSLT、DTD、XSD的区别

    前言: 在众神的努力之下,js已经可以跨出浏览器走向不同的领域了 也因为这个,对前端工程师的要求也不仅仅是会写写h5页面做交互.前端涉及的领域越来越广,对开发人员对素质能力要求越高. 以前因设备不同导 ...

  4. XML wsdl soap xslt xsl ide

    XML wsdl soap  xslt xsl ide 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn. ...

  5. JavaEE XML DOM创建

    DOM创建XML @author ixenos 1.思路: 先封装构建一颗DOM树,然后将DOM树转换成XML文件 2.三种写DOM树到XML文件的方式: 1)使用DOM(或DOM4J.JDOM) 2 ...

  6. C#执行XSL转换

    xsl 可方便的将一种格式的xml,转换成另一种格式的xml,参考下面的代码: using System; using System.IO; using System.Text; using Syst ...

  7. JavaEE XML XPath

    JavaEE XML XPath @author ixenos XPath技术 1 引入 问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!需要遍历DOM树的众多节点 ...

  8. 利用JAXB实现java实体类和xml互相转换

    1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...

  9. 将Xml字符串转换成(DataTable || DataSet || XML)对象

    今天用到一个功能:就是把从数据库读出来的内容转换成XML字符串流格式,并输出给一个功能函数.在写的过程,为方便以后的使用,我对这一功能进行分装.该类的具体格式如下:XmlConvert类命名空间:Ni ...

随机推荐

  1. C# 通讯网关开发

    C# 通讯网关开发 楼主从12年毕业大部分时间一直从事于通讯网关的开发,刚刚学那会连C#是啥都不知道,就直接入手网关开发,前前后后到现在也算是弄了5.6个通讯协议,后来看到北风之神的socket框架和 ...

  2. 来自 Repository 的一丝线索,Domain Model 再重新设计

    来自 Repository 的一丝线索,Domain Model 再重新设计 写在前面 阅读目录: 疑惑解读 设计窘境 一幅图的灵感 为嘛还是你-Repository 后记 上一篇<No zuo ...

  3. 微信SDK使用总结

    最近做一个分享功能,需要使用微信SDK分享内容给朋友或朋友圈.期间遇到些奇怪的问题,花了点时间去折腾了一番. 首先需要到微信开放平台http://open.weixin.qq.com/?lang=zh ...

  4. Java类之间的关联关系(转载)

    Java类之间的关联关系 UML类图中的关系分为四种:泛化.依赖.关联.实现:关联关系又可以细化为聚合和组合. 一.泛化(Generalization) 泛化是父类和子类之间的关系,子类继承父类的所有 ...

  5. GoLang获取struct的tag

    GoLang获取struct的tag内容:beego的ORM中也通过tag来定义参数的. 获取tag的内容是利用反射包来实现的.示例代码能清楚的看懂! package main import ( &q ...

  6. 高级NAT-DMZ配置 -虚拟主机配置

    我家里另有一个网络摄像头,我想将公网IP映射到摄像头的IP,这样可以远程监控.以前没有光猫,用TP-Link做ADSL路由器,一点问题都没有. 现在破解了F420,在“高级NAT”-“DMZ配置”,或 ...

  7. Js中call apply函数以及this用法

    this介绍: C#里this关键字的意义比较确定的.JavaScript的this关键字,随着函数使用场合不同,this的值会发生变化,感觉用法比较混乱,所以,现在是有必要整理一下的时刻了! 总结一 ...

  8. ios7学习之路六(隐藏状态栏 )

    方法一(代码设置): 现在ios7已经更改为透明,并且不占用屏幕高度.其中隐藏及显示的方法如下: 在uiviewcontroller的子类下,调用:      if ([self respondsTo ...

  9. SQL Server中日志

    再谈SQL Server中日志的的作用 简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用.如果您没有看过我之前的文章,请参阅: ...

  10. ORA-12520错误解决方法

    ORA-12520监听程序无法为请求的服务器类型找到可用的处理程序 以下不知道是不是解决方法的方法,因为我只重启下oracle服务就好了,并没进行任何修改 引用别人的文章: 1)数据库是专用服务器,但 ...