本月,我們將討論在站點上實現菜單和 TOC 的幾種不同方式。我們將解決有關實現過程和架構的幾個問題,同時看壹看幾個案例:
在框架中直接引入 XML
在動態生成的 HTML 中使用 ASP #include
在預先創建的 HTML 中使用 ASP #include
有壹點很重要,必須註意:盡管我們能夠用任壹瀏覽器查看輸出的 DHTML,但是只要進行 XSL 轉換,就必須安裝 Internet Explorer 5。如果像在第壹個案例中,需要將 XML 發送到客戶機,則客戶機必須是 Internet Explorer 5。如果像在第二個和第三個案例中,要在服務器上轉換 XML,則服務器上必須安裝 Internet Explorer 5。(註意:在服務器上可以只安裝可重分發的 Microsoft XML 分析程序(英文))。
案例 1:在框架中直接引入 XML
如果您處於完全的 Internet Explorer 5 環境中(如 intranet),將輸出發送給用戶的最簡單的方式可能是借助於 Internet Explorer 5 直接瀏覽 XML(英文) 的功能。Internet Explorer 5 可以使用相關的樣式表提交 XML;您不需要進行顯式轉換。您只需要指定帶有處理指南(英文)的 XSL 樣式表。
在第壹個案例中,我們使用自己的 TOC 作為例子,TOC 框架中將包含壹個文件,其 webdev.xml 文件將引用 TOC 樣式表,如下所示:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="toc.xsl"?>
<TOPICLIST TYPE="Web Dev References">
.
.
.
</TOPICLIST>
TOC 框架自身將包含在框架集中,如下所示:
<FRAMESET COLS="150,*">
<FRAME NAME="fraToc" SRC="webdev.xml">
<FRAME NAME="fraContent" SRC="home.htm">
<FRAMESET>
如果您用 Internet Explorer 5 查看這些代碼,您可以查看 XML 瀏覽 TOC 演示。
瀏覽 XML 除了是壹種向用戶發送帶樣式的 XML 的簡便方式,它還是壹種非常好的調試 XSL 樣式表的方式,即使您要在服務器上進行轉換,也可以使用這種方式。Internet Explorer 可以在出現錯誤時為您提供即時的反饋,包括行號和錯誤類型。
案例 2:在動態生成的 HTML 中使用 ASP #includes
在許多情況下,除了 Internet Explorer 5 之外,您還需要顧及其他瀏覽器,或者希望只用 XML 構成 HTML 文檔的壹部分(如頂端的菜單),而不是整篇文檔。ASP #include 命令為在較大型文檔中插入幾個字符的 HTML 和跨多頁***享公用代碼提供了壹個非常好的方式。通過在 #include 文件中進行 XSL 轉換,可以非常方便地對 ASP #includes 進行擴展,以便利用 XML。
#include 文件將加載 XML 和 XSL 文件,將其轉換為 HTML,然後將 HTML 寫入 ASP 文檔。如下所示是包含菜單的 ASP 文檔:
列表 1:使用“動態” #includes 的通用 HTML 文檔模板
<HTML>
<HEAD>
<TITLE>Dynamic ASP #include demo</TITLE>
</HEAD>
<BODY>
<!-- #include file="menus_dyn.inc" -->
<P>此處為常規文檔內容...</P>
</BODY>
</HTML>
Include 文件將完成所有繁瑣的工作。
列表 2:menus_dyn.inc
<% @LANGUAGE="JScript" %>
<%
var sXml = "webdev.xml";
var sXsl = "menus.xsl";
var oXmlDoc = Server.CreateObject("Microsoft.XMLDOM");
oXmlDoc.async = false;
oXmlDoc.load(Server.MapPath(sXml));
if (false != oXmlDoc.parseError)
{
Response.Write('XML parseError on line ' + oXmlDoc.parseError.line);
Response.End();
}
var oXslDoc = Server.CreateObject("Microsoft.XMLDOM");
oXslDoc.async = false;
oXslDoc.load(Server.MapPath(sXsl));
if (false != oXslDoc.parseError)
{
Response.Write('XSL parseError on line ' + oXslDoc.parseError.line);
Response.End();
}
Response.Write(oXmlDoc.transformNode(oXslDoc));
%>
從上壹篇文章開始,我已經將菜單升級為可跨瀏覽器使用,所以您能夠應用任壹瀏覽器查看動態 #include 演示。
案例 3:在預先創建的 HTML 中使用 ASP #include
在服務器負荷較重的情況下,或您無論因何種原因,不希望在每次加載菜單時調用 XML 對象,您可以選擇第三種方案:脫機進行轉換。在這壹情況下所使用的代碼與“真正的”include 幾乎完全相同。
唯壹的區別是:有別於使用 Response.Write 輸出所需要的 HMTL,我們可以使用 Scripting.FileSystemObject 對象將已轉換的 HTML 保存到壹個文件中。
列表 3:makemenus.asp
<% @LANGUAGE="JScript" %>
<%
var sXml = "webdev.xml";
var sXsl = "menus.xsl";
var oXmlDoc = Server.CreateObject("Microsoft.XMLDOM");
oXmlDoc.async = false;
oXmlDoc.load(Server.MapPath(sXml));
if (false != oXmlDoc.parseError)
{
Response.Write('XML parseError on line ' + oXmlDoc.parseError.line);
Response.End();
}
var oXslDoc = Server.CreateObject("Microsoft.XMLDOM");
oXslDoc.async = false;
oXslDoc.load(Server.MapPath(sXsl));
if (false != oXslDoc.parseError)
{
Response.Write('XSL parseError on line ' + oXslDoc.parseError.line);
Response.End();
}
var sOutput = oXmlDoc.transformNode(oXslDoc);
var sIncFileName = "menus_pre.inc";
var oFS = Server.CreateObject("Scripting.FileSystemObject");
var oIncFile = oFS.CreateTextFile(Server.MapPath(sIncFileName));
oIncFile.Write(sOutput);
oIncFile.Close();
Response.Write('The include file <A HREF="' + sIncFileName + '">'
+ sIncFileName + '</A> was successfully created.');
%>
我們不是寫入到 ASP 響應流,而是在服務器上創建了壹個“靜態”文件,其中包含已轉換的 HTML。換句話說,與將 XML 轉換代碼直接置於 #include 文件不同,所有的轉換代碼都將位於 “實用程序”ASP 頁中,該 ASP 頁將生成 include 文件。
如果您需要對 Web 應用程序使用編譯過程,您可能會喜歡這種方式。無論任何時候更新 menus.xml 文件,我們只需加載 makemenus.asp ,輸出壹個更新的 #include 文件。將這壹算法用在 Visual Basic 應用程序中能夠實現同壹目的。
像在案例 2 中壹樣,我們在所有使用這些菜單的文檔中添加這壹 #include 文件。