表A:
1-0-1,this is a test
3-1-1,this is a test
4-3-1,this is a test
5-3-1,this is a test
2-0-2,this is a test
上面是BBS主題列表的一個例子。一般來說,假如不是使用Oracle(Oracle 有一條查詢語句可以自動生成家族樹,請查閱Select ... start with ... connect by ...語句),那麼如何實現上例的列表是一件費事的工作(相信許多程序員都寫過)。
如果我們改用XML來實現,那麼結果會怎麼樣呢?
現在我們使用"Select * from bbs"從數據庫中查詢貼子,並以XML格式返回(如果你是用ADO,那麼可以用其RecordSet.Save ... adPersistXML直接生成,當然如果你不喜歡ADO生成的格式,可用程序生成,如本例):
表B:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="b.xsl"?>
<bbs>
<post sid="4" pid="3" aid="1">
<title>4-3-1,this is a test</title>
<content>slddfjslajfsdljf</content>
</post>
<post sid="5" pid="3" aid="1">
<title>5-3-1,this is a test</title>
<content>slddfjslajfsdljf</content>
</post>
<post sid="3" pid="1" aid="1">
<title>3-1-1,this is a test</title>
<content>slddfjslajfsdljf</content>
</post>
<post sid="1" pid="0" aid="1">
<title>1-0-1,this is a test</title>
<content>slddfjslajfsdljf</content>
</post>
<post sid="2" pid="0" aid="2">
<title>2-0-2,this is a test</title>
<content>slddfjslajfsdljf</content>
</post>
</bbs>
說明:這裡sid是貼子的id號,pid是貼子的父id號。title是標題,content是貼子的內容。
上表中第二行是指定使用b.XSL來轉換XML內容。這是提供給IE5的信息。假如你使用XMLDOM,那麼可以不要這條信息。
我們再來看看將上表的XML內容顯示成表A形式的XSL文件是怎麼實現的:
表C: b.XSL
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="*"/>
</body>
</html>
</xsl:template>
<xsl:template match="post">
<li>
<div>
<xsl:attribute name="title"><xsl:value-of select="content"/></xsl:attribute>
<xsl:value-of select="title"/>
<xsl:if test="/bbs/post[@pid=context()/@sid]">
<xsl:element name="ul">
<xsl:apply-templates select="/bbs/post[@pid=context()/@sid]"/>
</xsl:element>
</xsl:if>
</div>
</li>
</xsl:template>
<xsl:template match="bbs">
<ul>
<xsl:apply-templates select="post[@pid=0]"/>
</ul>
</xsl: