posts - 61,  comments - 2033,  trackbacks - 0

          什么是 XSL?在什么情況下應(yīng)該使用它?

          XSL 之于 XML 就像 CSS 之于 HTML。它是指可擴(kuò)展樣式表語(yǔ)言 (EXtensible Stylesheet Language)。這是一種用于以可讀格式呈現(xiàn) XML 數(shù)據(jù)的語(yǔ)言。XSL 實(shí)際上包含兩個(gè)部分:

          • XSLT – 用于轉(zhuǎn)換 XML 文檔的語(yǔ)言
          • XPath – 用于在 XML 文檔中導(dǎo)航的語(yǔ)言

          XSLT 是指 XSL 轉(zhuǎn)換 (XSL Transformation),它是 XSL 最重要的部分。

          XSLT 可以將 XML 文檔轉(zhuǎn)換為其它 XML 文檔、XHTML 輸出或簡(jiǎn)單的文本。這通常是通過將每個(gè) XML 元素轉(zhuǎn)換為 HTML 元素來完成的。由于 XML 標(biāo)簽是用戶定義的,瀏覽器不知道如何解釋或呈現(xiàn)每個(gè)標(biāo)簽,因此必須使用 XSL。XML 標(biāo)簽的意義是為了方便用戶(而不是計(jì)算機(jī))理解。

          XSLT 還可以對(duì) XML 樹進(jìn)行下列操作:

          • 添加和刪除元素
          • 添加和刪除屬性
          • 對(duì)元素進(jìn)行重新排列或排序
          • 隱藏或顯示某些元素
          • 查找或選擇特定元素

           

          XSL 是否與 XML 相同?

          既是又不是。說是,是因?yàn)樗鼈冏裱嗤恼Z(yǔ)法規(guī)則(只有少許差異,下面我將會(huì)講到)。說不是,是因?yàn)樗鼈兊挠猛静煌篨ML 用于承載數(shù)據(jù),而 XSL 則用于設(shè)置數(shù)據(jù)的格式。XSL 聲明與 XML 聲明的不同之處在于,XML 聲明只寫一行,而且沒有結(jié)束標(biāo)簽,而 XSL 聲明必須包含結(jié)束標(biāo)簽。

          在什么情況下應(yīng)該使用 XSL?

          XSL 在設(shè)計(jì)時(shí)有幾個(gè)目標(biāo)用途,這些用途使它成為某些開發(fā)情況下的完美解決方案,而對(duì)另一些開發(fā)情況則毫無用處。

          • XSL 專門用于處理 XML 文檔,并且遵循 XML 語(yǔ)法。因此,它只能在支持 XML 的應(yīng)用程序中與 XML 結(jié)合使用。最合適使用 XML 和 XSL 的情況是:Web 門戶、新聞聚合器、社區(qū)網(wǎng)站或其它任何需要向各種設(shè)備及大量客戶端提供信息的 Web 應(yīng)用程序。
          • XSLT 是一種基于模式匹配的語(yǔ)言。它會(huì)查找匹配特定條件的節(jié)點(diǎn),然后應(yīng)用相應(yīng)的規(guī)則。因此,它不具備大多數(shù)編程語(yǔ)言的計(jì)算能力。例如,XSL 無法在運(yùn)行時(shí)更改變量的值。它不應(yīng)該用于從使用復(fù)雜公式的動(dòng)態(tài)數(shù)據(jù)源(例如在線商店)來計(jì)算值。Web 編程語(yǔ)言更適于此用途。
          • XSL 不能代替或補(bǔ)充 CSS。它不應(yīng)(也不能)用于設(shè)置 HTML 的樣式。但是,您可以將其用于需要頻繁重新設(shè)計(jì)可視化效果、頻繁更換布局以及以靈活格式處理數(shù)據(jù)的網(wǎng)站。
          • XSL 不是內(nèi)容管理工具。它不應(yīng)(也不能)用于更改 XML 文檔的內(nèi)容或者編輯信息。但是,您可以將 XML 和 XSL 用于需要處理幾種不同格式文檔的內(nèi)容管理系統(tǒng)。

          服務(wù)器端與客戶端

          服務(wù)器端轉(zhuǎn)換工作流程如下圖所示:o_fig01.gif

          客戶端 XSL 轉(zhuǎn)換的工作流程:
          o_fig02.gif


          什么是 XPath?

          XSL 使用 XPath 來標(biāo)識(shí) XML 樹中需要處理的各個(gè)元素。

          XPath 規(guī)范基本上遵循與文件系統(tǒng)尋址相同的規(guī)則:

          • 如果 XPath 表達(dá)式以斜杠 (/) 開頭,代表的是 XML 元素的絕對(duì)路徑(從 XML 文檔的根開始)。
          • 如果 XPath 表達(dá)式以雙斜杠 (//) 開頭,則會(huì)選擇當(dāng)前文檔中符合指定條件的所有元素,而不考慮它們?cè)?XML 文檔中的位置。例如,//employee 會(huì)查找 XML 文檔中的所有員工節(jié)點(diǎn)。
          • 星號(hào) (*) 會(huì)選擇由前面的路徑定位的所有 XML 元素。例如,/company/department/* 選擇一個(gè)部門的所有子節(jié)點(diǎn),即該部門的所有員工。
          • 點(diǎn) (.) 選擇當(dāng)前的節(jié)點(diǎn),兩個(gè)點(diǎn) (..) 選擇父節(jié)點(diǎn)。例如,用于選擇某個(gè)員工所在的部門的 XPath 表達(dá)式就是 ../employee
          • 要選擇屬性,請(qǐng)使用 @ 字符。例如,/company/department/employee[@retired] 選擇指定了 retired 屬性的所有員工。

          過濾項(xiàng)目

          使用 <xsl:for-each> 構(gòu)造,您還可以根據(jù)條件過濾輸出。假設(shè)您只想顯示雇員中的程序員。

          <xsl:template match="/">
          <table border="1">
          <tr>
          <th>Name</th>
          <th>Job</th>
          <th>Salary</th>
          </tr>
          <xsl:for-each select="company/department/employee[job='Programmer']">
          <tr>
          <td><xsl:value-of select="name"/></td>
          <td><xsl:value-of select="job"/></td>
          <td><xsl:value-of select="salary"/></td>
          </tr>
          </xsl:for-each>
          </table>
          </xsl:template>
          

          要定義 XML 節(jié)點(diǎn)的條件,可以使用下列任何運(yùn)算符:

          • 等于 (=)
          • 不等于 (!=)例如,name!='Ben Walker'
          • 小于 (<)例如,salary<2750
          • 小于或等于 (<=)
          • 大于 (>)
          • 大于或等于 (>=)

          對(duì)項(xiàng)目進(jìn)行排序

          可以將項(xiàng)目按字母順序排列。只需使用 <xsl:sort /> 構(gòu)造,并指定按哪個(gè)節(jié)點(diǎn)進(jìn)行排序。<xsl:sort /> 元素必須嵌套在 <xsl:for-each> 元素中,以確保應(yīng)用程序可以循環(huán)通過所有的項(xiàng)目。使用下面的代碼可以按字母順序顯示員工:

          <xsl:template match="/">
          <table border="1">
          <tr>
          <th>Name</th>
          <th>Job</th>
          <th>Salary</th>
          </tr>
          <xsl:for-each select="company/department/employee">
          <xsl:sort select="name" />
          <tr>
          <td><xsl:value-of select="name"/></td>
          <td><xsl:value-of select="job"/></td>
          <td><xsl:value-of select="salary"/></td>
          </tr>
          </xsl:for-each>
          </table>
          </xsl:template>
          

          當(dāng)然,您只需在 <xsl:sort /> 元素中額外添加一個(gè)屬性,即可方便地在升序和降序排列順序之間切換:

          <xsl:sort select="/name" order="descending"/>

          單一條件和多個(gè)條件

          在大多數(shù)語(yǔ)言中,XSL 還能夠根據(jù)條件顯示內(nèi)容。

          單一條件是使用下面的語(yǔ)法定義的:

          <xsl:if test="表達(dá)式">
          </xsl:if>

          要對(duì)多個(gè)項(xiàng)目運(yùn)行條件測(cè)試,以便只顯示滿足該條件的項(xiàng)目,需要將 xsl:if 構(gòu)造嵌套在 xsl:for-each 元素中。下面的示例顯示了如何只列出薪金高于 2700 元的員工:

          <xsl:template match="/">
          <table border="1">
          <tr>
          <th>Name</th>
          <th>Job</th>
          <th>Salary</th>
          </tr>
          <xsl:for-each select="company/department/employee">
          <xsl:if test="salary &gt; 2700">
          <tr>
          <td><xsl:value-of select="name"/></td>
          <td><xsl:value-of select="job"/></td>
          <td><xsl:value-of select="salary"/></td>
          </tr>
          </xsl:if>
          </xsl:for-each>
          </table>
          </xsl:template>
          

          請(qǐng)注意,小于 (<) 和大于 (>) 符號(hào)由它們相應(yīng)的 HTML 轉(zhuǎn)義序列(&lt 和 &gt)代替。否則,它們很容易與標(biāo)簽的開頭和結(jié)尾混淆。   

          在測(cè)試表達(dá)式中可以使用常用的條件運(yùn)算符:

          • &lt(小于)
          • &gt(大于)
          • =(等于)
          • !=(不等于)

          如果需要將某個(gè)值與某個(gè)字符串進(jìn)行比較,則要將字符串放在單引號(hào)中(例如 <xsl:if test="job = 'Software Analyst'">)。

          象大多數(shù)編程語(yǔ)言中的 IF-ELSE 構(gòu)造一樣,您還可以定義更復(fù)雜的條件。所使用的語(yǔ)法一看就能明白:

          <xsl:choose>
          <xsl:when test="表達(dá)式">
          
          </xsl:when>
          <xsl:otherwise>
          
          </xsl:otherwise>
          </xsl:choose>

          為了在多個(gè) XML 節(jié)點(diǎn)上測(cè)試條件,<xsl:choose> 構(gòu)造必須嵌套在 <xsl:for-each> 循環(huán)中。

          假設(shè)您要以綠色高亮顯示薪金低于 2700 元的所有員工,以藍(lán)色高亮顯示薪金高于 2700 元的所有員工:

          <xsl:template match="/">
          <table border="1">
          <tr>
          <th>Name</th>
          <th>Job</th>
          <th>Salary</th>
          </tr>
          <xsl:for-each select="company/department/employee">
          <xsl:choose>
          <xsl:when test="salary > 2700">
          <tr bgcolor="#66CCFF">
          <td><xsl:value-of select="name"/></td>
          <td><xsl:value-of select="job"/></td>
          <td><xsl:value-of select="salary"/></td>
          </tr>
          </xsl:when>
          <xsl:otherwise>
          <tr bgcolor="#00CC99">
          <td><xsl:value-of select="name"/></td>
          <td><xsl:value-of select="job"/></td>
          <td><xsl:value-of select="salary"/></td>
          </tr>
          </xsl:otherwise>
          </xsl:choose>
          </xsl:for-each>
          </table>
          </xsl:template>
          

          <xsl:otherwise> 元素指定的是當(dāng) XML 節(jié)點(diǎn)不滿足初始測(cè)試條件時(shí)默認(rèn)應(yīng)用的規(guī)則。

          posted on 2005-11-16 11:43 魚上游 閱讀(1385) 評(píng)論(3)  編輯  收藏 所屬分類: 爪哇友鄰真不少


          FeedBack:
          # re: XSL 學(xué)習(xí)筆記 —— 基礎(chǔ)篇
          2005-12-13 16:07 | david.turing
          還不錯(cuò)!  回復(fù)  更多評(píng)論
            
          # re: XSL 學(xué)習(xí)筆記 —— 基礎(chǔ)篇
          2006-07-26 17:58 | zy
          請(qǐng)問一下,怎么設(shè)定條件,讓我的數(shù)據(jù)可以在表格中分兩列輸出.
          開始時(shí)以為很簡(jiǎn)單,可是,做的時(shí)候發(fā)現(xiàn)很難.
          因?yàn)?在xsl中,沒有辦法將<tr></tr>分開來寫,而一定要在一個(gè)<xsl:if><xsl:if>中寫完  回復(fù)  更多評(píng)論
            
          <2005年11月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(82)

          隨筆分類(59)

          文章分類(21)

          相冊(cè)

          收藏夾(40)

          GoodSites

          搜索

          •  

          積分與排名

          • 積分 - 1268167
          • 排名 - 22

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 奉节县| 临高县| 昭通市| 光泽县| 张家界市| 梨树县| 剑川县| 瑞金市| 永昌县| 筠连县| 博客| 监利县| 会宁县| 普定县| 枣庄市| 改则县| 上高县| 茂名市| 昔阳县| 诏安县| 山东省| 宜城市| 长汀县| 东明县| 丰县| 和林格尔县| 吉安县| 卓资县| 肃北| 东乡族自治县| 中牟县| 尼勒克县| 江源县| 巴中市| 大余县| 德令哈市| 富平县| 彭水| 内乡县| 玛纳斯县| 怀远县|