Transcript 第17章

第 3 章 XML文件的轉換
–XSLT與XPath
XSLT與XPath的簡介 - 什麼是XSLT



XSLT(XSL Tranform)本身就是一種XML文件,用
於轉換XML文件。
XSLT原先是XSL(eXtensible Stylesheet Language ,
譯為可延伸樣式語言)的一部份。
XSL可分為轉換(XSLT)與格式化(FO)兩個部份,
整個處理XML文件的過程,如下圖所示。
XSLT與XPath的簡介 - XPath語法

為方便讀者檢視本節XPath語法範例的執行結
果,本書隨書光碟的ch3範例資料夾XPath子資
料夾下,將提供show.htm檔。
XSLT與XPath的簡介 - XPath語法

XPath敘述的最基本語法如下:
中樞::節點測試[條件式]
中樞
用於定義XML文件中,欲擷取節點的路徑
敘述。下表為各中樞(Aixs)關鍵字意義的
說明,更進一步的說明請參考3-2-3節。
XSLT與XPath的簡介 - XPath語法
XSLT與XPath的簡介 - XPath語法
 節點測試
用於測試欲套用節點的敘述,通過測試之節點將被
擷取。下表將介紹各節點測試(Node-Test),詳細
說明請參考3-2-4節。
 條件式
用於篩選擷取節點的條件式。
XSLT與XPath的簡介 - XPath語法

取得文件元素的根節點–『/』:若將『/』符號
運用於第一個字元時,代表XML文件的文件元
素(根元素)的上一層節點,這個節點除包含
文件元素外,還將包含文件宣告以及DTD宣告。
XSLT與XPath的簡介 - XPath語法

串連符號–『/』:若欲串連數個XPath語法,漸
漸縮小篩選XML文件中資料的範圍,則需運用
『/』符號。常見的XPath語法將如下所示。
中樞::節點測試[條件式]/中樞::節點測試[條件式]/…
XSLT與XPath的簡介 - XPath語法
XSLT與XPath的簡介 - XPath語法
XSLT與XPath的簡介 - XPath語法

以下是一個用於篩選book2.xml文件中節點的XPath敘述,
意義為『取得目前節點下子節點(child)中booklist(節
點測試)節點』。由於XPath預設目前節點為最上層的節
點,其含意就成了『取得文件節點下子節點(child)中
的booklist(節點測試)節點』。
child::booklist
XSLT與XPath的簡介 - XPath語法

篩選範圍如下:
XSLT與XPath的簡介 - XPath語法


以下敘述將利用『/』符號在前述XPath後,增加另一段
XPath敘述,將可指定從篩選結果一,再篩選出第2個
book元素。
child::booklist/child::book[2]
從book2.xml篩選出來的結果如下所示。
XSLT與XPath的簡介 - XPath語法

篩選範圍如下:
XSLT與XPath的簡介 - XPath語法

XPath所謂的Axes(中樞)觀念,就是利用已經
完成預設參照路徑的關鍵字建立XPath的參照路
徑。
XSLT與XPath的簡介 - XPath語法

下表為各Axis(Axes為複數型態)關鍵字的意義。
XSLT與XPath的簡介 - XPath語法

XPath將提供一些簡寫語法,縮短XPath敘述。
下表為這些簡寫語法的說明:
XSLT與XPath的簡介 - XPath語法

節點測試:
XSLT與XPath的簡介 - XPath語法

條件式篩選:
XSLT與XPath的簡介 - XPath語法

指定順序取得元素:
若欲取得XML文件內的一個元素時,可利用指
定某元素在樹狀結構之階層位置的方式達成。
欲指定元素的順序時,可使用『[]』運算子,並
以『[順序]』之語法完成指定。以下敘述將從
book.xml取得booklist元素中,第2個book元素。
/booklist/book[2]
XSLT與XPath的簡介 - XPath語法

XPath的比較運算子:

範例如下:
XSLT與XPath的簡介 - XPath語法

XPath的邏輯運算子

語法範例:
XSLT與XPath的簡介 - XPath語法


『|』運算子稱之為聯集運算子,用於聯集兩條
件式所篩選出的節點。
以下範例由兩條件式組成,分別篩選出sale屬性
值為Y的book元素,與price子元素值小於600的
book元素,然後以『|』運算子聯集兩條件式篩
選出的元素。
//book[@sale = "Y"] | //book[price < 600]
XSLT與XPath的簡介 - XPath函數

