XSL转换
XSL转换(XSLT)机制可是指定将XML文档转换为其他格式的规则,例如,纯文本、XHTML或其他任何XML格式。XSLT通常用来将一个机器可读的XML格式转译为另一种机器可读的XML格式,或者将XML转译为适于人类阅读的标识格式
你需要提供XSLT样式表,它描述了XML文档向某种其他格式转换的规则。XSLT处理器处理这个文档,并产生想要的输出
加入我们想要把下面这个XML文件:
1 | <staff> |
转换成下面的表格:
1 | <table border="1"> |
具有转换模板的样式表形式如下:
1 |
上例的输出设定为html,还可以设置为xml和text
下面是个典型的模板,match属性的值是一个XPath表达式。该模板表名,每当看到一个XPath集/staff/employee中的一个节点时,做以下动作:
- 产生字符串< tr>
- 对于要处理的子元素继续应用模板。
- 当处理完所有子元素后,产生字符串< /tr>
1 | <xsl:template match="/staff/employee"> |
XSLT处理器由检查根元素开始其处理过程。每当一个节点匹配某个模板时,就回应应用这个模板(如果匹配多个,就会使用最佳匹配的那个)。如果没有匹配的模板,处理器就执行默认操作。对于文本节点,默认操作是把它的内容包含到输出中去。对于元素,默认操作是不产生输出的,但会继续处理其子节点。
如果想把属性值复制到输出中去,就不得不再做稍微复杂点的操作了。下面是一个例子,当处理hiredate节点时。该模板会产生:
- 字符串< td>
- year属性的值
- 一个连字符
- month属性的值
- 一个连字符
- day属性值
- 一个连字符
- 字符串< /td>
xsl:value-of语句用于计算节点集的字符串值。节点集由select属性的XPath值设定。在这个例子中,该路径是相对于当前处理节点的相对路径。节点集通过连接各个节点的字符串值被转换成一个字符串。属性节点的字符串值就是它的值,文本节点的字符串值是它的内容,元素节点的字符串值是它子节点的字符串值的连接(没有属性)
1 | <xsl:template match="/staff/employee/hiredate"> |
下面这段代码将与上面相同的XML文件转换成text文件。position()函数输出在当前节点在父节点中的索引顺序。
1 |
|
java中的代码实现
可以使用以下代码框架:
1 | File styleSheet=new File(fileName);//样式表文件 |
transform方法的参数是Source和Result接口的实现类的对象。Source接口有3个实现类:
DOMSource SAXSource StreamSource
可以根据一个文件、流、阅读器、URL或来自DOM树节点的DOMSource来构建一个StreamSource。
用于转换器的SAXSource可以根据XML阅读器(实现XMLReader接口的类)构建
1 | t.transform(new SAXSource( |
当然大多数的时候都已经有了xml格式的输入数据,只要在一个StreamSource对象上调用transform方法即可
1 | t.transform(new StreamSource(file),result); |
其转换结果是Result接口实现类的一个对象:
DOMResult SAXResult StreamResult
如果要把结果存储到DOM树中,请使用DocumentBuilder产生一个新的文档节点,并将其包装到DOMResult中:
1 | Document doc = builder.newDocument(); |
如果要把结果保存为文件,可以使用StreamResult将输出保存为文件
1 | t.transform(source,new StreamResult(file)); |
示例程序如下:
1 | package transformtest; |
测试结果如下: