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

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

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

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

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

CODE:
xml version="1.0" encoding="utf-8"?>
<!-- DTD file -->
<!DOCTYPE gbook SYSTEM "sxgb.dtd">
<!-- XSL file -->
<?xml-stylesheet type="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-09 12:00</time>
<!-- 留言者主页 -->
<homepage>http://www.xujiwei.cn/</homepage>
<!-- 留言内容 -->
<content><![CDATA[ 留言内容 ]]></content>
</message>
</messages>
</gbook>

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

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

文档类型定义sxgb.dtd

CODE:
<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT gbook (info,messages)>
<!ELEMENT info (user,home,msgtotal,pagenow,pagetotal,pageprev,pagenext,logined)>
<!ELEMENT messages (message+)>
<!ELEMENT message (id,username,time,homepage,content)>
<!ELEMENT user (#PCDATA)>
<!ELEMENT home (#PCDATA)>
<!ELEMENT msgtotal (#PCDATA)>
<!ELEMENT pagenow (#PCDATA)>
<!ELEMENT pagetotal (#PCDATA)>
<!ELEMENT pageprev (#PCDATA)>
<!ELEMENT pagenext (#PCDATA)>
<!ELEMENT logined (#PCDATA)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT time (#PCDATA)>
<!ELEMENT homepage (#PCDATA)>
<!ELEMENT content (#PCDATA)>

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

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

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

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

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

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

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

使用模板有两种方法:

第一种是直接应用:

CODE:
<xsl:apply-templates select="info"/>

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

第二种是循环选择:

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

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

至于在select中使用的表达式,属于XPath部分,可以参考W3C的XPath文档(XML Path Language) 。在gbook.xsl中还使用到的标记有:

<xsl:value-of select="content"/>
这是在XSL中常用的标记之一,输出结果是选择节点的值,通过用它来输出节点的值,在这个留言本中,它用来输出用户名、留言者姓名、留言内容等。

<xsl:attribute name="href">gbook.asp?page=1</xsl:attribute>
用来给当前标签添加一个属性,在留言簿中用来给分页导航添加网址。其中name]属性表示要添加属性的名字,标记包含的内容为要添加属性的值。

<xsl:if test="id!=''"><!-- 处理内容 --></xsl:if>
判断test中的表达示结果,如果为真则处理包含的内容,假则忽略。要注意是,如果是判断小于,就不能用“<”,而应该用“<”,因为“<”是标签起始标志,如果不进行转换则在浏览器中会出现错误。

然后就是ASP输出留言簿需要的XML文档了,这个只要按照前面定义的格式,从数据库中读取记录按照模板输出即可,不过需要在输出之前定义MIME类型:
Response.ContentType="application/xml"
指明这是一个XML文档。另外,因为整个留言簿都使用的UTF-8编码,需要在ASP中指定编码:
CodePage="65001"
这句应该放在ASP文件的开头。

最后还有CSS,这个属于定义留言簿的显示效果了,具体可以查看CSS的内容。另外,为了防止用户误操作提交了空表单,我在客户端加了一段JS代码来检查留言姓名和留言内容是否为空,如果为空则提示用户并停止提交表单,具体内容可以查看JS脚本文件。

完整留言簿系统SXGB打包下载

参考资料:
1. XML及WAP开发手册(李建国等编著)
2. xml ,xsl,css 之乱搞

时间: 2024-11-08 18:24:42

XML+XSL+CSS+ASP打造留言簿的相关文章

xml+xsl+css制作的静态网站

问题描述 xml+xsl+css制作的静态网站 学校大作业要做一个用xml+xsl+css制作的静态网站,最少10个页面,网上搜了好多没有呀,急急急,怎么办... 解决方案 XML: XSL 解决方案二: 随便找一个同学做的,稍微修改下,就可以胡乱交差了.别告诉我你的同学一个也不会.遇到这种野鸡大学那你就认倒霉吧. 解决方案三: 网上去找吧,还是挺多的,你也可以找到一个,然后跟着改.. 解决方案四: 自己写呗,,,内容可以是一句话,可以是图片,,相对来说简单呀~~~

[xml] xml ,xsl,css 之乱搞

css|xml 做了一小段xml.与大家交流.三个文件.(blue.xml blue.xsl blue.css )拷到本地同一目录下. blue.xml: <?xml version='1.0' encoding='GB2312'?><?xml:stylesheet type='text/xsl' href='blue.xsl'?><Topic>  <Issue>    <TopicId>000001</TopicId>    <

分离到底!用XML+XSLT+CSS+JQuery+WebService组建Asp.Net网站

前言 早在Web标准化风潮到来之前,我就考虑过XML+XSLT建站了,我以为这是一种非常优雅.高效.低耦的方案,必将大行其道. 然而时至今日,使用这种方案建站的人依然寥寥无几,大家还都在抱着Web标准化不撒手,其实Web标准化只是将表现(Css)分离了出来,而数据和结构仍然混杂在一起,它绝对不是我们最终的归宿,它只是一个过渡品. XHtml标准的建立初衷,其实也就是为了向XML过渡的,XML+XSLT+CSS才真正做到数据.结构.表现的完美分离,才是我们的终极目标. 诚然,XML+XSLT确实有

JS+ASP打造无刷新新闻列表

新闻列表在各大网站中并不少见,有了新闻列表就少不了分页,今天我们要谈的就是各分页间的切换方式. 传统的方法是将页码以URL参数的形式传到列表页,列表页内程序根据传入的参数来显示不同的内容,这之间就有了一次刷新.然而很多时候页面中的新闻列表只占该页布局的一小部分,分了更新这小部分的内容却得刷新整个页面的内容,有人抗议了,于是之后就有人采用XMLHTTP.AJAX等技术来实现无刷新更新列表.今天我们也要实现无刷新更新列表,但不使用XMLHTTP.AJAX等新技术,只使用传统的JavaScript和A

对HTML/XHTML/XML/XSL的一些认识

xhtml|xml xhtml1.X一定是html,而html则不一定是xhtml1.X.那么如果说IE不支持xhtml就等于说IE不支持html,不会吧.所以IE不支持xhtml一说不知何来之有,不过IE不完全支持Css倒是真的,但是,但是css是表现,表现和结构是无关的.xhtml的产生正是因为在html中,表现和结构混为一团,不利于向xml平稳过渡. 如果要说担心,xhtml2.0到值得担心,因为有很多新的东西被加入进来,就需要各浏览器作出相应的支持,不像目前xhtml1.x,浏览器不用变

Javascript+ASP打造无刷新新闻列表

javascript|刷新|无刷新 如上图所示的新闻列表在各大网站中并不少见,有了新闻列表就少不了分页,今天我们要谈的就是各分页间的切换方式.传统的方法是将页码以URL参数的形式传到列表页,列表页内程序根据传入的参数来显示不同的内容,这之间就有了一次刷新.然而很多时候页面中的新闻列表只占该页布局的一小部分,分了更新这小部分的内容却得刷新整个页面的内容,有人抗议了,于是之后就有人采用XMLHTTP.AJAX等技术来实现无刷新更新列表.今天我们也要实现无刷新更新列表,但不使用XMLHTTP.AJAX

如何实现XML+XSL+javascript数据排序

javascript|xml|排序|数据 如何实现XML+XSL+javascript数据排序 数据排序模版<?xml version="1.0" encoding="gb2312" ?><xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/

变脸:用CSS+JS打造的网页皮肤

css|js|网页 变脸:用CSS+JS打造的网页皮肤 每个人都有不同程度的审美疲劳,说俗一点就是喜新厌旧,对于网页,如何把浏览者的审美疲劳拒之门外,使之对网页保持某种意义上的新鲜感,这是一个值得研究的问题.其实,很多大型网站或者个人网站都会不定期地对网页进行改版,这些都可以归纳为一个字,那就是"变",不停地变换网页的布局与样式,就是为了迎合人们不断变化的口味. CSS核心:属性重定义 先来看几个小技巧: 1.给链接加上修饰 我们通常会用样式表以外的元素对链接进行修饰,比如使用图片.使

利用xml+xsl快速生成大量JSP的常用代码的方法.

js|xml 利用xml+xsl快速生成大量JSP的常用代码的方法. 参考Jbuilder的Servlet向导来使用xml+xsl产生JSP的常用代码.xml样本: <?xml version="1.0" encoding="GB2312"?><?xml-stylesheet type="text/xsl" href="jspram.xsl"?><jsp xmlns:xsi="http: