一、XML文檔轉換原理 數據格式轉換的重要思想是要把XML文檔視為一種樹結構,轉換的過程就是從源樹生成結果樹的過程。XSL樣式單定義了源樹和結果樹中對應部分的轉換規則,每條規則中包含了一個模板,並對應著一種模式。模板定義了轉換的結果,而模式則規定了需要進行轉換的元素或屬性對象。 XML中引用XSL的語法格式如下: <?XML-stylesheet type=“text/xsl” href=“Employees.xsl” ?> 如果在聲明部分引用了多個XSL樣式單,則只有第一個樣式單會生效,其余的都會被忽略掉。 XSL的格式轉換功能在復雜的電子商務解決方案中大有用武之地。比如,A公司和B公司都是生產機器零件的廠家,在貨物清單中都包含了產品序列號以及質量等級評分。A公司的文件格式如下: <Order> <OrderItem> <ItemID>12980-235</ItemID> <Quantity>200</Quantity> </OrderItem> </Order> 而B公司的文件格式有所不同,相關信息都出現在元素的屬性中: <Order> <OrderLine PartNo=“12980-235” NumRequired=“200”/> </Order> 這樣,雖然兩個公司的產品完全一樣,但由於文檔格式的差異給雙方的貿易往來設置了障礙。而使用XSL樣式單可以輕松地把A公司的文檔轉換成B公司的格式,反之亦然。
二、XML文檔轉換步驟 XML文檔的轉換過程分為兩步: ● 首先是根據XML文檔構造源樹,然後根據XSL規則將源樹轉換為結果樹。目前,這種轉換協議已經日趨完善,並從XSL中獨立出來,成為W3C正式推薦的標准,稱為XSLT(XSL Transformations); ● 生成結果樹後,就可以對其進行解釋,產生一種適合顯示、打印或是播放的格式,這一步稱為格式化(Formatting)。 XSL處理器負責實現轉換過程。首先,XML文檔被解析成DOM樹存放在內存中,接著對文檔進行分析,每一個DOM樹中的節點都會與一個模式相比較,當二者匹配時,就會按照模板中定義的規則進行轉換,否則繼續往下匹配。如此循環,直至整個文檔處理完畢。
三、XSL文檔標准格式 XSL文檔的標准格式如下: <xsl:stylesheet xmlns:xsl=“http://www.w3.org/TR/WD-xsl”> template rule i output template </xsl:stylesheet> XSL文檔本身是格式良好的XML文檔,所以在書寫時要注意標簽的匹配問題。<xsl:stylesheet>既是XSL的聲明語句,也是根元素,必須位於文件的首部。通常也要利用XMLns屬性指明XSL的名稱空間。樣式單中所有的模板規則都由標簽<xsl:temlplate>標明。模板規則可以說明處理的對象(元素/屬性)、處理的方式或是轉換的結果。此時,我們可以把該標簽類似地理解為編程語言中函數的概念。
四、XSL的語法結構 XSL的邏輯語法結構包括循環和條件判斷。這兩種結構使用戶能夠靈活地書寫轉換規則。循環判斷是通過<xsl:for-each>元素實現的,它的可選屬性包括select和order-by。循環結構能夠遍歷整個結果集合,而不必針對每一條結果都單獨書寫轉換規則。它的標准語法格式為: <xsl:for-each select=“pattern” order-by=“patternlist”> ...... </xsl:for-each> 條件判斷結構分為if語句和Case語句兩種形式。if語句是簡單地對條件進行判斷,結果為真就執行條件內部的規則,因此可以把if條件與簡單的布爾表達式聯合使用。下面這個例子就是對薪水超過100萬元的職員輸出“Overpaid employee”信息: <xsl:if match=“.[Salary $gt$ 1000000]”> Overpaid employee </xsl:if> Case語句是對多種情況的分支判斷。該語句包括<xsl:choose>、<xsl:when>和<xsl:otherwise>三個元素。下面的例子是對薪水不足1萬元的職員輸出“No tax”,對超過5萬元的職員輸出“High tax rate”,對介於其間的職員輸出“Normal tax rate”信息: <xsl:choose> <xsl:when match=“.[Salary $lt$ 10000]”> No tax </xsl:when> <xsl:when match=“.[Salary $gt$ 50000]”> High tax rate </xsl:when> <xsl:otherwise> Normal tax rate </xsl:otherwise> </xsl:choose>
五、XSL的模板規則 <xsl:template>標簽內的文本內容描述了轉換結果的形式,稱為輸出模板。屬性match的取值把模板規則與指定的元素或屬性相比較,只有匹配的DOM節點才會被處理,其余的節點將被忽略。整個過程中最先匹配的是樹的根節點,根節點用“/”表示: <xsl:template match=“/”> output template for root element </xsl:template> 然後匹配其他節點,此時,只要在引號中指明要處理的元素對象名稱即可。如果在引號中出現的是“*”,那麼表示該規則適用於所有的未單獨指定處理的元素節點。比如下例中的第二個模板就表示要處理除<Employee>元素之外的所有節點: <xsl:template match=“Employee”> output template </xsl:template> <xsl:template match=“*”> output template </xsl:template> 此外,XSL中還可以使用路徑指示符來指定一些特殊位置的元素與模板相匹配。“//”代表任意深度位置,如<xsl:template match=“//Employee”>用來匹配文檔中任何位置的<Employee>元素;而如果是<xsl:template match=“Employee//Name”>,則表明是匹配<Employee>元素的後繼節點中所有<Name>元素。另外一個路徑指示符是“/”,表示直接的父子節點關系。將剛才例子中的“//”換為“/”,就意味著匹配的是<Employee>元素子節點中的<Name>元素。 很顯然,某些樹節點在XSL中可能會對應多個模板,在這種情況下,只有最後一個對應模板會生效,前面的模板規則都會被XSL處理器忽略掉。