第五章 xml 可延伸樣式語言

50
• XSL 簡簡 • XSLT • 簡簡簡簡簡簡簡 • 簡簡簡簡 • 簡簡簡簡 簡簡簡 XML 簡簡簡簡簡簡簡

Upload: cyrah

Post on 21-Jan-2016

43 views

Category:

Documents


0 download

DESCRIPTION

第五章 XML 可延伸樣式語言. XSL 簡介 XSLT 樣版規則及樣式 範本元素 排序元素. XSL 簡介. XSL 是一種強大的 Script 語言,在功能上主要分為兩個部分: 轉換 XML 文件:將 XML 文件架構轉換成另一個 XML 架構的文件或非 XML 文件,例如 HTML 文件。 格式化 XML 文件:格式化元素內容的樣式,以便顯示出 XML 文件。. XSL 簡介 ( 續 ). XSL 的兩個部分分別屬於不同的規格,其中轉換部分的規格稱為 XSLT(XSL Transformations) ,至於格式化部分的規格目前仍屬於草案階段。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第五章  XML 可延伸樣式語言

• XSL 簡介• XSLT• 樣版規則及樣式• 範本元素• 排序元素

第五章 XML 可延伸樣式語言

Page 2: 第五章  XML 可延伸樣式語言

XSL 簡介• XSL 是一種強大的 Script 語言,在功能上主要分為兩個部分:–轉換 XML 文件:將 XML 文件架構轉換成另一個XML 架構的文件或非 XML 文件,例如 HTML 文件。

–格式化 XML 文件:格式化元素內容的樣式,以便顯示出 XML 文件。

Page 3: 第五章  XML 可延伸樣式語言

XSL 簡介 (續 )

• XSL 的兩個部分分別屬於不同的規格,其中轉換部分的規格稱為 XSLT(XSL Transformations) ,至於格式化部分的規格目前仍屬於草案階段。

•目前能支援 XML 的瀏覽器並不多,所以 XSLT 的角色就相當重要,只需 XSLT 就可以 XML 文件轉換成 HTML 文件,而 XML 配合 XSLT 就可以在支援 HTML 的瀏覽器顯示文件內容。

Page 4: 第五章  XML 可延伸樣式語言

XML 文件的輸出方式

HTML Document

XSLTransformation

Spec

CSS StyleSheet

XMLDocument

XSL StyleSheet

XSLTransformation

Web browser

XML-enabledWeb Browser

XSL displayEngine

Page 5: 第五章  XML 可延伸樣式語言

XSL 與 CSS 的比較

比較項目 CSS XSL

可用於瀏覽器外的環境否 ? 不行 可以

可以使用在 HTML 否 ? 可以 不行

可使用在 XML 否 ? 可以 可以

可轉換 XML 文件否 ? 不行 可以

語法格式 CSS XML

Page 6: 第五章  XML 可延伸樣式語言

XSLT•使用 XSLT ,開發者可以描述轉換 XML 文件結構的樣式表,而由 XSLT 解譯器來作轉換

• XSLT 可以經由你所指定的轉換規則,來將一個 XML 的原始文件轉換成目的文件

Page 7: 第五章  XML 可延伸樣式語言

XSLT 運作方式

Page 8: 第五章  XML 可延伸樣式語言

XSLT 輸出

XML

XSLT

XSLT 處理器 HTML/XML

Page 9: 第五章  XML 可延伸樣式語言

XPath• XPath 是一種語言,用來描述 XML 節點的位置。

例如 :/BOOKLIST/BOOK/CODE

Page 10: 第五章  XML 可延伸樣式語言

XPath 的位置路徑

運算子 說明/ 子元素路徑運算子// 遞迴下層路徑運算子. 目前的節點.. 父節點* 萬用字元

@ 元素的屬性[ ] 指出節點的索引| 組合多個位置路徑

Page 11: 第五章  XML 可延伸樣式語言

子元素的位置路徑• /booklist/book/name• /booklist/book/author/name• //name• /booklist/book//name• /booklist/*• //*• /booklist/book/@sales• /booklist/book[1]

Page 12: 第五章  XML 可延伸樣式語言

使用 XSLT• XSLT 的語法

<?xml-stylesheet type=“text/xsl” herf=“ch8-3.xsl” ?>

Page 13: 第五章  XML 可延伸樣式語言

XSLT 簡單範例XML 文件

<?xml version="1.0" encoding="Big5"?><?xml-stylesheet type="text/xsl" href="ch8-3.xsl" ?>

<hello> 大家好! </hello>

Page 14: 第五章  XML 可延伸樣式語言

<?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>

Page 15: 第五章  XML 可延伸樣式語言

經過轉換

未經過轉換

Page 16: 第五章  XML 可延伸樣式語言

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>

