通过XSL转换XML文件

    最近,开始学习了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 "&#203;&#206;&#204;&#229;", "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模式。读者朋友可以不用加。


效果如图:
result.gif

完了,这只是个小小的启示录。

大家要加油,努力啊,国家正在大力推行XML,以抵抗微软的进攻。只要学好了XML,我们将大有作为的。

哈哈!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值