XPath還提供以下四類函數。
 節點集函數(Node-set Function)
 字串函數(String Function)
 布林函數(Boolean Function)
 數值函數(Number Function)
XSLT與XPath的簡介 - XPath函數

節點集函數(Node-set Function)
XSLT與XPath的簡介 - XPath函數

字串函數(String Function)
XSLT與XPath的簡介 - XPath函數

布林函數(Boolean Function)
XSLT與XPath的簡介
- XSLT樣版運作觀念
XSLT與XPath的簡介
- XSLT的運作方式

Server端執行
XSLT與XPath的簡介
- XSLT的運作方式

Client端執行
XSLT與XPath的簡介
- XSLT的運作方式

簡介XSLT元素
XSLT與XPath的簡介
- XSLT的運作方式

簡介XSLT元素
XSLT與XPath的簡介
- XSLT文件的建立與使用

以下是一個基本的XSLT樣版文件。
XSLT與XPath的簡介
- XSLT文件的建立與使用

XSLT文件的文件元素為xsl:stylesheet元素,在該元素中,
必須利用xmlns定義使用的名稱空間為
『http://www.w3.org/1999/XSL/Transform』,版本為
1.0。
XSLT與XPath的簡介
- XSLT文件的建立與使用

<xsl:template>元素用於定義XSLT文件內的樣
版,這些樣版套用於特定節點執行轉換動作:
<xsl:template match="模式" name="樣版名稱"
mode="樣式"
priority ="等級" >
……
</xsl:template>
XSLT與XPath的簡介
- XSLT文件的建立與使用

<xsl:template>元素用於定義XSLT文件內的樣
版,這些樣版套用於特定節點執行轉換動作:
<xsl:template match="模式" name="樣版名稱"
mode="樣式"
priority ="等級" >
……
</xsl:template>

以下敘述所定義的樣版,將套用於根元素。
XSLT與XPath的簡介
- XSLT文件的建立與使用

若定義一個不執行任何動作的樣版時,語法如
下:
<xsl:template match=模式name=樣版名稱
mode=樣式priority =等級 />

下表為此元素與其他元素相關關係的說明。
XSLT與XPath的簡介
- XSLT文件的建立與使用

<xsl:value-of>元素用於從XML文件中,取得元
素的值,語法如下:
<xsl:value-of select = "選取敘述"/>
或
<xsl:value-of select = "選取敘述"></xsl:value-of>

以下敘述將取得XML文件中,messages元素的
message子元素之值。
XSLT與XPath的簡介
- XSLT文件的建立與使用

下表為此元素與其他元素相關關係的說明。
XSLT與XPath的簡介
- XSLT文件的建立與使用

XML文件若指定欲套用的XSLT文件時,需在前
言(prolog)中定義,語法如下:
<?xml-stylesheet type="text/xsl“
href="XSLT文件名稱與路徑"?>
XSLT與XPath的簡介
- XSLT文件的建立與使用

將template.xml開啟於瀏覽器內時,畫面如下:
XSLT與XPath的簡介
- 多樣版XSLT文件的建立

以下XSLT文件內,將定義三個樣版,以進行
XML文件的轉換。
XSLT與XPath的簡介
- 多樣版XSLT文件的建立

套用此XSLT文件的XML文件內容如下:
XSLT與XPath的簡介
- 多樣版XSLT文件的建立

利用瀏覽器開啟mtemplate.xml文件後,結果如
下圖所示。
XSLT與XPath的簡介
- 多樣版文件的運作



在mtemplate.xsl檔,則定義了三個樣版,分別
套用於根節點、author元素與文字節點元素。
XML文件套用XSLT樣版的過程將先從套用於根
元素的樣版開始處理,這類樣版本書將稱為主
樣版。
主樣版內可以利用XPath語法,配合各種XSLT
元素,操作根元素下的所有元素,例如:可以
利用3-5-4節的xsl:value-of元素,取得XML文件
中節點的值。
XSLT與XPath的簡介
- 多樣版文件的運作

mtemplate.xsl檔的主樣版內,將利用<xsl:applytemplates>元素,以遞迴(recursive)方式處理
根元素下,booklist元素book子元素的所有元素,
並尋找XSLT文件中是否定義套用於節點之樣版,
『是』則套用。

有關<xsl:apply-templates>元素的更進一步說明,
請參考3-6-3節的內容。
XSLT與XPath的簡介
- 多樣版文件的運作

mtemplate.xsl檔除了套用於根元素的主樣版外,
還有套用於price元素與title元素的樣版。這兩個
樣版將僅取得元素的值,並分別利用『[]』與
『{}』標示。
XSLT與XPath的簡介
- 多樣版文件的運作

另一個空樣版,用於處理所有文字節點(沒有
子元素只包含資料的節點),有關此樣版的目
的請參考下一節最後的說明。
XSLT與XPath的簡介
- xsl:apply-templates元素

<xsl:apply-template>元素可控制XSL處理器,
在目前XSLT文件內,尋找適當樣版套用於節點
上。語法如下:
<xsl:apply-templates select="模式" mode="樣式"/>
或
<xsl:apply-templates select="模式" mode="樣式"/>
……
</xsl:apply-template>
XSLT與XPath的簡介
- xsl:apply-templates元素

<xsl:apply-templates>的運作原則
 若有兩樣版同時可套用時,將採用優先等級較高者,
樣版的優先等級設定於<xsl:template>元素的priority
屬性。
 若等級亦相同時,則以XSLT文件中,較後被定義的
樣版優先。
 若搜尋至文字節點,仍沒有適合節點套用的樣版時,
則XSLT將會直接輸出該元素的值。
 當XSLT文件中,已提供套用某節點的樣版時,
<xsl:apply-templates>將不再處理該節點下的子節點,
這些子節點將交由套用的樣版處理。
 若<xsl:apply-template>元素的select屬性,未被設定
時,則樣版所套用之節點下的所有節點,均會被處
理。
XSLT與XPath的簡介
- xsl:apply-templates元素


若希望XSLT處理器不要輸出此值時,則可建立
一個處理文字節點的空樣版,語法如下:
<xsl:template match="text()" />
mtemplate.xsl檔內為了避免XSLT處理器在找不
到節點可套用的樣版時,直接輸出節點值,因
此,第20列將運用上述語法,建立一個空樣版,
處理文字節點。
XSLT的流程控制元素
- xsl:for-each元素

<xsl:for-each>元素可處理由XPath語法篩選出
的所有元素,語法如下:
<xsl:for-each select="模式">
……
</xsl:for-each>

<xsl:for-each>元素的運作方式,與程式的迴圈
觀念相似。
XSLT的流程控制元素
- xsl:for-each元素

以下敘述為一處理book元素的樣版,每個book
元素下擁有數個元素,將利用<xsl:for-each>元
素,配合<xsl:value-of>元素,列出book元素內
所有元素(./*)的名稱(name(.))與內容(.)。
XSLT的流程控制元素
- xsl:if元素

<xsl:if>元素用於利用條件式控制XSLT執行資料
轉換動作,語法如下:
<xsl:if test=條件式>
……
</xsl:if>

以下敘述將判斷元素名稱是否為『author』,
『是』則取得該元素值。
XSLT的流程控制元素
- xsl:choose元素、xsl:when元素與xsl:otherwise元素


<xsl:if>元素一次僅能運用一個條件式,進行判斷動作。
若 欲 進 行 多 條 件 式 的 判 斷 時 , 則 須 使 用 <xsl:choose> 、
<xsl:when>與<xsl:otherwise>元素,語法如下:
<xsl:choose>
<xsl:when test=條件式一>
……
</xsl:when>
<xsl:when test=條件式二>
……
</xsl:when>
……
<xsl:otherwise>
……
</xsl:otherwise>
</xsl:choose>
排序與文字元素
- xsl:sort元素XSLT的流程控制元素

將<xsl:sort>元素運用於<xsl:for-each>元素與<xsl:applytemplates>元素中,以指定資料的排序方式。語法如下:
<xsl:sort
select = 排序元素
data-type = 資料型別
order = 排序方式
lang = 使用語言
case-order = 大小寫優先順序/>

以下敘述將指定套用樣版時,以price元素之值,進行遞減排序。
排序與文字元素
- xsl:sort元素XSLT的流程控制元素

<xsl:text>元素用於指定資料,以純文字的方式輸出。使
用語法如下:
<xsl:text disable-output-escaping=取消跳脫功能>
……
</xsl:text>

以下敘述將利用<xsl:text>元素讓『&lt;』符號以字元方式輸出,而
不轉換為『<』。
排序與文字元素 - 樣版函數的使用



建立樣版函數需運用<xsl:template>元素,並將函數名
稱設定給name屬性。
以下敘述將宣告一個名為book的樣版函數。
<xsl:template name="book">
……
</xsl:template>
呼叫樣版函數時,必須使用<xsl:call-template>元素,語
法如下:
<xsl:call-template name=樣版函數名稱>
……
</xsl:call-template>
排序與文字元素 - 樣版函數的使用


定義與呼叫樣版函數時,欲定義參數必須使用
<xsl:param>元素,使用語法如下:
<xsl:param name=參數名稱 select=模式>
</xsl:param>
或
<xsl:param name=參數名稱 select=模式/>
以下敘述將在呼叫book樣版函數時,篩選出book元素與
serialbook/book元素,做為booknode參數。
排序與文字元素 - 樣版函數的使用

而在book樣版函數中,將利用<xsl:param>元素,宣告
該樣版函數所接受的參數,而欲使用傳入的參數時,必
須在參數名稱前加上『$』符號。
用於建立元素的XSLT元素
- XML文件間的轉換(output元素的使用)




運用XSLT將XML文件轉換成另一份XML文件時,Microsoft
Parser將預設輸出如下的XML文件宣告。
<?xml version="1.0" encoding="UTF-16"?>
若欲自訂時,則可利用<xsl:output>元素,將omit-xmldeclaration屬性設定為yes,取消預設之XML文件宣告的輸出,
如下所示。
<xsl:output omit-xml-declaration="yes"/>
然後利用<xsl:text>元素,建立XML文件宣告。
<xsl:text disable-output-escaping="yes">
&lt;?xml version="1.0" encoding="Big5"?&gt;
</xsl:text>
上述敘述將輸出的XML文件宣告如下:
<?xml version="1.0" encoding="Big5"?>
用於建立元素的XSLT元素
- xsl:processing-instruction元素


<xsl:processing-instruction>元素用於在轉換後的XML
文件中,建立處理命令元素。語法如下:
<xsl:processing-instruction name = 處理命令名稱>
……
</xsl:processing-instruction>
以下敘述將建立一個定義轉換後XML文件之XSLT文件
的處理區塊元素。
用於建立元素的XSLT元素
- xsl:element與xsl:attribute元素



<xsl:element>元素用於在輸出的XML檔中,建立元素。
語法如下:
<xsl:element name=元素名稱>
……
</xsl:element>
通常在<xsl:element>元素中,可運用直接鍵入值,或透
過<xsl:value-of>元素從XML文件取得值的方式,定義
欲建立元素的值。
運用<xsl:attribute>元素定義元素的屬性之語法如下:
<xsl:attribute name=元素名稱>
……
</xsl:attribute>
用於建立元素的XSLT元素
- xsl:element與xsl:attribute元素

以下敘述將建立一個名為book的元素,且該元素擁有
price與author兩個屬性。Book元素之元素值與屬性值,
將分別利用<xsl:value-of>元素,選取自price、author、
title。
用於建立元素的XSLT元素
- xsl:comment元素


<xsl:comment>元素用於在輸出的XML檔中,建立註解。
語法如下:
<xsl:comment>
……
</xsl:comment>
以下敘述將在轉換後的XML文件中,以『書籍清單』字
串,建立註解文字。
<xsl:comment>書籍清單</xsl:comment>
用於建立元素的XSLT元素
- <xsl:copy>元素

<xsl:copy>元素從XML文件,複製目前元素至
輸出的XML檔中。語法如下:
<xsl:copy>……</xsl:copy>

但是<xsl:copy>元素僅會複製元素的名稱、內容
與名稱空間,不會複製元素的屬性與子元素。
用於建立元素的XSLT元素
- xsl:copy-of元素




<xsl:copy-of>元素將從XML文件,運用設定給select屬
性的XPath敘述,篩選出目前元素下的元素,然後複製。
與<xsl:copy>元素不同的,<xsl:copy-of>元素將完整複
製元素,包含元素的名稱、屬性、資料、名稱空間…等。
語法如下:
<xsl:copy-of select="模式"/>
<xsl:copy-of>元素僅會複製元素的名稱、內容與名稱空
間,不會複製元素的屬性與子元素。