Page 17: 第五章  XML 可延伸樣式語言

XSLT 基本架構 (續 )•前面曾經說過, XSLT 屬於範本驅動的轉換,概標籤下的子元素是由數個 xsl:template元素組成,每一個元素的範本對應指定元素轉換後的輸出資料,這些資料就是 HTML標籤或不同架構的 XML 元素。

Page 18: 第五章  XML 可延伸樣式語言

內容元素 xsl:value-of•在 XML 文件使用 XSLT 進行轉換時,我們需要取得 XML 元素的內容,只需指定 select屬性的元去名稱即可,如下所示 :

<xsl:template match="/"><h2><xsl:value-of select="hello"/></h2>

</xsl:template>

Page 19: 第五章  XML 可延伸樣式語言

內容元素 xsl:value-of( 續 )•選擇屬性內容 :如果轉換輸出的為 XML 元素的屬性,我們需要在屬性前加上「@」符號,如下所示:<xsl:template match=“hello">

<h2><xsl:value-of select=“@good"/></h2></xsl:template>

Page 20: 第五章  XML 可延伸樣式語言

範本元素 xsl:template

<xsl:template match="/">

……………………

</xsl:template>

• 上述開始標籤 <xsl:template…> 和 </xsl:template> 結尾標籤間的就是範本定義的轉換規則,XSLT 處理器會將此範本套用在 match 屬性指定的元素,這也包括其下的子元素,以此 match屬性的模型為「 /」,這指的是根節點和其下的所有元素。

Page 21: 第五章  XML 可延伸樣式語言

範本元素 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 子元素

Page 22: 第五章  XML 可延伸樣式語言

範本元素 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>

Page 23: 第五章  XML 可延伸樣式語言

遞迴範本元素 xsl:apply-templates

•如果單純使用前面的範本元素,我們需要替每一個 XML 元素建立轉換的 script碼,遞迴範本元素 xsl:apply-template 可以使用遞迴的方式顯示所有的子元素。

Page 24: 第五章  XML 可延伸樣式語言

遞迴範本元素 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 元素為止。

Page 25: 第五章  XML 可延伸樣式語言

•如果使用遞回範本元素,處理器會遞迴繼續找尋子節點,此時有兩種情況,如下所示:–沒有 select 屬性:繼續找尋所有的子節點,也就是 title 和 definition 元素,再次找尋是右有符合的範本,繼續執行轉換。

–擁有屬性 select : select 屬性能夠指定開始的元素,以上頁例子,就是由 item 子元素 definition 開始,如此就不包括子元素 title 。

遞迴範本元素 xsl:apply-templates

Page 26: 第五章  XML 可延伸樣式語言

XSLT 的迴路元素

• xsl:for-each 語法 <xsl:for-each select="booklist/book">………

</xsl:for-each>

•上述迴路元素的 select 屬性指定顯示的元素,以此示所有 book 元素,標籤內容可以使用 xsl:value-of 元素輸出子元素的內容。

Page 27: 第五章  XML 可延伸樣式語言

• 舉例說明 : 下例為 XML 原始檔案

Page 28: 第五章  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元素,便可得到下頁的結果。

Page 29: 第五章  XML 可延伸樣式語言

由此可見, for-each 元素可將所有的元素內容,並且加以修飾顯示方式,如下所示:

Page 30: 第五章  XML 可延伸樣式語言

過濾 XML 元素的 select 屬性• 在使用 for-each迴路時,如果不想顯示所有的 XML 元素,我們可以在 select 屬性上加上過濾條件,只顯示符合條件的元素,如下所示:

• 上述迴路的條件為 book 元素屬性 sales 是 Y。<xsl:for-each select="booklist/book[@sales='Y']">

Page 31: 第五章  XML 可延伸樣式語言

若我們使用前面的 XML 文件套用前一頁的 select 屬性用法,則得到以下的結果:

Page 32: 第五章  XML 可延伸樣式語言

排序元素 xsl:sort• HTML 標籤的內容無法進行排序的處理,但是 XSLT Script擁有排序元素,能夠指定 XML 元素進行排序。

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

descending:從大到小ascending: 從小到大

Page 33: 第五章  XML 可延伸樣式語言

由前一頁的 XSLT 來看,依據 title 來排序,從大到小,便可由下表可得證:

Page 34: 第五章  XML 可延伸樣式語言

單一條件元素 xsl:if

• 目前 XSLT Script都是直接輸出轉換的結果,但是在轉換時我們可能需要測試一些情況,以決定是否轉換,這就屬於單一條件元素。

<xsl:if test="@sales = 'Y'">……..

</xsl:if><xsl:if test="@sales = 'N'">

……..</xsl:if>

Page 35: 第五章  XML 可延伸樣式語言

所以,我們可以利用單一條件元素來呈現下列的表格:

