第五章 xml 可延伸樣式語言
DESCRIPTION
第五章 XML 可延伸樣式語言. XSL 簡介 XSLT 樣版規則及樣式 範本元素 排序元素. XSL 簡介. XSL 是一種強大的 Script 語言,在功能上主要分為兩個部分: 轉換 XML 文件:將 XML 文件架構轉換成另一個 XML 架構的文件或非 XML 文件,例如 HTML 文件。 格式化 XML 文件:格式化元素內容的樣式,以便顯示出 XML 文件。. XSL 簡介 ( 續 ). XSL 的兩個部分分別屬於不同的規格,其中轉換部分的規格稱為 XSLT(XSL Transformations) ,至於格式化部分的規格目前仍屬於草案階段。 - PowerPoint PPT PresentationTRANSCRIPT
• XSL 簡介• XSLT• 樣版規則及樣式• 範本元素• 排序元素
第五章 XML 可延伸樣式語言
XSL 簡介• XSL 是一種強大的 Script 語言,在功能上主要分為兩個部分:–轉換 XML 文件:將 XML 文件架構轉換成另一個XML 架構的文件或非 XML 文件,例如 HTML 文件。
–格式化 XML 文件:格式化元素內容的樣式,以便顯示出 XML 文件。
XSL 簡介 (續 )
• XSL 的兩個部分分別屬於不同的規格,其中轉換部分的規格稱為 XSLT(XSL Transformations) ,至於格式化部分的規格目前仍屬於草案階段。
•目前能支援 XML 的瀏覽器並不多,所以 XSLT 的角色就相當重要,只需 XSLT 就可以 XML 文件轉換成 HTML 文件,而 XML 配合 XSLT 就可以在支援 HTML 的瀏覽器顯示文件內容。
XML 文件的輸出方式
HTML Document
XSLTransformation
Spec
CSS StyleSheet
XMLDocument
XSL StyleSheet
XSLTransformation
Web browser
XML-enabledWeb Browser
XSL displayEngine
XSL 與 CSS 的比較
比較項目 CSS XSL
可用於瀏覽器外的環境否 ? 不行 可以
可以使用在 HTML 否 ? 可以 不行
可使用在 XML 否 ? 可以 可以
可轉換 XML 文件否 ? 不行 可以
語法格式 CSS XML
XSLT•使用 XSLT ,開發者可以描述轉換 XML 文件結構的樣式表,而由 XSLT 解譯器來作轉換
• XSLT 可以經由你所指定的轉換規則,來將一個 XML 的原始文件轉換成目的文件
XSLT 運作方式
XSLT 輸出
XML
XSLT
XSLT 處理器 HTML/XML
XPath• XPath 是一種語言,用來描述 XML 節點的位置。
例如 :/BOOKLIST/BOOK/CODE
XPath 的位置路徑
運算子 說明/ 子元素路徑運算子// 遞迴下層路徑運算子. 目前的節點.. 父節點* 萬用字元
@ 元素的屬性[ ] 指出節點的索引| 組合多個位置路徑
子元素的位置路徑• /booklist/book/name• /booklist/book/author/name• //name• /booklist/book//name• /booklist/*• //*• /booklist/book/@sales• /booklist/book[1]
使用 XSLT• XSLT 的語法
<?xml-stylesheet type=“text/xsl” herf=“ch8-3.xsl” ?>
XSLT 簡單範例XML 文件
<?xml version="1.0" encoding="Big5"?><?xml-stylesheet type="text/xsl" href="ch8-3.xsl" ?>
<hello> 大家好! </hello>
<?xml version="1.0" encoding="Big5"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head><title> 測試 XSLT</title></head>
<body>
<h2><center><xsl:value-of select="hello"/></center></h2>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
經過轉換
未經過轉換
XSLT 基本架構
<?xml version="1.0" encoding="Big5"?><xsl:stylesheet version="1.0“xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">……………………</xsl:template>
</xsl:stylesheet>
XSLT 基本架構 (續 )•前面曾經說過, XSLT 屬於範本驅動的轉換,概標籤下的子元素是由數個 xsl:template元素組成,每一個元素的範本對應指定元素轉換後的輸出資料,這些資料就是 HTML標籤或不同架構的 XML 元素。
內容元素 xsl:value-of•在 XML 文件使用 XSLT 進行轉換時,我們需要取得 XML 元素的內容,只需指定 select屬性的元去名稱即可,如下所示 :
<xsl:template match="/"><h2><xsl:value-of select="hello"/></h2>
</xsl:template>
內容元素 xsl:value-of( 續 )•選擇屬性內容 :如果轉換輸出的為 XML 元素的屬性,我們需要在屬性前加上「@」符號,如下所示:<xsl:template match=“hello">
<h2><xsl:value-of select=“@good"/></h2></xsl:template>
範本元素 xsl:template
<xsl:template match="/">
……………………
</xsl:template>
• 上述開始標籤 <xsl:template…> 和 </xsl:template> 結尾標籤間的就是範本定義的轉換規則,XSLT 處理器會將此範本套用在 match 屬性指定的元素,這也包括其下的子元素,以此 match屬性的模型為「 /」,這指的是根節點和其下的所有元素。
範本元素 xsl:template( 續 )• Match屬性 :
– Template最重要的屬性就是match,這個屬性就是Xpath指出元素 的位置路徑,一些常用的屬性內容如下:
/ 根節點下所有子元素
/glossary/item[position()=1] Glossary 元素第一個 item元素
/glossary/item[@version=‘AB’] Glossary 元素屬性 version 為 AB 的 title 元素
/glossary/item[last()]/definition Glossary 元素最後一個 item 元素的 definition 子元素
範本元素 xsl:template( 續 )• Match 屬性舉例說明:
<xsl:template match="/glossary/item[position()=1]"><p><b><xsl:value-of select="title"/> - <xsl:value-of select="definition"/></b> (<xsl:value-of select="definition/title"/>)</p></xsl:template>
遞迴範本元素 xsl:apply-templates
•如果單純使用前面的範本元素,我們需要替每一個 XML 元素建立轉換的 script碼,遞迴範本元素 xsl:apply-template 可以使用遞迴的方式顯示所有的子元素。
遞迴範本元素 xsl:apply-templates
<xsl:template match=“item">
<b><xsl:value-of select="title" /></b>
<xsl:apply-templates select="definition"/>
</xsl:template>
• 上述範本元素的模型為 item ,擁有兩個子元素 title 和 definition 元素,其中 definition 也擁有同名的子元素 title ,如果沒有遞迴範本元素 , XSLT 處理器就到 item 元素為止。
•如果使用遞回範本元素,處理器會遞迴繼續找尋子節點,此時有兩種情況,如下所示:–沒有 select 屬性:繼續找尋所有的子節點,也就是 title 和 definition 元素,再次找尋是右有符合的範本,繼續執行轉換。
–擁有屬性 select : select 屬性能夠指定開始的元素,以上頁例子,就是由 item 子元素 definition 開始,如此就不包括子元素 title 。
遞迴範本元素 xsl:apply-templates
XSLT 的迴路元素
• xsl:for-each 語法 <xsl:for-each select="booklist/book">………
</xsl:for-each>
•上述迴路元素的 select 屬性指定顯示的元素,以此示所有 book 元素,標籤內容可以使用 xsl:value-of 元素輸出子元素的內容。
• 舉例說明 : 下例為 XML 原始檔案
<xsl:template match="/">
………
<xsl:for-each select="booklist/book">
<tr><td><xsl:value-of select="code"/></td>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="authorlist/author"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:for-each>
………
而下列則是 XSLT 的部分,藉此 for-each元素,便可得到下頁的結果。
由此可見, for-each 元素可將所有的元素內容,並且加以修飾顯示方式,如下所示:
過濾 XML 元素的 select 屬性• 在使用 for-each迴路時,如果不想顯示所有的 XML 元素,我們可以在 select 屬性上加上過濾條件,只顯示符合條件的元素,如下所示:
• 上述迴路的條件為 book 元素屬性 sales 是 Y。<xsl:for-each select="booklist/book[@sales='Y']">
若我們使用前面的 XML 文件套用前一頁的 select 屬性用法,則得到以下的結果:
排序元素 xsl:sort• HTML 標籤的內容無法進行排序的處理,但是 XSLT Script擁有排序元素,能夠指定 XML 元素進行排序。
<xsl:sort select="title" order="descending"/>
descending:從大到小ascending: 從小到大
由前一頁的 XSLT 來看,依據 title 來排序,從大到小,便可由下表可得證:
單一條件元素 xsl:if
• 目前 XSLT Script都是直接輸出轉換的結果,但是在轉換時我們可能需要測試一些情況,以決定是否轉換,這就屬於單一條件元素。
<xsl:if test="@sales = 'Y'">……..
</xsl:if><xsl:if test="@sales = 'N'">
……..</xsl:if>
所以,我們可以利用單一條件元素來呈現下列的表格:
多條件元素 xsl:choose•如果在條件處理上需要多條件,我們可以使用 xsl:choose、 xsl:when、 xsl:otherwise 元素建立多條件元素。
<xsl:choose> <xsl:when test="price > 500">
……… </xsl:when><xsl:when test="price = 500"> ……… </xsl:when><xsl:otherwise> ……… </xsl:otherwise>
</xsl:choose>
利用多條件元素 choose 便可以達成多項條件的判斷,如下圖所示。
呼叫函數元素 xsl:call-template
•建立範本函數
•上述範本並不是 XML 元去的範本,而是使用 name 屬性建立一個名為 showbook 的範本函數。
<xsl:template name=“showbook">
……………
</xsl:template>
呼叫函數元素 xsl:call-template( 續 )
•呼叫範本函數元素
•上述 call-template 元素呼叫範本函數, name 屬性指定範本函數的名稱。
<xsl:call-template name=“showbook">
……………
</xsl:call-template>
呼叫函數元素 xsl:call-template ( 續 )
•範本函數的參數傳遞
<xsl:template name=“showbook">
<xsl:param name=“position” select=“/booklist/book”/>
……………
</xsl:template>
呼叫函數元素 xsl:call-template ( 續 )
•如果範本函數需要傳入參數,只需在 xsl:template 元素為一個參數, name 屬性為參數名稱, select 屬性為參數的預設值,當呼叫範本函數時沒有傳入參數,就是使用 select 屬性的預設值。
呼叫函數元素 xsl:call-template ( 續 )
•在範本函數傳入參數後,請使用「$」符號加上參數名稱取出參數值,如下所示。– $position
•接著回到呼叫範本函數 call-template 元素,使用 with-param 元素傳入範本函數所需的參數,如下頁所示。
呼叫函數元素 xsl:call-template ( 續 )
<xsl:call-template name="showbook"> <xsl:with-param name="position" select="/book
list/book[price < '500']"/></xsl:call-template>
•上述元素 with-param 元素對應 template 子元素 param ,其中 name 性為參數名稱, select 為參數值。
複製元素 xsl:copy• 如果 XML 元素名稱是輸出元素的名稱,我們可以直接使用 copy 元素輸出 XML 元素名稱,例如 :XML 元素 title ,如下所示 :
<xsl:template match=“title”> <xsl:copy> <xsl:apply-template/> </xsl:copy><xsl:template>
複製元素 xsl:copy ( 續 )•上頁範本元素直接將 title 元素輸出成同名的元素,如果需要複製整個子元素,使用萬用字元「 *」,如下所示 :
<xsl:template match=“title”> <xsl:copy select=“*”/></xsl:template>
刪除元素
•如果想刪除指定的 XML 去,只需建立所需的範本元素,元素 內容為空的,如下所示 :
<xsl:template match=“code”></xsl:template>
•上述範本元素為空元素,也就是刪除 XML元素 code 。
更改元素名稱
•如果需要更改元素名稱,例如 :將 XML的 title 元素輸出成 HTML 的 h2標籤,如下所示 :<xsl:template match=“title”>
<h2> <xsl:apply-template/> </h2>
</xsl:template>•上述範本元素只需活用 apply-template元素輸出成 h2元素。
建立元素 xsl:element
•如果輸出的 XML 文件要新增 XML 元素,只需要使用 xsl:element 元素的 name 屬性新增所需的元素,如下所示 :
<xsl:element name=“catalog”>網頁製作 </xsl:element>
•上述 element 元素建立一個 XML 元素 catalog ,如下 :<catalog>網頁製作 </catalog>
建立屬性元素 xsl:attribute•如果新建立的元素 擁有屬性,我們可以在element 子元素 attribute新元素的屬性,如下所示 :
<xsl:element name=“catalog”> <xsl:attribute name=“code”>A001</xsl:attribute> 網頁製作</xsl:element>
建立屬性元素 xsl:attribute ( 續 )
•上頁 XSLT 元素建立 XML 元素 catalog 和屬性 code ,如下所示 :
<catalog code=“A001”>網頁製作 </catalog>
•同樣方式,可以使用 comment建立註解文字,如下所示 :
<xsl:comment>網頁製作研究系列 </xsl:comment>