前面已經提到,透過XSL,我們可以把相同的資料以不同的資料形式提交給終端客戶,一個XSL檔案描述了資料的顯示方式,你可以把許多XSL和同一個xml文件相連來提供不同的基於HTML的表示,這樣事實上,我們就可以建立基於XML的桌面應用程式。基於Windows體系結構的一個圖形表示如下所示:
採用這個方法主要有兩個優點,首先,你可以以平台和語言獨立的方式來操作數據,其次,不需要程式設計你就可以實現對同樣數據的不同的視圖表示。
實際上,你需要一個工具能夠把原始的資料轉換成XML格式化的形式,然後用HTML的格式表示出來。實際上在IE5.0中,你可以透過它對XSL的支援來實現資料的不同視圖。可以使用內建的XSL處理器來從XML流產生輸出。開發人員可以寫不同的XSL劇本,然後用IE內建的XSL處理器對它進行處理。另一方面,我們可以透過ADO元件的內在功能實作把記錄集轉換為XML格式,範例程式碼如下:
If Dir(XML_FILE) = "" Then rs.Save XML_FILE, adPersistXML End If 这里常量adPersistXML表示使用一个XML纲要来保存记录集的内容 我们再仔细看一下Recordset对象的Save方法,其定义如下: Save([FileName As String], [PersistFormat As PersistFormatEnum = adPersistADTG])
每一個參數都是可選的,但是當你第一次把記錄集儲存到磁碟上的時候,你必須指定檔案的名稱。如果當該方法執行的時候,存在一個有效的過濾器的話,只有透過過濾的資料才能夠被保存。當呼叫Recordset物件的方法Close關閉Recordset物件的時候,檔案也被自動關閉。當Recordset被儲存到磁碟上以後,你可以採用Open方法來閱讀它,具體程式碼如下:
rs.open "c:\myrs.xml"
然後我們分析一下關於XML資料的顯示的問題,IE5對XSL的支援是基於W3C最近的草案標準建立的。這裡我們討論用VB建立一個應用,它透過ADO介面來存取資料來源中的資料。得到的記錄集可以以不同的格式化的形式展現。透過編寫XSL文檔,你可以任意的增加不同的視圖。
例如,一旦你提取了一個結果集以後,你可以在VB中用DataGrid控件方便的顯示數據,具體代碼如下:
Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient queryString = "select * from Employees" rs.Open queryString, "NorthWind" 'NorthWind是微软的示例数据库,很容易在 'access或者是SQL SERVER中找到 rs.ActiveConnection = Nothing Set DataGrid1.DataSource = rs
在許多情況下,這個的一個視圖是不夠的,你需要對每個欄位進行嚴格的控制。整個表格中的記錄可能既用表格又用樹的形式表示,提供多個視圖會讓使用者感到更加舒適。 XML和XSL結合是這種問題的很好的解決方案,你可以充分利用IE5中的WebBrowser控制項的功能直接進行瀏覽。
ADO元件本身不會對它產生的XML文件產生任何的XSL文件。單這並不表示你不能自己寫一個通用的XSL文件來改變資料的顯示方式。例如為了自動的把一個包含ADO記錄集的XML文檔以表格的形式顯示的話,需要在XML的文檔頭部增加如下的代碼:
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>
這個simple.xsl文件必須放在和XML文檔在相同的目錄下,它包含兩個嵌套的循環,第一個循環列舉了元素的所有屬性,這些屬性的名字作為標題顯示在第一行,第二個循環用來輸出記錄集中的所有記錄。
simple.xsl檔案的程式碼如下所表示:
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns:html="http://www.w3.org/TR/REC-html40" result-ns="" language="JScript"> <xsl:template match="/"> <html> <head> <title>RowsetSchema</title> <style> .stdText { font-Family:verdana; font-Size: 9px; } </style> </head> <body> <table width="100%" border="1"> <xsl:for-each select="xml/s:Schema/s:ElementType/s:attribute"> <th class="stdText"><xsl:value-of select="@type" /></th> </xsl:for-each> <xsl:for-each select="xml/rs:data/z:row"> <tr> <xsl:for-each select="@*"> <td class="stdText" valign="top"><xsl:value-of match="@*"/></td> </xsl:for-each> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>
這裡需要注意的是關於列舉一個給定節點的所有屬性的語法,實際上我們需要得到任何<z:row >元素的所有屬性,字串@*表示所有的屬性(一個屬性的名字總是需要在前面加上@,為了使用這個值,<xsl:value-of>節點必須設定和它匹配的屬性,用@*進行表示。語言(而不是程式語言)來描述如何顯示XML數據,為了增加一個新的視圖,只需要增加一個對應的XSL文檔就可以了。 /視模型進行類比。影響。角度來看,它們是兩種不同的技巧。