XML+XSL+CSS+ASP打造留言簿

80酷酷网    80kuku.com

  css|xml

前段时间无意间看到一个博客的RSS可以用XSL格式输出并且能在Firefox里浏览,想到自己以前写的一个XML留言簿因为不兼容Firefox所不了了之了,现在看到他的能在Firefox浏览就觉得很好奇,看了一下代码,一句一句的比对,最后终于找到了原因,也就把这个留言簿给完成了。因为是一个简单的XML留言簿,所以取名SXGB(SimpleXMLGuestBook)。

留言本演示,管理密码为test:http://home.goofar.com/hotheart/gbook/gbook.asp

首先定义留言簿的XML文档的格式。作为一个留言簿,不需要太复杂的内容,于是我就给留言内容分为3个部分:留言者姓名、留言者主页和留言内容。另外,一个留言簿还需要有使用者的一些信息,包括用户名和用户主页。再有,在留言比较多时还需要分页信息。大致结构完成后就可以开始写XML文档模板了。

XML文档根元素定义为gbook
XML文档模板gbook.xml

CODE:
xmlversion="1.0"encoding="utf-8"?>
<!--DTDfile-->
<!DOCTYPEgbookSYSTEM"sxgb.dtd">
<!--XSLfile-->
<?xml-stylesheettype="text/xsl"href="gbook.xsl"?>
<gbook>
<!--留言簿相关信息-->
<info>
<!--用户名-->
<user>HotHeart</user>
<!--用户主页-->
<home>http://www.xujiwei.cn</home>
<!--分页信息,分别为目前所在页,总页数,上一页,下一页-->
<pagenow>1</pagenow>
<pagetotal>1</pagetotal>
<pageprev>1</pageprev>
<pagenext>2</pagenext>
<!--是否已经登陆,用来处理是否显示登陆框-->
<logined>NO</logined>
</info>
<!--留言列表-->
<messages>
<!--一个留言-->
<message>
<!--留言ID-->
<id>1</id>
<!--留言者姓名-->
<username>Admin</username>
<!--留言时间-->
<time>2005-08-0912:00</time>
<!--留言者主页-->
<homepage>http://www.xujiwei.cn/</homepage>
<!--留言内容-->
<content><![CDATA[留言内容]]></content>
</message>
</messages>
</gbook>

要注意在引用XSL时不能用
<?xml:stylesheettype="text/xsl"href="gbook.xsl"?>
xml和stylesheet之间应该用一杠(-)而不能用冒号(:),在Firefox里是不支持用冒号的。

一个好的XML文档,除了要有结构性,还应该要有有效性,所以在XML文档的一开头就定义了文档类型定义(DTD)sxgb.dtd,下面就来把这个文档类型定义给完成。因为已经设计好留言簿XML文档的结构,所以写出DTD是很方便的。

文档类型定义sxgb.dtd

CODE:
<?xmlversion="1.0"encoding="utf-8"?>
<!ELEMENTgbook(info,messages)>
<!ELEMENTinfo(user,home,msgtotal,pagenow,pagetotal,pageprev,pagenext,logined)>
<!ELEMENTmessages(message+)>
<!ELEMENTmessage(id,username,time,homepage,content)>
<!ELEMENTuser(#PCDATA)>
<!ELEMENThome(#PCDATA)>
<!ELEMENTmsgtotal(#PCDATA)>
<!ELEMENTpagenow(#PCDATA)>
<!ELEMENTpagetotal(#PCDATA)>
<!ELEMENTpageprev(#PCDATA)>
<!ELEMENTpagenext(#PCDATA)>
<!ELEMENTlogined(#PCDATA)>
<!ELEMENTid(#PCDATA)>
<!ELEMENTtitle(#PCDATA)>
<!ELEMENTusername(#PCDATA)>
<!ELEMENTtime(#PCDATA)>
<!ELEMENThomepage(#PCDATA)>
<!ELEMENTcontent(#PCDATA)>

<!ELEMENTmessages(message+)>中+号表示留言列表中至少有一条留言,但实际应用可能会出现没有留言的情况,为了应对这种情况,我在输出XML文档的ASP程序输出一条系统产生的留言,提示目前还没有留言。

接下来是很重要的部分,XSL的编写了。

XSL文档gbook.xsl
点击这里查看XSL文档gbook.xsl

在定义XSL名称空间时,应该用http://www.w3.org/1999/XSL/Transform,即

CODE:
xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0">

而不能用http://www.w3.org/TR/WD-xsl,不知为什么如果使用这个名称空间,在Firefox会显示错误:分析XSLT样式表单失败。

在XSL里,一个很重要的概念就是模板。一个模板就对应一块内容的格式化输出,在构建模板时,可以从大到小,即先构建全局的模板,然后再处理每一块细分的内容,也可以从小到大,先构建好细分内容的模板,然后将它们组合起来形成整体的模板。在XSL里,创建一个模板使用下面的标记:
[code[<xsl:templatematch="/gbook">
<!--模板内容-->
</xsl:template>[/code]
其中match表示的是这个模板对应那个标记。

使用模板有两种方法:

第一种是直接应用:

CODE:
<xsl:apply-templatesselect="info"/>

这种方法是选择当前标记下的info标记并使用match为info的模板进行处理

第二种是循环选择:

CODE:
<xsl:for-eachselect="message">
<!--模板内容-->
</xsl:for-eace>

在循环选择中,模板直接写在for-each之中,但是当前上下文已经转到message。

至于在select中使用的表达式,属于XPath部分,可以参考

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: