要创建XML的不同格式,就需要使用被称为XSTL(可扩展样式语言转换,extensible styling languagetransformations)的技术。XSTL用于将XML文档转换为另一种格式,如HTML、文本、甚至是另一级别的XML。
XSTL是一种功能强大的语言,而且XSTL和XML是100%兼容的,那么可以在java中使用诸如DOM、JDOM或SAX等技术来处理XSTL文档。
第一步:生成XML源
这里使用links.xml,如下:
<?xml version="1.0" encoding="ISO-8859-1"standalone="yes"?>
<links>
<link>
<text>Wroxpublishing</text>
<urlnewWindow="no">http://www.wrox.com</url>
<author>Wrox</author>
<describe>Checkout Wrox for morebooks</describe>
<date>
<day>1</day>
<month>1</month>
<year>2001</year>
</date>
</link>
<link>
<text>JspInsider</text>
<urlnewWindow="no">http://www.jspinsider.com</url>
<author>Jspinsider</author>
<describe>AJsp Information</describe>
<date>
<day>2</day>
<month>1</month>
<year>2001</year>
</date>
</link>
</links>
第二步:XSTL文件
当要转换XML文件,需要使用一些XSTL文档,此时需要为每一种输出格式准备一种XSLT文档。
links_html.xsl是为HTML准备的,内容如下:
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html"indent="yes"/>
<xsl:template match="links">
<html>
<head>
<title>Funwith xsl</title>
</head>
<body>
<tablecellspacing="0" width="100%">
<tr>
<td align="center">
<tablewidth="95%">
<xsl:apply-templatesselect="link"/>
</table>
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="link">
<tr>
<td>
<tablecellpadding="0" cellspacing="0" width="100%">
<tr>
<td>
<Axsl:use-attribute-sets="a"><xsl:value-ofselect="text"/></A><br/>
</td>
</tr>
<tr>
<td>
<xsl:value-ofselect="author"/><br/>
</td>
</tr>
<tr>
<td>
<xsl:value-ofselect="describe"/><br/>
</td>
</tr>
</table>
</td>
</tr>
</xsl:template>
<xsl:attribute-set name="a">
<xsl:attributename="href"><xsl:value-ofselect="url"></xsl:value-of></xsl:attribute>
</xsl:attribute-set>
</xsl:stylesheet>
XSTL和其支持的标准形成了一个很大而且丰富的环境,但是要全面掌握XSTL需要花费一定的时间。
第三部:创建源对象
源对象用于描述XML数据,这些数据将被用于创建最终的XSTL格式输出。源与XSLT的结合将在JAXP中被转换实现。XSLT会定义转换要完成的工作。JAXP将按照XSLT文档所定义的内容进行转换。
StreamSource
StreamSource是在源中使用XML文件或字符串时所需的对象。
StreamSource ss=new StreamSource(newFile("your_xml_file.xml"));
DOMSource
DOMSource用来描述DOM对象的一个节点。节点可以小至数据元素,也可以是DOM所描述的整个文档。通常可通过创建DOMSource来描述DOM的某一个部分,这些部分需要被修改,或者需要对其进行操作。一旦创建了DOMSource,就可以使用它来实现转换。
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document d=db.parse("your_xml_file.xml");
DOMSource ds=new DOMSource(d);
SAXSource
SAXSource对象代表着SAX类型的源。SAXSource对象可以被组织成一个XMLReader对象,或者任何InputSource对象。
SAXSource ss=new SAXSource(new InputSource(newFileReader("your_xml_file.xml")));
创建StreamSource
使用由links.xml和links_html.xsl构成两个StreamSource对象
StreamSource xml=new StreamSource(newFile("c:/xml/links.xml"));
StreamSource xsl=new StreamSource(newFile("c:/xml/links_html.xsl"));
第四步:创建结果对象
结果对象是JAXP的转换输出,结果不必一定以XML格式,可是HTML、XML、WML等。有三个对象使用result接口:StreamResult、DOMResult、SAXResult。
StreamResult将获取流转换结果。通常当需要将转换结果写入文件,或者JSP需要输出流时,要使用它。
写入文件:StreamResutl sr=new StreamResult(newFile("result.out"));
写入JSP:StreamResutl sr=new StreamResult(out);
DOMResult获取DOM树对象中转换结果。然后该对象还可以被作为Document对象进一步被处理。
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document d=db.newDocument();
DOMResult dr=new DOMResult(d);
SAXResult在对象中用于保存JAXP转换,该对象通过实现ContentHandler接口来处理SAX事件。
SAXResult sr=new SAXResult(newDefaultHandle());//实际中可以使用自定义对象来接收SAX事件
第五步:转换数据
<@page
import="javax.xml.parses.*,org.w3c.dom.*,javax.xml.transform.*,javax.xml.transform.stream.*,java.io.*"%>
<%
StreamSource xml=new StreamSource(newFile("c:/xml/links.xml"));
StreamSource xsl=new StreamSource(newFile("c:/xml/links_html.xsl"));
StreamResult result=new StreamResult(out);
TransformerFactorytFactory=TransformerFactory.newInstance();
Transfromer transformer=tFactory.newTransformer(xsl);
transformer.transform(xml,result);
%>