XSLT是一種用來轉換XML文檔結構的說明性計算機語言,隨著網絡時代的發展,它的應用場合越來越廣泛,影響力也越來越大。從不同觀點來看,XSLT或XSL轉換可以說是對XML最好的發展,也可以說是迄今發明的最恐怖的計算機語言之一。
首先,我們要知道XSL與XSLT之前要了解可擴展標記語言(EXtensible Markup Language,XML)。它是由標準化的通用標記語言(Standardized General Markup Language,SGML)派生出來的,盡管它的名字表明它是一種標記語言,且它不僅僅是一種簡單的標記語言,而是一種創建和管理標記的語言。XML文檔由文字組成,除此之外,沒有其他的內容。XML與HTML有些相似,它們都使用尖括號,符號等等,但它卻比HTML更為強大。在XML中,定義元素的標記必須成對匹配。盡管XML文檔內在的邏輯結構是完美的,但對習慣于Web頁面和精美輸出的用戶來說,XML文檔簡直是丑陋之極。XML真正的優勢在于數據交換格式方面,而不在于數據存儲格式方面。如果將XML信息傳遞給某個不支持XML的應用或傳遞給使用其他的XML詞匯表的應用,這時候需要分別為上述情況編寫單獨的轉換程序。XSL是以XML為基礎的樣式單語言來表示CSS屬性。XSL的設計不僅受到CSS和XML的強烈影響,而且還受一種稱為文檔格式語義及規范語言DSSSL的影響。
XSLT轉變工作的原理與造型軟件有些相似,大體上來說,樣式單中的代碼描述了XML源文檔的所有內容,而這些內容也正是所要生成的結果文檔中的內容。在XSLT轉變中,沒有必要像上述廚師到劊子手的變形過程中那樣在相同的地方建立點到點的一一對應關系,可以將相關的內容放在任意位置。XSLT是解決轉換問題的一種通用方案。對于各種不同的文檔結構,通用解決方案是很有用的,因為我們不需要為各種不同的文檔結構編寫定制的程序代碼。雖然需要為每種結構編寫定制的樣式單,但這些樣式單通常都比過程化語言(如C++和Java)編寫的程序要簡單。XSLT的樣式單不僅容易編寫,而且也容易讀,不熟悉XSLT的人都可以讀懂它。因為開發的簡單性和易懂性,相對于文檔處理應用程序,XSLT樣式單的效率要高得多。為每種文檔開發特定的程序的工作量是相當驚人的,更不用說為每個文檔開發一個應用程序,這也正是阻礙文本處理應用被廣泛接受的一個主要原因。簡而言之,XSLT在文檔處理應用的兩個互相矛盾的目標,即簡單性和通用性這間起著重要的平衡作用。為了使XML“舉止”像其他的東西,而不僅僅是表示純內容標記,必須將它轉換成其他的格式。從長遠范圍來看,較為簡單的解決方案是使用一種通用的方法來完成對XML文檔的轉換。
XSLT不能指示計算機如何取得預期的結果,這正是XSLT樣式單區別于傳統意義上的真實“計算機編程語言”之處。XSLT僅簡單地描述了結果是什么樣的。而真正的轉換工作,要由稱為XSLT引擎或XSLT處理器的應用程序完成,并按它為合適的格式產生結果。XSLT轉換的工作是指定一些由XSLT處理器實現 的結果,這些結果是對源文檔中的指定部分的轉換描述。簡而言之,它將源樹(source tree)轉化為結果樹(result tree)?!皹洹敝傅氖悄撤N結構化的數據,這些數據被組織成層狀結構,而且源樹中的數據必須是XML形式的。結果樹可以是任意類型的廣西??梢詫ML文檔轉換為沒有標記的,以逗號分隔平板式文檔,然后將這些數據導入到數據庫去;或將其轉換到另一個XML詞匯表中,或將其導入相同XML詞匯表的另一個版本中。
XMLT能夠引起人的注意,是因為可以同時巧妙地處理多個文檔。其處理模型定義了下列行為:一個樣式表可以引用多個XML輸入文檔。在這種情況下,必須有一個主要的源文件與此樣式表相關聯;另一方面,樣式表可以接著再引用另外的輸入文檔。樣式表可以引用額外的樣式表文檔,允許模塊化用戶樣式表。這里也必須有一個主要的樣式表文檔。該樣式表接著可以利用xsl:import和xsl:include元素引入或包含多個樣式表。對于大多數XSLT處理機來說,另一個有用的功能是能夠在其單次運行中產生多個輸出。XSLT標準目前尚未支持這一功能。不過,市場上的許多產品提供這一功能。頂級元素和指令,這兩個術語都與XSLT樣式單的結構相關。樣式單本身是個良構的XML文檔,而為了實現良構,它只能有一個根元素。在XSLT中,這個根元素是xsl:stylesheet。在xsl:stylesheet元素的開始及結束標簽之間是頂級元素和指令的混合體。它包括所有的名字在XSLT名字空間內的元素,也就是說他們的名字都是以xsl:為前綴的。所謂的頂級元素,指的是xsl:stylesheet的直接子元素;相反,所謂的指令,指的是包含在某些頂級元素中的內容。任何一個模板都必包含在一個頂級元素中,也就是說,模板不能是根元素xsl:stylesheet的直接子元素。
(作者單位:長江大學計算機科學院網絡工程10802班)