XSL的解析过程

来源:互联网 发布:淘宝没有完成交易吗 编辑:程序博客网 时间:2024/06/12 00:58

 
XSL的解析过程:

XSLT在进行转换时,首先遍历XML源文档树,找到要处理的节点,然后将定义好的模板信息施加到该节点中。

XML:

<?xml version="1.0" encoding="GB2312" standalone="no"?>
<?xml:stylesheet type="text/xsl" href="BBS2.xsl" ?>
<BBS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BBS.xsd">
 <Root id="1">
  <title>学习JAVA</title>
  <content>请问各位如何学习JAVA?</content>
  <sender>sunny</sender>
  <sendTime>09-3-21</sendTime>
  <isTop>0</isTop>
  <isGood>0</isGood>
  <answer id="1">
   <title>学习JAVA</title>
   <content>首先要有衡心,要耐得住寂莫.</content>
   <sender>李胜光</sender>
   <sendTime>09-3-21</sendTime>
  </answer>
  <answer id="1">
   <title>学习JAVA</title>
   <content>多打代码.</content>
   <sender>lsg</sender>
   <sendTime>09-3-21</sendTime>
  </answer>
 </Root>
 <Root id="423bda04-2aa8-4f52-af75-641718c423da">
  <title>什么是JSP</title>
  <content>JSP是java server page!</content>
  <sender>李胜光</sender>
  <sendTime>Mon Mar 23 16:28:00 CST 2009</sendTime>
  <isTop>0</isTop>
  <isGood>0</isGood>
 </Root>
 <Root id="16eb57fb-d7fa-47a3-b33e-617968bd54a2">
  <title>java概念</title>
  <content>java的三大特性是什么?</content>
  <sender>李胜光</sender>
  <sendTime>Mon Mar 23 16:33:50 CST 2009</sendTime>
  <isTop>0</isTop>
  <isGood>0</isGood>
 </Root>
 <Root id="ec30d056-074e-4af1-9148-acf4500a86c8">
  <title>java is good</title>
  <content>java is good</content>
  <sender>sunny</sender>
  <sendTime>Tue Mar 24 08:25:24 CST 2009</sendTime>
  <isTop>0</isTop>
  <isGood>0</isGood>
 </Root>
</BBS>

 

第一种方式的XSL:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <html>
            <head>
                <title>BBS.xsl</title>
            </head>
            <body>
              <h2 align="center">软件技术之家</h2>
              <center>
              <table border="1" width="80%">
                  <tr>
                      <td width="70%">标题</td>
                      <td width="15%">发帖者</td>
                      <td width="15%">发帖时间</td>
                  </tr>
               <xsl:for-each  select="BBS/Root">
                   <tr>
                      <td width="60%"><xsl:value-of select="title"/></td>
                      <td width="15%"><xsl:value-of select="sender"/></td>
                      <td width="30%"><xsl:value-of select="sendTime"/></td>
                   </tr>
                   </xsl:for-each>
              </table>
              </center>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>


过程分析:
      首先解析转换器加载XML到内存形式一棵树,然后开始(自上而下)读XSL文件根据XSL文件中的  <xsl:template match="/">匹配器在树中进行节点查找定位,找到节点后把<xsl:template match="/">标签内的内容写入到目标html文件中,当遇到xsl命名空间中的标签时,执行标签相应的功能,如当遇到<xsl:for-each  select="BBS/Root">时,在XML文档中进行结点循环匹配查找,每找到一个相应的结点取得相应的值.循环结束后返回,<xsl:template match="/">该句进行下一个"/"的匹配,由于"/"只有一个所以解析结束.


第二种方式的XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="BBS">
 <html>
  <head>
   <title>软件技术之家</title>
  </head>
  <body>
   <h2 align="center">软件技术之家2</h2>
              <center>
              <table border="1" width="80%">
                  <tr>
                      <td width="70%">标题</td>
                      <td width="15%">发帖者</td>
                      <td width="15%">发帖时间</td>
                  </tr>
      <xsl:apply-templates select="Root"/>
              </table>
              </center>
  </body>
 </html>
</xsl:template>

<xsl:template match="Root">
   <tr>
   <td width="60%"><xsl:value-of select="title"/></td>
   <td width="15%"><xsl:value-of select="sender"/></td>
   <td width="30%"><xsl:value-of select="sendTime"/></td>
    </tr>
</xsl:template>
</xsl:stylesheet>

过程分析:
       首先解析转换器加载XML到内存形式一棵树,然后开始(自上而下)读XSL文件根据XSL文件中的  <xsl:template match="BBS">匹配器在树中进行节点查找定位,先是找到XML中BBS结点在html文件中输出:
<html>
  <head>
   <title>软件技术之家</title>
  </head>
  <body>
   <h2 align="center">软件技术之家2</h2>
              <center>
              <table border="1" width="80%">
                  <tr>
                      <td width="70%">标题</td>
                      <td width="15%">发帖者</td>
                      <td width="15%">发帖时间</td>
                  </tr>
系统看到了  <xsl:apply-templates select="Root"/>的指示,于是,它在XML源树中寻找标记为"Root"的节点进行匹配。就象函数调用一样,现在系统跳到了用<xsl:template match="Root">括起的“函数”中继续生成下面的HTML代码:
   <tr>
   <td width="60%"><xsl:value-of select="title"/></td>
   <td width="15%"><xsl:value-of select="sender"/></td>
   <td width="30%"><xsl:value-of select="sendTime"/></td>
    </tr>
解析器继续匹配XML中的"Root"标签直到XML中没有Root标签才返回这样就可以得到多段上面的代码.<xsl:template match="Root">匹配完成返回后执行:
          </table>
              </center>
  </body>
 </html>
执行后继续进行标签"BBS"匹配,由于"BBS"标签只有一个所有匹配完成结束.

原创粉丝点击