學習資源:
1. http://www.w3school.com.cn/xsl/
2. https://www6.software.ibm.com/developerworks/cn/education/xml/x-introxslt/section2.html
?
?
1.XSLT的概念
我們首先來澄清一個概念,大家可能聽說過XSL(eXtensible Stylesheet Language),XSL和我們這里說的XSLT從狹義上理解是一樣的,而按照W3C的標準,XSLT的說法更嚴格些,因此我們在文章中統一使用 XSLT的稱法。它們之間具體的關系我們會在下面講述。
1.1 什么是XSLT
XSLT的英文標準名稱為eXtensible Stylesheet Language Transformation。根據W3C的規范說明書(http://www.w3.org/TR/xslt),最早設計XSLT的用意是幫助XML文 檔(document)轉換為其它文檔。但是隨著發展,XSLT已不僅僅用于將XML轉換為HTML或其它文本格式,更全面的定義應該是:
XSLT是一種用來轉換XML文檔結構的語言。
1.2 為什么要用XSLT
我們已經知道,XML是一種電腦程序間交換原始數據的簡單而標準的方法。它的成功并不在于它容易被人們書寫和閱讀,更重要的是,它從根本上解決了應用系統 間的信息交換。因為XML滿足了兩個基本的需求:
(1).將數據和表達形式分離。就象天氣預報的信息可以顯示在不同的設備上,電視,手機或者其它。
(2).在不同的應用之間傳輸數據。電子商務數據交換的與日俱增使得這種需求越來越緊迫。
為了使數據便于人們的閱讀理解,我們需要將信息顯示出來或者打印出來,例如將數據變成一個HTML文件,一個PDF文件,甚至是一段聲音;同樣,為了使數 據適合不同的應用程序,我們必須有能夠將一種數據格式轉換為另一種數據格式,比如需求格式可能是一個文本文件,一個SQL語句,一個HTTP信息,一定順 序的數據調用等。而XSLT就是我們用來實現這種轉換功能的語言。將XML轉換為HTML,是目前XSLT最主要的功能。
?
1.3 什么是XPath
XPath是XSLT的重要組成部分,我們將在第四章講解它的詳細語法。那么XPath是什么呢?我們首先來了解一下XSL系列的"家族"關系。如下圖:
XSL在轉換XML文檔時分為明顯的兩個過程,第一轉換文檔結構;其次將文檔格式化輸出。這兩步可以分離開來并單獨處理,因此XSL在發展過程中逐漸分裂 為XSLT(結構轉換)和XSL-FO(formatting objects)(格式化輸出)兩種分支語言,其中XSL-FO的作用就類似CSS在HTML中的作用。而我們這里重點討論的是第一步的轉換過程,也就是 XSLT。
另外,在學習XML時我們已經知道XML是一個完整的樹結構文檔。在轉換XML文檔時可能需要處理其中的一部分(節點)數據,那么如何查找和定位XML文 檔中的信息呢,XPath就是一種專門用來在XML文檔中查找信息的語言。XPath隸屬XSLT,因此我們通常會將XSLT語法和XPath語法混在一 起說。
用一種比較好理解的解釋:如果將XML文檔看作一個數據庫,XPath就是SQL查詢語言;如果將XML文檔看成DOS目錄結構,XPath就是 cd,dir等目錄操作命令的集合。
?
1.4 XSLT和CSS的比較
CSS同樣可以格式化XML文檔,那么有了CSS為什么還需要XSLT呢?因為CSS雖然能夠很好的控制輸出的樣式,比如色彩,字體,大小等,但是它有嚴 重的局限性,就是:
(1) CSS不能重新排序文檔中的元素;
(2) CSS不能判斷和控制哪個元素被顯示,哪個不被顯示;
(3) CSS不能統計計算元素中的數據;
換句話說,CSS只適合用于輸出比較固定的最終文檔。CSS的優點是簡潔,消耗系統資源少;而XSLT雖然功能強大,但因為要重新索引XML結構樹,所以 消耗內存比較多。
因此,我們常常將它們結合起來使用,比如在服務器端用XSLT處理文檔,在客戶端用CSS來控制顯示。可以減少響應時間。
?
?
(1)cdcatalog_with_xsl.xml
?
<?xml version="1.0" encoding="utf-8"?> <!--引用xslt轉換xml--> <?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?> <catalog> <cd> <title>One night only</title> <artist>Bee Gees</artist> <country>UK</country> <company>Polydor</company> <price>10.90</price> <year>1998</year> </cd> <cd> <title>One night only</title> <artist>Bee Gees</artist> <country>UK</country> <company>Polydor</company> <price>10.90</price> <year>1998</year> </cd> <cd> <title>One night only</title> <artist>Bee Gees</artist> <country>UK</country> <company>Polydor</company> <price>10.90</price> <year>1998</year> </cd> <cd> <title>One night only</title> <artist>Bee Gees</artist> <country>UK</country> <company>Polydor</company> <price>10.90</price> <year>1998</year> </cd> <cd> <title>One night only</title> <artist>Bee Gees</artist> <country>UK</country> <company>Polydor</company> <price>10.90</price> <year>1998</year> </cd> <cd> <title>One night only</title> <artist>Bee Gees</artist> <country>UK</country> <company>Polydor</company> <price>10.90</price> <year>1998</year> </cd> <cd> <title>One night only</title> <artist>Bee Gees</artist> <country>UK</country> <company>Polydor</company> <price>10.90</price> <year>1998</year> </cd> </catalog>??
(2)cdcatalog.xsl
?
<?xml version="1.0" encoding="utf-8" ?> <!-- 聲明一個 XSL 樣式表 --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!--match 屬性的值是 XPath 表達式(match="/" 表示匹配整個文檔)--> <xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th align="left">標題</th> <th align="left">作者</th> <th align="left">國家</th> <th align="left">價格</th> <th align="left">年份</th> </tr> <!-- select="catalog/cd[country='UK'] 選取catalog根節點下cd節點下country元素值為"UK"的CD節點集合--> <xsl:for-each select="catalog/cd[country='UK']"> <!-- 按artist排序--> <xsl:sort select="artist"/> <!--判定條件 price值>8 執行 xsl:if體 --> <xsl:if test="price > 8"> <tr> <!--多重條件判定,結合 when,otherwise使用--> <xsl:choose> <xsl:when test="price > 9"> <!-- xsl:value 輸出元素值--> <td bgcolor="#ff00ff"><xsl:value-of select="title"/></td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="title"/></td> </xsl:otherwise> </xsl:choose> <td><xsl:value-of select="artist"/></td> <td><xsl:value-of select="country"/></td> <td><xsl:value-of select="price"/></td> <td><xsl:value-of select="year"/></td> </tr> </xsl:if> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet>?
?
?
?
?
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
