griefforyou [原作]
親愛的GUI 博士:
我有一個關於XML 的問題。我透過XMLHTTP 發布一個ASP 頁面,將資料作為HTML 發送回來,並在div、表格單元格或任何元素上執行object.innerHTML。
我遇到的問題是,有一次,我在ASP 伺服器頁面上建立一個表單,並將該表單以HTML 發送回去,這樣做一切正常。但我還希望對該頁面進行客戶端驗證,因此我將一個JScript 頁面連結放到了我打算發送回去的回應HTML 的正文中。這樣做以後,腳本就無法運行了。
當我在父頁上包含實際的JScript src 參考時,它可以正常運作。這是因為JScript 程式碼沒有載入到運行庫嗎?能否在回應XMLHTTP post 時不傳回JScript 程式碼並使它正常運作?可以為所建立的頁面即時產生JScript 函數嗎?
我還沒有嘗試用另一種方式這樣做:透過XMLHTTP 發布XML 數據,然後將它作為XML 數據發送回去,再使用XSL 樣式表進行轉換。我猜想,可以用那種方式定義JScript 函數。但這種方式似乎太繁雜了。您有任何建議或答案嗎?
謝謝
Peter Sung
GUI 博士的回覆:
是的,Peter,您可以在回應XMLHTTP post/get 時傳回Microsoft JScript 程式碼,並使程式碼執行。這樣做就像先拿到一塊蛋糕,然後再吃掉它。正像您猜想得那樣,這樣做的最佳方式是利用XSL 樣式表;一旦您使所有類型恢復正常,這很容易。 GUI 博士甚至可以提供一個快速的範例。 (當然,也有其他的解決方案。只要響應按正確的順序包含正確的標頭和字符,瀏覽器將解譯響應,以便響應正常工作。如果需要,您可以利用字符串連接生成響應。)
在下面的範例中,GUI 博士在ASP 頁中將JScript 用於客戶端程式碼和VBScript(Microsoft Visual Basic 腳本編寫版)。採用的策略是這樣的:XML 檔案只包含資料(以及對樣式表的引用)。 XSL 檔案包含構成完整頁面所必需的所有HTML 格式(包括位於適當位置的腳本)。 ASP 頁主要包含幾個調用,以建立XMLHTTP 對象,將XML 檔案載入該對象(利用隱式樣式表),並將結果HTML 寫入回應流。
要試用這種方法,請執行下面所示的簡單步驟。使用記事本複製和貼上,並將所有檔案保存在c:inetpubwwwroot 中。
1.
建立一個包含以下XML 文字且名為books.xml 的檔案。記下對books.xsl 樣式表的引用。除此之外,此文件只包含資料。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="books.xsl" ?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
</book>
</catalog>
2.
然後,建立一個包含以下程式碼且名為books.xsl 的檔案。此文件是第1 步驟中建立的books.xml 所引用的樣式表。它包含將上面的XML 檔案正確地格式化為HTML 頁所必需的信息,甚至在該HTML 頁上包含腳本。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl=" http://www.w3.org/1999/XSL/Transform ">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>Test</title>
</head>
<script language="JScript">
function Test_OnLoad()
{
var objXML = new ActiveXObject("MSXML2.DOMDocument");
objXML.async=false;
objXML.load("books.xml");
alert(objXML.xml);
objXML=null;
}
</script>
<body onload="Test_OnLoad()">
<table border="1">
<xsl:for-each select="catalog/book">
<tr>
<td>
<xsl:value-of select="author"/>
</td>
<td>
<xsl:value-of select="title"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
3.
最後,建立一個包含以下程式碼且名為books.asp 的檔案。此文件只用於建立XMLHTTP 對象,為其載入XML 文件,並將結果HTML 寫入回應流。
<%
dim sxh
Response.contentType = "text/xml"
set sxh = Server.CreateObject("MSXML2.XMLHTTP.3.0")
sxh.open "GET"," http://localhost/books.xml",false
sxh.send
Response.write sxh.responsetext
%>
4.
開啟您的瀏覽器,定位到http://localhost/books.asp頁。
5.
您會看到顯示包含books.xml 資料的警報。這是由XSL 檔案中的腳本完成的。您也會在網頁上的一個表格中看到格式整齊的資料。這是由XSL 程式碼完成的。