XSL的解析过程


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"标签只有一个所有匹配完成结束.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Go语言的标准包 `html/template`,结合 `xml.Unmarshal()` 和 `xml.Decoder` 将XML解析成Go语言的数据结构,再使用 `template.ParseFiles()` 解析HTML模板文件,最后将数据填充到模板中生成HTML文件。 以下是一个简单的示例代码: ```go package main import ( "html/template" "os" "encoding/xml" ) type Person struct { Name string `xml:"name"` Age int `xml:"age"` } func main() { // 解析XML文件 xmlFile, err := os.Open("person.xml") if err != nil { panic(err) } defer xmlFile.Close() var person Person xmlDecoder := xml.NewDecoder(xmlFile) if err := xmlDecoder.Decode(&person); err != nil { panic(err) } // 解析HTML模板文件 htmlTemplate, err := template.ParseFiles("person.html") if err != nil { panic(err) } // 填充数据到模板 outputFile, err := os.Create("person.html") if err != nil { panic(err) } defer outputFile.Close() if err := htmlTemplate.Execute(outputFile, person); err != nil { panic(err) } } ``` 其中,`person.xml` 文件内容如下: ```xml <?xml version="1.0" encoding="UTF-8"?> <person> <name>张三</name> <age>20</age> </person> ``` `person.html` 文件内容如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>个人信息</title> </head> <body> <h1>姓名:{{.Name}}</h1> <h1>年龄:{{.Age}}</h1> </body> </html> ``` 运行以上代码后,会生成一个 `person.html` 文件,内容如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>个人信息</title> </head> <body> <h1>姓名:张三</h1> <h1>年龄:20</h1> </body> </html> ``` 这就是将XML文件转换成HTML文件的过程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值