Page 36: 第五章  XML 可延伸樣式語言

多條件元素 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>

Page 37: 第五章  XML 可延伸樣式語言

利用多條件元素 choose 便可以達成多項條件的判斷,如下圖所示。

Page 38: 第五章  XML 可延伸樣式語言

呼叫函數元素 xsl:call-template

•建立範本函數

•上述範本並不是 XML 元去的範本,而是使用 name 屬性建立一個名為 showbook 的範本函數。

<xsl:template name=“showbook">

……………

</xsl:template>

Page 39: 第五章  XML 可延伸樣式語言

呼叫函數元素 xsl:call-template( 續 )

•呼叫範本函數元素

•上述 call-template 元素呼叫範本函數, name 屬性指定範本函數的名稱。

<xsl:call-template name=“showbook">

……………

</xsl:call-template>

Page 40: 第五章  XML 可延伸樣式語言

呼叫函數元素 xsl:call-template ( 續 )

•範本函數的參數傳遞

<xsl:template name=“showbook">

<xsl:param name=“position” select=“/booklist/book”/>

 ……………

</xsl:template>

Page 41: 第五章  XML 可延伸樣式語言

呼叫函數元素 xsl:call-template ( 續 )

•如果範本函數需要傳入參數,只需在 xsl:template 元素為一個參數, name 屬性為參數名稱, select 屬性為參數的預設值,當呼叫範本函數時沒有傳入參數,就是使用 select 屬性的預設值。

Page 42: 第五章  XML 可延伸樣式語言

呼叫函數元素 xsl:call-template ( 續 )

•在範本函數傳入參數後,請使用「$」符號加上參數名稱取出參數值,如下所示。– $position

•接著回到呼叫範本函數 call-template 元素,使用 with-param 元素傳入範本函數所需的參數,如下頁所示。

Page 43: 第五章  XML 可延伸樣式語言

呼叫函數元素 xsl:call-template ( 續 )

<xsl:call-template name="showbook"> <xsl:with-param name="position" select="/book

list/book[price &lt; '500']"/></xsl:call-template>

•上述元素 with-param 元素對應 template 子元素 param ,其中 name 性為參數名稱, select 為參數值。

Page 44: 第五章  XML 可延伸樣式語言

複製元素 xsl:copy• 如果 XML 元素名稱是輸出元素的名稱,我們可以直接使用 copy 元素輸出 XML 元素名稱,例如 :XML 元素 title ,如下所示 :

<xsl:template match=“title”> <xsl:copy> <xsl:apply-template/> </xsl:copy><xsl:template>

Page 45: 第五章  XML 可延伸樣式語言

複製元素 xsl:copy ( 續 )•上頁範本元素直接將 title 元素輸出成同名的元素,如果需要複製整個子元素,使用萬用字元「 *」,如下所示 :

<xsl:template match=“title”> <xsl:copy select=“*”/></xsl:template>

Page 46: 第五章  XML 可延伸樣式語言

刪除元素

•如果想刪除指定的 XML 去,只需建立所需的範本元素,元素 內容為空的,如下所示 :

<xsl:template match=“code”></xsl:template>

•上述範本元素為空元素,也就是刪除 XML元素 code 。

Page 47: 第五章  XML 可延伸樣式語言

更改元素名稱

•如果需要更改元素名稱,例如 :將 XML的 title 元素輸出成 HTML 的 h2標籤,如下所示 :<xsl:template match=“title”>

<h2> <xsl:apply-template/> </h2>

</xsl:template>•上述範本元素只需活用 apply-template元素輸出成 h2元素。

Page 48: 第五章  XML 可延伸樣式語言

建立元素 xsl:element

•如果輸出的 XML 文件要新增 XML 元素,只需要使用 xsl:element 元素的 name 屬性新增所需的元素,如下所示 :

<xsl:element name=“catalog”>網頁製作 </xsl:element>

•上述 element 元素建立一個 XML 元素 catalog ,如下 :<catalog>網頁製作 </catalog>

Page 49: 第五章  XML 可延伸樣式語言

建立屬性元素 xsl:attribute•如果新建立的元素 擁有屬性,我們可以在element 子元素 attribute新元素的屬性,如下所示 :

<xsl:element name=“catalog”> <xsl:attribute name=“code”>A001</xsl:attribute> 網頁製作</xsl:element>

Page 50: 第五章  XML 可延伸樣式語言

建立屬性元素 xsl:attribute ( 續 )

•上頁 XSLT 元素建立 XML 元素 catalog 和屬性 code ,如下所示 :

<catalog code=“A001”>網頁製作 </catalog>

•同樣方式,可以使用 comment建立註解文字,如下所示 :

<xsl:comment>網頁製作研究系列 </xsl:comment>