<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Vincent.Chan‘s Blog

    常用鏈接

    統計

    積分與排名

    網站

    最新評論

    XML認證教程,第 4 部分: XSL樣式單

    級別: 初級

    IBM, 作者

    2003 年 3 月 01 日

    對于一批XML數據,應用處理程序要綜合XML文檔、文檔類型說明(Dtd/Schema) 以及樣式單三方面要素來處理和顯示它。

    什么是樣式單

    對于一批XML數據,應用處理程序要綜合XML文檔、文檔類型說明(Dtd/Schema) 以及樣式單三方面要素來處理和顯示它。

    在XML文檔中只包含了數據信息,并沒有涉及文檔如何顯示。不錯,制定XML標準的 目的是要使數據結構化,賦予其明確的語意,使之易于進行數據交換。XML早已不再 把目光局限在文字圖象的顯示上,而是要建立它們之間的內在關系。可以說,XML文 檔本身是重內容而不重形式。

    可是,XML結構化地組織信息固然好,但如果不加修飾地把一大堆枯燥的數據擺在那里,也足以令人眼花頭痛。

    樣式單(StyleSheet)是一種專門描述結構文檔表現方式的文檔,它既可以描述這些 文檔如何在屏幕上顯示,也可以描述它們的打印效果,甚至聲音效果。樣式單一般不 包含在XML文檔內部,而以獨立的文檔方式存在。

    樣式單可以實現非常復雜的顯示效果,但由于樣式描述與數據描述相分離,顯示細節 的描述并不影響文檔中數據的內在結構。

    樣式單的最大優點是:XML關于文檔瀏覽的基本思想是將數據與數據的顯示分別定義。 這樣一來,XML格式文檔不會重蹈某些HTML文檔結構混雜、內容繁亂的覆轍,XML的 編寫者也可以集中精力于數據本身,而不受顯示方式的細枝末節的影響。不僅如此, 樣式單還帶來另一個好處,即定義不同的樣式表可以使相同的數據呈現出不同的顯示 外觀,從而適合于不同應用,甚至能夠在不同的顯示設備上顯示。這樣,XML數據就 可以得到最大程度上的重用性,滿足不同的應用需求。





    回頁首


    XSLT

    W3C已經給出了兩種樣式單語言的推薦標準,一種是層疊樣式單CSS(Cascading Style Sheets),另一種是可擴展樣式單語言XSL(eXtensible Stylesheet Language)。本章講的是XSL。

    XSL本身就是一個XML文檔,它是通過XML進行定義的,遵守XML的語法規則,是XML 的一種具體應用。因此系統可以使用同一個XML解釋器對XML文檔及其相關的XSL文 檔進行解釋處理。XSL由兩大部分組成:第一部分描述了如何將一個XML文檔進行轉 換,轉換為可瀏覽或可輸出的格式;第二部分則定義了格式對象FO(fomatted object)。由于到目前為止,W3C還未能出臺一個得到多方認可的FO,因此本章主 要XML變換--XSL transformations(XSLT)。現在一般所說的XSL大都指的 是XSLT。





    回頁首


    XSLT的應用

    XSLT主要的功能就是轉換,它將一個沒有形式表現的XML內容文檔作為一個源樹, 將其轉換為一個有樣式信息的結果樹。在XSLT文檔中定義了與XML文檔中各個邏輯 成分相匹配的模板,以及匹配轉換方式。它可以很好地描述XML文檔向任何一個其 它格式的文檔作轉換的方法,例如轉換為另一個邏輯結構的XML文檔、HTML文檔、 XHTML文檔、VRML文檔、SVG文檔等等,不一而足。

    使用XSL定義XML文檔顯示方式的基本思想是:通過定義轉換模板,將XML源文檔 轉換為帶樣式信息的可瀏覽文檔。

    限于目前瀏覽器的支持能力,大多數情況下是轉換為一個HTML文檔進行顯示。

    在XML中聲明XSL樣式單的方法為:<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
    至于具體的轉換過程,既可以在服務器端進行,也可以在客戶端進行。





    回頁首


    XSLT樣式單文檔舉例

    下面是一個具體的xslt樣式單文檔:

    												
    														
    <?xml version="1.0" encoding="gb2312" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/tr/WD-xsl">
    <xsl:template match="/">
    <HTML>
    <HEAD>
    <TITLE>學生花名冊</TITLE>
    <STYLE> .title{font-size:15pt; font-weight:bold;
    color:blue } .name{color:red}
    </STYLE>
    </HEAD>
    <BODY>
    <P class="title" >學生花名冊</P>
    <xsl:apply-templates select="學生花名冊"/>
    </BODY>
    </HTML>
    </xsl:template>

    <xsl:template match="學生花名冊">
    <table BORDER="1">
    <THEAD>
    <td> <B>姓名</B> </td>
    <td> <B>籍貫</B> </td>
    <td> <B>年齡</B> </td>
    <td> <B>電話</B> </td>
    </THEAD>
    <xsl:for-each select="學生" order-by="名字">
    <tr>
    <td><B><xsl:value-of select="名字"/></B></td>
    <td><xsl:value-of select="籍貫"/></td>
    <td><xsl:value-of select="年齡"/></td>
    <td><xsl:value-of select = "電話號碼"/></td>
    </tr>
    </xsl:for-each>
    </table>
    </xsl:template>
    </xsl:stylesheet>





    回頁首


    模板在XSLT中的應用

    將上例的XML文檔用XSL樣式轉換為HTML文檔的步驟是:先用XML解釋器將XML文檔 解釋成DOM對象,相當于建立了原文檔的一個節點樹。然后用XML解釋器解釋XSL文 檔,用模板匹配的方法去遍歷XML節點樹,將樹中的節點按模板的設定轉換為模板指 示的顯示語言,即HTML語言。

    要了解這段程序,就要先了解模板。xsl:template是模板元素,用于定義模板,通 常每個xsl:template有一個節點匹配屬性,由"match="指定。在對模板進行匹配時 使用"xsl:apply-templates",用"select"屬性選擇要匹配的模板,相當于一個 調用的過程。比如在
    <xsl:apply-templates select="學生花名冊"/>
    這段語句中用到了xsl:apply-templates,于是系統就跳到了用<xsl:template match="學生花名冊">括起的“函數”中生成HTML代碼。

    如果在xsl:apply-templates語句中沒有指定select屬性,那么就調用所有可以調 用的模板。

    接著介紹xslt常用的幾條語句。

    • 介紹一下XSL的幾條主要語句:
    • xsl:stylesheet 聲明語句
    • xsl:for-each select = "" 循環語句,遍歷與引號中的屬性值相同的節點
    • xsl:value-of select = "" 賦值語句,取出引號中指定的屬性值




    回頁首


    分析XSLT代碼執行過程

    在作過XML聲明和XSL聲明之后,系統最先匹配XML源樹的根節點。根節點用"/"表 示,它的匹配方法在一對<xsl:template match="/">括起的源碼中聲明。按照 這段代碼,首先生成帶有樣式信息的HTML文檔的開頭一段代碼:

    												
    														
    <HTML>
    <HEAD>
    <TITLE>學生花名冊</TITLE>
    <STYLE> .title{font-size:15pt; font-weight:bold; color:blue }
    .name{color:red}
    </STYLE>
    </HEAD>
    <BODY>
    <P class="title" >學生花名冊</P>

    接著,系統看到了<xsl:apply-templates select="學生花名冊"/>的指示,于是, 它在XML源樹中尋找標記為“學生花名冊”的節點進行匹配。就象函數調用一樣,現在系 統跳到了用<xsl:template match="學生花名冊">括起的“函數”中繼續生成下面的 HTML代碼:

    												
    														
    <table BORDER="1">
    <THEAD>
    <td> <B>姓名</B> </td>
    <td> <B>籍貫</B> </td>
    <td> <B>年齡</B> </td>
    <td> <B>電話</B> </td>
    </THEAD>

    現在,系統又接到了新的指示 <xsl:for-each select="學生" order-by="名字">。 這條指示要求系統尋找標記為“student”的子節點,并按照“名字”下的內容將這些節 點排序,然后一一處理。

    對于每一個“學生”子樹中的內容,系統為其生成表中一行的內容。每一行包含四列, 分別把標記為“名字”、“籍貫”、“年齡”、“電話號碼”的子節點的內容填進去。 其中“名字”下的內容還是粗體顯示。對應到本例中的XML數據,生成的HTML代碼為:

    												
    														
    <tr>
    <td><B>李華</B></td>
    <td>河北</td>
    <td>15</td>
    <td>62875555</td>
    </tr>
    <tr>
    <td><B>張三</B></td>
    <td>北京</td>
    <td>14</td>
    <td>82873425</td>
    </tr>

    處理完<xsl:for-each select="學生" order-by="名字">中的內容,系統繼續生成HTML代碼:

    												
    														
    </table>

    至此,系統已處理完<xsl:template match="學生花名冊">中的所有內容,可以“函數 返回”了。 系統返回到<xsl:template match="/">括起的源碼中,完成HTML最后兩行代碼的生成:

    												
    														
    </BODY>
    </HTML>

    把上面的HTML代碼串起來,就是生成的轉換結果文件。





    回頁首


    XSLT文件文檔結構

    前面說過,XSLT文檔本身是XML文檔,因此文檔的第一句自然是:

    												
    														
    <?xml version="1.0" encoding="gb2312"?>

    接下來是樣式單部分:

    												
    														
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/tr/WD-xsl">
    ... ...
    </xsl:stylesheet>

    xmlns:xsl指示了XSL的命名空間,在XSLT標準中,定義了XSLT的命名空間為 http://www.w3.org/1999/XSL/transform,然而在ie5中不支持這個名字 空間,需要用到微軟自己的名字空間http://www.w3.org/tr/WD-xsl。

    XSLT在進行轉換時,首先遍歷XML源文檔樹,找到要處理的節點,然后將定義好 的模板信息施加到該節點中。
    下面將要介紹xslt樣式單的語法。





    回頁首


    樣式單模板xsl:template

    xsl:template元素有一個mode屬性,可以根據需要去匹配不同模式的模板。 若將前例作如下修改:

    												
    														
    <xsl:template match="/" mode="blue">
    ...
    <TITLE>學生花名冊</TITLE>
    <STYLE> .title{font-size:15pt; font-weight:bold; color:blue }
    ...
    <xsl:template match="/" mode="red">
    ...
    <TITLE>學生花名冊</TITLE>
    <STYLE> .title{font-size:15pt; font-weight:bold; color:red }

    如果要將TITLE輸出為藍色,則用下面語句匹配:
    <xsl:apply-templates select="/" mode="blue"/>

    如果要將title輸出為紅色,則寫為:
    <xsl:apply-templates select="/" mode="red"/>

    此外,模板總是與節點相對應的,一個節點可能對應于不同的模板,那么如何確定各 模板匹配的先后次序呢?XSLT中可為xsl:template設置優先級,寫法是:
    <xsl:template match="student" priority="n"> //n為優先級數





    回頁首


    xsl:value-of計算節點值

    在使用XSLT進行轉換時,常常需要獲取節點值,使用xsl:value-of元素可達到 這個目的,如下例:
    <xsl:value-of select="籍貫"/>

    得到的是學生原籍的值,select屬性指定要獲取的是哪一個節點的節點值。





    回頁首


    xsl:for-each循環處理

    使用xsl:for-each可對所選節點依次進行處理,如例中在生成表格處理中,就是 利用循環將各個學生的信息取出放入表格中的,寫法是:

    												
    														
    <xsl:for-each select="student" order-by="name">
    ...
    </xsl:for-each>

    可以認為<xsl:for-each select="">能實現多個 <xsl:apply-templates select="">的功能。





    回頁首


    xsl:sort排序處理

    對于用xsl:for-each或xsl:apply-templates匹配的節點,可使用xsl:sort將 所選節點內容進行排序

    1. 按大小寫排序
      <xsl:sort case-order="upper-first" select="@id"/> 以id為關鍵字按大寫優先排序
      <xsl:sort case-order="lower-first" select="@id"/> 以id為關鍵字按小寫優先排序
    2. 按字母順序排序
      <xsl:sort order="ascending" select="@id "/> 以id為關鍵字按字母升序排序
      <xsl:sort order="descending" select="@id "/> 以id為關鍵字按字母降序排序
    3. 按數據類型排序
      <xsl:sort data-type="text" select="@id"/> 以id為關鍵字按文本類型排序,如對于一組id數據101,2,44,305 來說,排序結果是101,2,305,44
      <xsl:sort data-type="number" select="@id"/> 以id為關鍵字按數據類型排序,上面一組數據的排序結果是2,44,101,305
      另外,還有一種指定排序的方法,就是在前面學生花名冊例中所使用的order-by: <xsl:for-each select="student" order-by="name"> 也可使得輸出學生時按名字排序。




    回頁首


    元素與屬性創建

    XSLT是一個動態的樣式單,在處理過程中可產生新的元素或元素屬性,方法如下:

    內 容 元 素 舉 例 轉換結果
    創建元素 xsl:element <xsl:element name="TITLE">學生花名冊</xsl:element> 學生花名冊
    創建屬性 xsl: attribute <TITLE><xsl:attribute name="style">color:blue </xsl:attribute>學生花名冊</TITLE > <TITLE style="color:blue">學生花名冊</TITLE>
    創建文本 xsl:text (可以保護文本中的空白字符) <xsl:text> 這是學生花名冊 </xsl:text > 這是學生花名冊
    創建處理指令 xsl:processing-instruction <xsl:processing-instruction name="xml-stylesheet"> href="book.css" type="text/css" </xsl:processing-instruction> <?xml-stylesheet href="book.css" type="text/css"?>
    創建注釋 xsl:comment <xsl:comment> 以下是學生花名冊,請勿刪改! </xsl:comment> <!-- 以下是學生花名冊,請勿刪改!-->




    回頁首


    節點拷貝

    在對XML文檔進行處理時,XSLT還可以通過拷貝的方式復制節點,方法是利用 xsl:copy和xsl:copy-of。其中xsl:copy只拷貝當前節點,不包括子節 點和屬性;而xsl:copy-of的拷貝內容則包括當前節點、子節點和屬性。 例如對于:
    <p id="p1">A <B>is a char</B> </p>

    如果樣式單寫為如下形式:

    												
    														
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/transform">
    <xsl:template match="p">
    <DIV>
    <xsl:text> copy-of : </xsl:text>
    <xsl:copy-of select="."/>
    </DIV>
    <DIV>
    <xsl:text> copy : </xsl:text>
    <xsl:copy/>
    </DIV>
    </xsl:template>
    </xsl:stylesheet>

    轉換后生成如下代碼:

    												
    														
    <DIV>
    copy-of : <p id="p1">A <B>is a char</B> </p>
    </DIV>
    <DIV>
    copy : <p/>
    </DIV>

    由此可見,兩種拷貝方式結果大相徑庭。





    回頁首


    輸出格式與編碼問題

    XSLT是一個轉換語言,它的目的是將XML源文檔轉換為另一種格式文檔,它的輸出結 果可以是HTML文檔,也可以是帶CSS的XML文檔。具體的輸出格式由xsl:output 指 定。如果要輸出為HTML文檔,則寫為: <xsl:output method="html"/>

    同樣,要輸出XML文檔寫為: <xsl:output method="xml"/>

    如果文檔中不出現xsl:output,將缺省輸出為XML文檔,但如果在匹配模板時使用了 <HTML>標記,則輸出為HTML文檔。輸出為HTML文檔時系統都會自動加上下面語句: <!DOCTYPE html PUBLIC "-//W3C//Dtd HTML 4.0 transitional//EN">

    此外,還可以利用xsl:output指定編碼方式,如UTF-8,UTF-16,GB2312等。例如: <xsl:output method="html" encoding="GB2312"/> 它指定了該XSLT的輸出結果是HTML格式,編碼方式為中文。





    回頁首






    回頁首


    關于作者


    IBM has authored this article

    posted on 2006-03-21 23:42 Vincent.Chen 閱讀(278) 評論(0)  編輯  收藏 所屬分類: XML

    主站蜘蛛池模板: 成人黄页网站免费观看大全| 午夜理伦剧场免费| 四虎影视大全免费入口| 亚洲人成毛片线播放| 97在线视频免费| 亚洲精品高清国产麻豆专区| 69视频免费观看l| 亚洲图片中文字幕| 最近最新的免费中文字幕| 国产成人精品亚洲2020| 在线观看人成网站深夜免费| 亚洲精华国产精华精华液好用| 国产精品国产午夜免费福利看| 久久亚洲精品无码网站| 亚洲成a人无码av波多野按摩| 一区二区三区免费高清视频| 国产亚洲AV无码AV男人的天堂| 青柠影视在线观看免费高清| 久久亚洲中文字幕精品有坂深雪| 免费高清国产视频| 亚洲国产人成在线观看| 啦啦啦手机完整免费高清观看| 美女视频黄.免费网址 | 亚洲AV无码之国产精品| 国产在线ts人妖免费视频| 一区二区三区免费看| 久久亚洲春色中文字幕久久久| 69天堂人成无码麻豆免费视频| 久久亚洲欧美国产精品| 曰韩亚洲av人人夜夜澡人人爽| 免费在线视频你懂的| 99亚洲男女激情在线观看| 亚洲综合精品香蕉久久网| 亚欧免费视频一区二区三区| 综合一区自拍亚洲综合图区| 亚洲AV无码专区电影在线观看| 最近的免费中文字幕视频| 国产精品免费视频观看拍拍 | 免费A级毛片无码久久版| 99re6在线视频精品免费| 亚洲免费二区三区|