最近,开始学习了XML编程,慢慢的喜欢赏了它。
XML文件只注重对数据与文件格式的描述,但它还是不太适合用来显示内容。用它作出来的东西看起来并不是那么美观,但还是可以找到补救的方法的。我们把显示方面的工作交给排版样式表。
排版样式表分:CSS和XSL。其中XSL非常适合XML。(在这里不着重讨论CSS!)
现在开始转换吧!
XSL包含两大部分:XSLT和XSL Formatting Object
XSLT(XSL Transformations)一种用来转换XML文件的语言。
XSL Formatting Object:一组用来格式化(排版)语意的词汇。
第一步:转换
这里我们以cocoon为依托。
XSL处理器首先要做的是通过分析器(DOM或SAX)技术读取XML标记及数据。
DOM(Document Object Model)文件对象模型。(XML应用上常利用DOM技术来访问XML数据文件。)
当浏览器通过XML DOM对象读取到XML的树状结构与数据后,将XML树状结构重新排行组合后产生一个暂时的数状结构,这个树状结构称为结果树。
在这个结果树产生后,若又出现了新的标记或数据,必须把它一起并入结果树。
现在我们不写任何java代码,通过配置cocoon中sitemap文件,使xsl来读取xml文件并用来转换。
◎:先写一个one.xml文件做为我们的数据源。
<!-- one.xml -->
<?xml version="1.0" encoding="utf-8" ?>
<Department>
<Employee>
<id>1</id>
<name>Chaoyang</name>
<age>23</age>
<phone>1387144345*</phone>
<address>computer 武船</address>
</Employee>
<Employee>
<id>2</id>
<name>Flayd</name>
<age>23</age>
<phone>123654789</phone>
<address>武船</address>
</Employee>
<Employee>
<id>3</id>
<name>苛子</name>
<age>26</age>
<phone>2001332211</phone>
<address>Web 武船</address>
</Employee>
<Employee>
<id>4</id>
<name>太子</name>
<age>58</age>
<phone>23049239023</phone>
<address>武船 论坛</address>
</Employee>
<Employee>
<id>5</id>
<name>周吴郑王</name>
<age>108</age>
<phone>138714434**</phone>
<address>javascript 武船</address>
</Employee>
</Department>
第二步:格式化转换
结果树也是树状结构,可以利用DOM技术访问结果树的数据,数据以节点方式显示,并且预留一个记录样式的位置。
XSL处理其中的程序将这些数据转换(格式化)为另一种Well-Formed XML文件(如:WML、HTML、VoiceXML等)。其实XSL本身也是一种良构的XML文档,现在我们编写用于转换one.xml的XSL文件。
<!--one.xsl
@@:然后着手写我们的XSLT文件:one.xsl.该文件中多处用了模板。
//one.xsl -->
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>XSLT XML</title>
<style>
body,Department,Employee,id,name,age,phone,address{
font: 12px "ËÎÌå", "Arial", "Times New Roman"; }
table { font-size: 12px; border: 0px double; border-color: #99CC99
#99CC99 #CCCCCC #CCCCCC; cellpadding:3;cellspacing:3;
bgcolor:#eeeeee; text-decoration: blink}
span { font-size: 12px; color: red; }
</style>
</head>
<body>
<p align="center">
<span>用XSLT转换XML</span>
</p>
<div id="Layer1" name="Layer1">
<xsl:apply-templates select="Department" />
</div>
</body>
</html>
</xsl:template>
<!-- *** Define Department 模板 *** -->
<xsl:template match="Department">
<table width="500" border="1" align="center" cellpadding="1"
cellspacing="1" bordercolordark="#ffffff"
bordercolorlight="#ADAAAD">
<tr bgcolor="#FFCC99" align="center">
<td>bule_id</td>
<td>name</td>
<td>age</td>
<td>phone</td>
<td>address</td>
</tr>
<xsl:apply-templates select="Employee"/>
</table>
</xsl:template>
<!-- *** Define Employee 模板 *** -->
<xsl:template match="Employee">
<tr align="center">
<xsl:apply-templates select="id" />
<xsl:apply-templates select="name" />
<xsl:apply-templates select="age" />
<xsl:apply-templates select="phone" />
<xsl:apply-templates select="address" />
</tr>
</xsl:template>
<!-- *** Define 员工属性子模板 *** -->
<xsl:template match="id">
<td bgcolor="#eeeeee">
<xsl:value-of select="."/>
</td>
</xsl:template>
<xsl:template match="name">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
<xsl:template match="age">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
<xsl:template match="phone">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
<xsl:template match="address">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
</xsl:stylesheet>
第三步:在cocoon中注册管道。
<map:pipeline>
<map:match pattern="one">
<map:act type="encoding">
<map:generate src="one.xml" type="file"/>
<map:transform src="one.xsl" type="xslt"/>
<map:serialize type="html"/>
</map:act>
</map:match>
</map:pipeline>
其中两处加了颜色的地方是笔者写了一个java类用来规范cocoon中流的字符编码采用UTF-8模式。读者朋友可以不用加。
效果如图:
完了,这只是个小小的启示录。
大家要加油,努力啊,国家正在大力推行XML,以抵抗微软的进攻。只要学好了XML,我们将大有作为的。
哈哈!