XML 、 Xpath 轉換 XML 文件
description
Transcript of XML 、 Xpath 轉換 XML 文件
1
XML 、 Xpath 轉換 XML 文件
No. XML - ch8No. XML - ch8
2
Part I
關於 XSL
3
什麼是 XSL XSL ( 延伸樣式語言 ) ,是用於展示 XML 內容外觀 (f
ont, size, color .. ) 於網頁的樣式語言。 XML StyleSheet Language eXtensible StyleSheet Language
屬於一種 Script 語言 XSL 的語法須依 XML 格式 ,並以 *.xsl 為副檔名。 在功能上分為二部分
轉換 XML 文件 格式化 XML 文件 (IE 不支援格式化的部分規格 )
4
為什麼需要 XSL XSL 用來定義 XML 文件該如何顯示。 XSL 能夠在輸出的文件中添加新的元素,或移動元素。 XSL 也能夠重新排列或者索引數據,它可以偵測並決
定哪些元素被顯示,顯示多少。 XSL 和 XSLT 的基本內容是一樣的。 XSLT 的用意是幫助 XML 文檔 (document) 轉換為其
它文檔 .
5
XSL FamilySGML
XML HTML
XSL
XSL FO XSLT
XSLT
XPATH
6
CSS 與 XSLT 的差異. CSS XSLT
適用在 HTML 可以 不行適用在 XHTML 可以 可以
適用在 XML 可以 可以使用的語法 CSS 樣式語法 XML 語法
是否是轉換語言 不是 是
7
XML Transform -Server 端執行
XML
XSLT
XML處理器
XML處理器
XSLT處理器
結果樹
HTML 文件
Client 端Server 端
8
XML Transform -Client 端執行
XML
XSLT
將 XML 與 XSLT 傳至Client 端 , 由 IE 直接解析
Client 端Server 端
Server 端的執行過程
9
Part II
XPath 語言
10
XPath– 關於定位 Xpath
XPath 是一種語言,一種節點位置的語言,用來描述 XML 元素的位置,如同硬碟資料夾的檔案路徑。
幫助 XSLT 在 XML 來源文件中查找定位資訊的語言。
Xpath 同時被 XSLT 和 Xpointer 所使用。
Xpath 資料模型
root
<?xml?> glossary
item item item
definition
definitiondefinitionversion
version
version
text
texttext
text
text
title
title
title
titletext title
根節點
元素節點
屬性節點
文字資料
PI 節點 /glossary/item/title
/glossary/item//title
XML 文件
Xpath 位置路徑
12
XPath– 目前位置 "/" 是表示目前文檔的節點 , 類似 DOS 目
錄分割符。 “//” 則表示目前文檔中下下層的子節點。
<xsl:for-each select="child::PEOPLE/descendant::PERSON"> <xsl:for-each select="PEOPLE//PERSON">
PEOPLE//PERSON 表示在 PEOPLE 元素下所有的 PERSON 元素。
13
XPath – 尋址操作 軸 (Axis)- 選擇目前節點周圍所有的節點
self . 選擇目前的節點。 parent .. 選擇目前節點的父節點。 attribute @ 選擇一個元素的所有屬性。
Predicate 則用來定位目前節點內部的元素,以方括號 [] 中加表達式: [ Expression ] 。 PERSON[position()=2] : 這句代碼表示尋找第二個“
PERSON” 元素 PERSON[starts-with(name, “B”)]: 這句代碼表示
尋找所有名稱以“ B” 開頭的 PERSON 元素
14
XPath – 運算符號 and, or 就是普通意義的 and, or >, <, >=, <=, !=, =
注意:在 XSL 文件中, < 符號要用 < 表示, > 符號要用 > 表示。
15
XPath – 功能函數 在 XPath裏有很多功能函數可以幫助我們精確尋找
需要的節點。 count() :統計次數,返回符合條件的節點的個數。<xsl:value-of select="count(PERSON[name=tom])"/>
number() :將屬性的值中的文本轉換為數值。The number is: <xsl:value-of select="number(book/p
rice)"/> sum() :求和。
Total Price = <xsl:value-of select="sum(//price)"/>
16
Part III
XSLT 語法
17
顯示範例
9876543 戚玉樑 [email protected]
本學期必 ( 選 )修科目 :
基本資料 :
資管系
OO and Java Programming Dr. Max Chi 3
XML Design and Programming Dr. Max Chi 3
18
簡單的例子 -1
第一步:建立 XML 檔 course.xml
<?xml version="1.0" ?><Course>XML Design and Programming</Course><Instructor>Dr. Max Chi</Instructor>
19
簡單的例子 -2第二步:建立 XSLT 檔 show.xsl 。
<?xml version="1.0" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"><xsl:template match="/"><html><body> <p><xsl:value-of select="Course"/></p> <p><xsl:value-of select="Instructor"/></p></body></html></xsl:template></xsl:stylesheet>
20
簡單的例子 -3
第三步:在 XML 中調用 show.xsl 文件。修改 course.xml 為:
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href=“show.xsl"?>
<Course>XML Design and Programming</Course>
<Instructor>Dr. Max Chi</Instructor>
執行
課本的例子 -1<?xml version="1.0" encoding="Big5"?><glossary> <item> <title version="EN">eXtensible Markup Language</title> <definition>可擴充展標示語言 <title>XML</title></definition> </item> <item> <title version="EN">encoding</title> <definition>字碼集 </definition> </item> <item> <title version="EN">Uniform Resource Identifier</title> <definition> 統一資源識別符號 <title>URI</title></definition> </item></glossary>
課本的例子 -2<?xml version="1.0" encoding="Big5"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/glossary/item[position()=1]"> <center><h2>XML專有名詞 </h2></center> <hr/> <p><b><xsl:value-of select="title"/> - <xsl:value-of select="definition"/></b> (<xsl:value-of select="definition/title"/>)</p></xsl:template>
<xsl:template match="/glossary/item[position()=2]"> <p><i><xsl:value-of select="title"/> - <xsl:value-of select="definition"/></i> </p></xsl:template>
<xsl:template match="/glossary/item/title[@version='AB']"> <p><u><xsl:value-of select="."/> - <xsl:value-of select="@version"/></u></p></xsl:template>
<xsl:template match="/glossary/item[last()]/definition"> <p><u><xsl:value-of select="."/></u> (<xsl:value-of select="title"/>)</p></xsl:template>
</xsl:stylesheet>
課本的例子 -3<?xml version="1.0" encoding="Big5"?><?xml-stylesheet type="text/xsl" href="Ch8-5-1.xslt" ?><glossary> <item> <title version="EN">eXtensible Markup Language</title> <definition>可擴充展標示語言 <title>XML</title></definition> </item> <item> <title version="TW">encoding</title> <definition>字碼集 </definition> </item> <item> <title version="AB">Uniform Resource Identifier</title> <definition> 統一資源識別符號 <title>URI</title></definition> </item></glossary>
執行
Ex411_1.xsl
<?xml version="1.0" encoding="BIG5" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/xsl">
<xsl:template match="唐詩 /五言絕句 / 內容 " > <xsl:value-of /> </xsl:template>
</xsl:stylesheet>XSL 的語法須依 XML 格式
25
XML 套用 XSL XML 如要使用 XSL ( 延伸樣式語言 ) ,必須在宣告區註明 。
<?xml:stylesheet type=”text/xsl” href=“URL”?>
範例<?xml-stylesheet href="ex421_2.xsl" type="text/xsl"?><?xml-stylesheet type="text/xsl" href="ex421_2.xsl"?>
使用 ? 前導
可調換宣告順序
26
XSL 與 HTML 混合使用<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <xsl:value-of select ="唐詩 /五言絕句 / 內容 " /> <br/> <xsl:value-of select ="唐詩 /五言絕句 /標題 " /> <br/> <xsl:value-of select ="唐詩 /五言絕句 / 作者 " /> </xsl:template></xsl:stylesheet>
27
XSL 與 HTML 混合使用<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <h3> <xsl:value-of select ="唐詩 /五言絕句 / 作者 " /> </h3> <h2> <xsl:value-of select ="唐詩 /五言絕句 /標題 " /> </h2> <xsl:value-of select ="唐詩 /五言絕句 / 內容 " /> </xsl:template></xsl:stylesheet>
XSL 與 HTML 混合使用例 413_2.xsl
28
XSL 與 CSS ?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <h3 style="color:red"> <xsl:value-of select ="唐詩 /五言絕句 / 作者 " /> </h3> <h2 style="color:red"> <xsl:value-of select ="唐詩 /五言絕句 /標題 " /> </h2>
局部性改變原 HTML/ CSS 之樣式例 415_1.xsl
29
編寫一個 XSL 檔案 第一行使用 XML 標準宣告<?xml version="1.0" encoding="BIG5" ?>
第二行宣告 xsl 的 NameSpace <xsl:stylesheet xmlns:xsl="uri:xsl"><xsl:stylesheet xmlns:xsl="http://www.w3.org
/TR/xsl">
30
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>
在根標籤需宣告名稱空間
31
XSL 資料安排語法 xsl:value-of ( 內容元素 ) xsl:template (範本元素 ) xsl:apply-templates (遞回範本元素 ) xsl:for-each (迴路元素 ) xsl:sort ( 排序元素 ) xsl:if (單一條件元素 ) xsl:choose ( 多條件元素 )
32
Xsl:value-of ( 內容元素 ) 從 XML 文件中取得元素的值 語法<xsl:value-of select=“ 選取敘述” ></xsl:value-of> 選取敘述 : 選取欲取得值之元素的 Xpath敘述
範例<xsl:template match=“item”> <xsl:value-of select=“title”/><xsl:template>
xsl:value-of 範例 -1 (全體 ) <?xml version="1.0" encoding="BIG5" ?
><xsl:stylesheet xmlns:xsl="http://www.
w3.org/TR/WD-xsl"> <xsl:template> <xsl:value-of select =" 唐詩 " /> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex421_1.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 > <姓名 > 李白 </姓名 > < 字號 > 太白 </ 字號 > </ 作者 > <標題 >怨情 </標題 > < 內容 >美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰? </ 內容 > </五言絕句 ></唐詩 >
李白 太白 怨情 美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰?
Ex421_1.xsl
執行
xsl:value-of 範例 -2 ( 細節 )
<?xml version="1.0" encoding="BIG5" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<h2> 作者的字號 :
<xsl:value-of select ="唐詩 /五言絕句 / 作者 / 字號 " />
</h2>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex421_2.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 > <姓名 > 李白 </姓名 > < 字號 > 太白 </ 字號 > </ 作者 > <標題 >怨情 </標題 > < 內容 >美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰? </ 內容 > </五言絕句 ></唐詩 >
作者的字號 : 太白
Ex421_2.xsl
執行
xsl:value-of 範例-3 (錯置)<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <h2> 作者的姓名 : <xsl:value-of select ="唐詩 /五言絕句 /姓名 " /> <br/> 作者的字號 : <xsl:value-of select ="唐詩 /五言絕句 / 作者 / 字號 " /> </h2> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex421_3.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 > <姓名 > 李白 </姓名 > < 字號 > 太白 </ 字號 > </ 作者 > <標題 >怨情 </標題 > < 內容 >美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰? </ 內容 > </五言絕句 ></唐詩 >
作者的姓名 : 作者的字號 :
無內容 , 路徑必須由根元素起逐層 mapping
Ex421_3.xsl
執行
xsl:value-of 範例 -4 ( 重覆 )<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <h2> 作者 : <xsl:value-of select ="唐詩 /五言絕句 / 作者 /姓名 " /> <br/> 標題 : <xsl:value-of select ="唐詩 /五言絕句 /標題 " /> </h2> <h3> <xsl:value-of select ="唐詩 /五言絕句 / 內容 " /> </h3> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex422_1.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 > <姓名 > 李白 </姓名 > < 字號 > 太白 </ 字號 > </ 作者 > <標題 >怨情 </標題 > < 內容 >美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰? </ 內容 > </五言絕句 ></唐詩 >
作者 : 李白 標題 : 怨情 美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰?
Ex422_1.xsl
執行
xsl:value-of 範例 -5 ( 順序 )<?xml version="1.0" encoding="BIG5" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template>
<h2>
<xsl:value-of select ="唐詩 /五言絕句 /標題 " />
--- 作者 :
<xsl:value-of select ="唐詩 /五言絕句 / 作者 /姓名 " />
</h2>
<h3>
<xsl:value-of select ="唐詩 /五言絕句 / 內容 " />
</h3> </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex422_2.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 > <姓名 > 李白 </姓名 > < 字號 > 太白 </ 字號 > </ 作者 > <標題 >怨情 </標題 > < 內容 >美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰? </ 內容 > </五言絕句 ></唐詩 >
怨情 --- 作者 : 李白 美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰?
改變文件內容順序
Ex422_2.xsl
執行
xsl:value-of 範例 -6 ( 屬性 )<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <h2> <xsl:value-of select ="唐詩 /五言絕句 /@標題 " /> </h2> <h3> <xsl:value-of select ="唐詩 /五言絕句 / 內容 " /> </h3> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?>
<?xml-stylesheet href="ex423_1.xsl" type="text/xsl"?>
<唐詩 >
<五言絕句 標題 ="怨情 ">
< 作者 字號 =“太白” > 李白 </ 作者 >
< 內容 >美人捲珠簾,深坐蹙蛾眉。 但見淚痕濕,不知心恨誰? </ 內容 >
</五言絕句 >
</唐詩 >
怨情 美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰?
藉 @ 顯示屬性內容
Ex423_1.xsl
執行
xsl:value-of 範例 -7 ( 屬性 )<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template> <h2> <xsl:value-of select ="唐詩 /五言絕句 /@標題 " /> --- <xsl:value-of select ="唐詩 /五言絕句 / 作者 " /> [ 字 : <xsl:value-of select ="唐詩 /五言絕句 / 作者 /@ 字號 " /> ] </h2> <h3> <xsl:value-of select ="唐詩 /五言絕句 / 內容 " /> </h3> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?>
<?xml-stylesheet href="ex423_2.xsl" type="text/xsl"?>
<唐詩 >
<五言絕句 標題 ="怨情 ">
< 作者 字號 =“太白” > 李白 </ 作者 >
< 內容 >美人捲珠簾,深坐蹙蛾眉。 但見淚痕濕,不知心恨誰? </ 內容 >
</五言絕句 >
</唐詩 >
怨情 --- 李白 [ 字 : 太白 ] 美人捲珠簾,深坐蹙蛾眉。但見淚痕濕,不知心恨誰?
藉 @ 顯示屬性內容
ex423_2.xsl
執行
40
XSL 資料安排語法 xsl:value-of ( 內容元素 ) xsl:template (範本元素 ) xsl:apply-templates (遞回範本元素 ) xsl:for-each (迴路元素 ) xsl:sort ( 排序元素 ) xsl:if (單一條件元素 ) xsl:choose ( 多條件元素 )
41
xsl:template (範本元素 ) xsl:template 是用來指定一個範本,內含元素內容的
樣式規則。 語法<xsl:template match=“ 模式” name=“ 樣版名稱” >……</xsl:template> Match 屬性的模型為「 /」指的是根節點和其下所有元素
只用一組 xsl: template 時可省略宣告 xsl:stylesheet xsl:template 使用範例<xsl:template match=“ 內容” >
執行
42
XSL 資料安排語法 xsl:value-of ( 內容元素 ) xsl:template (範本元素 ) xsl:apply-templates (遞回範本元素 ) xsl:for-each (迴路元素 ) xsl:sort ( 排序元素 ) xsl:if (單一條件元素 ) xsl:choose ( 多條件元素 )
43
xsl:apply-templates ( 遞回範本元素 )
xsl:apply-templates 使用遞迴方式顯示所有的子元素可用來呼叫其他範本 (temlate) 處理子元素內容的樣式規則, 如同呼叫一遞回函數。
xsl:apply-templates 使用於 xsl:template 內,常見使用範例
•<xsl:apply-templates /> •<xsl:apply-templates select="標題 " />
xsl:apply-templates 範例 -1
<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <xsl:for-each select="唐詩 /五言絕句 "> <xsl:apply-templates /> </xsl:for-each> </xsl:template> <xsl:template match=" 作者 "> <span style="color:red;font-size:18"> <xsl:value-of /> </span> </xsl:template> <xsl:template match="標題 "> <span style="color:blue;font-size:15"> <xsl:value-of /> </span> </xsl:template> <xsl:template match=" 內容 "> <p><xsl:value-of /></p> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex431_1.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 >王維 </ 作者 > <標題 >竹里館 </標題 > < 內容 >獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >孟浩然 </ 作者 > <標題 >宿建德江 </標題 > < 內容 > 移舟泊煙渚,日暮客愁新。野曠天低樹,江清月近人。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >王之渙 </ 作者 > <標題 >登鸛雀樓 </標題 > < 內容 >白日依山盡,黃河入海流。欲窮千里目,更上一層樓。 </ 內容 > </五言絕句 ></唐詩 >
王維 竹里館獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。孟浩然 宿建德江移舟泊煙渚,日暮客愁新。野曠天低樹,江清月近人。王之渙 登鸛雀樓白日依山盡,黃河入海流。欲窮千里目,更上一層樓。
Ex431_1.xsl
執行
xsl:apply-templates 範例 -2 <?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <xsl:for-each select="唐詩 /五言絕句 "> <xsl:apply-templates /> </xsl:for-each> </xsl:template> <xsl:template match="*"> <p style="color:red;font-size:15"> <xsl:value-of /> </p> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex431_3.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 >王維 </ 作者 > <標題 >竹里館 </標題 > < 內容 >獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >孟浩然 </ 作者 > <標題 >宿建德江 </標題 > < 內容 > 移舟泊煙渚,日暮客愁新。野曠天低樹,江清月近人。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >王之渙 </ 作者 > <標題 >登鸛雀樓 </標題 > < 內容 >白日依山盡,黃河入海流。欲窮千里目,更上一層樓。 </ 內容 > </五言絕句 ></唐詩 >
王維 竹里館獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。孟浩然 宿建德江移舟泊煙渚,日暮客愁新。野曠天低樹,江清月近人。王之渙 登鸛雀樓白日依山盡,黃河入海流。欲窮千里目,更上一層樓。
Ex431_3.xsl
執行
xsl:apply-templates 範例 -3 <?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <xsl:for-each select="唐詩 /五言絕句 "> <xsl:apply-templates select="標題 " /> <xsl:apply-templates select=" 作者 " /> <p/> </xsl:for-each> </xsl:template> <xsl:template match=" 作者 "> <span style="color:red;font-size:18"> <xsl:value-of /> </span> </xsl:template> <xsl:template match="標題 "> <span style="color:blue;font-size:24"> <xsl:value-of /> </span> </xsl:template> <xsl:template match=" 內容 "> <p><xsl:value-of /></p> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex432_1.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 >王維 </ 作者 > <標題 >竹里館 </標題 > < 內容 >獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >孟浩然 </ 作者 > <標題 >宿建德江 </標題 > < 內容 > 移舟泊煙渚,日暮客愁新。野曠天低樹,江清月近人。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >王之渙 </ 作者 > <標題 >登鸛雀樓 </標題 > < 內容 >白日依山盡,黃河入海流。欲窮千里目,更上一層樓。 </ 內容 > </五言絕句 ></唐詩 >
竹里館 王維
宿建德江 孟浩然
登鸛雀樓 王之渙Ex432_1.xsl執行
47
XSL 資料安排語法 xsl:value-of ( 內容元素 ) xsl:template (範本元素 ) xsl:apply-templates (遞回範本元素 ) xsl:for-each (迴路元素 ) xsl:sort ( 排序元素 ) xsl:if (單一條件元素 ) xsl:choose ( 多條件元素 )
48
Xsl:for-each 對於 XML 文件的重複元素,可使用 XSL
T遞迴元素顯示 XML 元素內容 語法<xsl:for-each select="booklist/book">……</xsl:for-each>
49
xsl:for-each (迴路元素 ) xsl:for-each 是用來取出 XML 文件中被
選擇相同元素的內容。 xsl:for-each 通常亦搭配
select= “ tag-path ” 執行選擇 order-by= “ tag-path ” 執行排序。
xsl:for-each 範例 -1 ( 全體 ) <?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <xsl:for-each select="唐詩 /五言絕句 "> <p style="color:blue"> <xsl:value-of select=" 作者 " /> <xsl:value-of select="標題 " /></p> <p><xsl:value-of select=" 內容 " /></p> </xsl:for-each> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex424_1.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 >王維 </ 作者 > <標題 >竹里館 </標題 > < 內容 >獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >孟浩然 </ 作者 > <標題 >宿建德江 </標題 > < 內容 > 移舟泊煙渚,日暮客愁新。野曠天低樹,江清月近人。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >王之渙 </ 作者 > <標題 >登鸛雀樓 </標題 > < 內容 >白日依山盡,黃河入海流。欲窮千里目,更上一層樓。 </ 內容 > </五言絕句 ></唐詩 >
王維 竹里館獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。孟浩然 宿建德江移舟泊煙渚,日暮客愁新。野曠天低樹,江清月近人。王之渙 登鸛雀樓白日依山盡,黃河入海流。欲窮千里目,更上一層樓。
Ex424_1.xsl
執行
xsl:for-each 範例 -2 ( 表格 ) <?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <table border="6"> <xsl:for-each select="唐詩 /五言絕句 "> <tr> <td width="20%"><xsl:value-of select=" 作者 " /></td> <td width="25%"><xsl:value-of select="標題 " /></td> <td><xsl:value-of select=" 內容 " /></td> </tr> </xsl:for-each> </table> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex424_2.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 >王維 </ 作者 > <標題 >竹里館 </標題 > < 內容 >獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >孟浩然 </ 作者 > <標題 >宿建德江 </標題 > < 內容 > 移舟泊煙渚,日暮客愁新。野曠天低樹,江清月近人。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >王之渙 </ 作者 > <標題 >登鸛雀樓 </標題 > < 內容 >白日依山盡,黃河入海流。欲窮千里目,更上一層樓。 </ 內容 > </五言絕句 ></唐詩 >
Ex424_2.xsl
執行
xsl:for-each 範例 -3 ( 排序 ) <?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <table border="6"><xsl:for-each select="唐詩 /五言絕句 " order-by=" 作者 "> <tr> <td width="15%"><xsl:value-of select=" 作者 " /></td> <td width="20%"><xsl:value-of select="標題 " /></td> <td><xsl:value-of select=" 內容 " /></td> </tr> </xsl:for-each> </table> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex424_3.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 >王維 </ 作者 > <標題 >竹里館 </標題 > < 內容 >獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >孟浩然 </ 作者 > <標題 >宿建德江 </標題 > < 內容 > 移舟泊煙渚,日暮客愁新。野曠天低樹,江清月近人。 </ 內容 > </五言絕句 > <五言絕句 > < 作者 >王之渙 </ 作者 > <標題 >登鸛雀樓 </標題 > < 內容 >白日依山盡,黃河入海流。欲窮千里目,更上一層樓。 </ 內容 > </五言絕句 ></唐詩 >
遞增排序
Ex424_3.xsl
執行
xsl:for-each 範例 -4 (Multiple) <?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <table border="6"> <xsl:for-each select="唐詩 /五言絕句 "> <tr> <td width="15%"><xsl:value-of select=" 作者 " /></td> <td width="15%"><xsl:value-of select="標題 " /></td> <td><xsl:value-of select=" 內容 " /></td> </tr> </xsl:for-each> </table> <table border="6"> <xsl:for-each select="唐詩 /七言絕句 "> <tr> <td width="15%"><xsl:value-of select=" 作者 " /></td> <td width="15%"><xsl:value-of select="標題 " /></td> <td><xsl:value-of select=" 內容 " /></td> </tr> </xsl:for-each> </table> </xsl:template></xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href="ex435_2.xsl" type="text/xsl"?> <唐詩 > <五言絕句 > < 作者 >王維 </ 作者 > <標題 >送別 </標題 > < 內容 >山中相送罷,日暮掩柴扉。春草明年綠,王孫歸不歸?</ 內容 > </五言絕句 ><五言絕句 > < 作者 >王維 </ 作者 > <標題 >相思 </標題 > < 內容 >紅豆生南國,春來發幾枝。勸君多採擷,此物最相思。</ 內容 > </五言絕句 > <七言絕句 > < 作者 >杜牧 </ 作者 > <標題 >遣懷 </標題 > < 內容 >落魄江湖載酒行,楚腰纖細掌中輕。十年一覺楊州夢,贏得青樓薄倖名。 </ 內容 > </七言絕句 ></唐詩 >
Ex435_2.xsl
54
XSL 資料安排語法 xsl:value-of ( 內容元素 ) xsl:template (範本元素 ) xsl:apply-templates (遞回範本元素 ) xsl:for-each (迴路元素 ) xsl:sort ( 排序元素 ) xsl:if (單一條件元素 ) xsl:choose ( 多條件元素 )
55
Xsl:sort ( 排序元素 ) XSLT Script擁有排序元素,能夠指定 XML 元素進行排序。
語法<xsl:sort select="title" order="descending"/> Select 屬性指定排序的元素 Order 屬性指定是由小到大 (ascending) 或由大小 (de
scending) 排序的元素運用於 xsl:for-each 或 xsl:apply-templat
es 的子元素執行
56
XSL 資料安排語法 xsl:value-of ( 內容元素 ) xsl:template (範本元素 ) xsl:apply-templates (遞回範本元素 ) xsl:for-each (迴路元素 ) xsl:sort ( 排序元素 ) xsl:if (單一條件元素 ) xsl:choose ( 多條件元素 )
57
Xsl:if (單一條件元素 ) 利用條件式,控制 XSLT 執行資料轉換動作,語
法如下<xsl:if test=條件式 >……<xsl:if>
範例<xsl:if test=“@sales=‘Y’ ”>……<xsl:if> 執行
58
XSL 資料安排語法 xsl:value-of ( 內容元素 ) xsl:template (範本元素 ) xsl:apply-templates (遞回範本元素 ) xsl:for-each (迴路元素 ) xsl:sort ( 排序元素 ) xsl:if (單一條件元素 ) xsl:choose ( 多條件元素 )
59
xsl:choose ( 多條件元素 ) 在條件處理上需要多條件,可以使用
Xsl:choose 、 xsl:when 、 xsl:otherwise 語法
<xsl:choose> <xsl:when test=條件式一 > …… </xsl:when> <xsl:when test=條件式二 > …… </xsl:when> <xsl:otherwise> …… </xsl:otherwise> </xsl:choose> 執行
60
XSL 格式化物件 (FO) XSL工作草案定義了約 56 種格式化物件,描述已格式化
輸出的元素,並分成下列幾類: 編頁及版面格式化物件 區塊 (block) 格式化物件 行內 (Inline) 格式化物件 清單格式化物件 表格格式化物件 鏈結與多元格式化物件 線外 (Out-of Line) 格式化物件
61
使用 XSL-FO XSL-FO 是一群類似特定且已定義的變
數所組成之展示規範。 一般使用 XSL 格式化物件均是以名稱空間 (Namespace) fo 開始。 fo: xxxxxxfo:basic-link fo:bidi-override fo:block
62
XML 元素轉換技巧 複製元素 -xsl:copy
語法 :<xsl:copy>…</xsl:copy> 建立 XML 元素
建立元素 xsl:element<xsl:element name=“catalog”>網頁製作 </xsl:element> 輸出結果 : <catalog>網頁製作 <catalog>
建立屬性 xsl:attribute<xsl:element name=“catalog”><xsl:attribute name=“code”>A001</xsl:attribute>網頁製作 </xsl:element> 輸出結果 :<catalog code=”A001”>網頁製作 <catalog>
<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <xsl:copy> <xsl:value-of /> </xsl:copy> </xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href=”ex441_1.xsl" type="text/xsl"?> <唐詩 > <五言絕句 標題 ="竹里館 "> < 作者 字號 ="摩詰 ">王維 </ 作者 > < 內容 > 獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 標題 ="相思 "> < 作者 字號 ="摩詰 ">王維 </ 作者 > < 內容 > 紅豆生南國,春來發幾枝。勸君多採擷,此物最相思。 </ 內容 > </五言絕句 > <五言絕句 標題 ="春曉 "> < 作者 字號 ="太白 ">李白 </ 作者 > < 內容 > 春眠不覺曉,處處聞啼鳥。夜來風雨聲,花落知多少。 </ 內容 > </五言絕句 > <五言絕句 標題 ="彈琴 "> < 作者 字號 =" 文房 ">劉長卿 </ 作者 > < 內容 > 泠泠七絃上,靜聽松風寒。古調雖自愛,今人多不彈。 </ 內容 > </五言絕句 > </唐詩 >
xsl:copy 範例 -1
文件內容直接拷貝到畫面上
王維 獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 王維 紅豆生南國,春來發幾枝。勸君多採擷,此物最相思。 李白 春眠不覺曉,處處聞啼鳥。夜來風雨聲,花落知多少。 劉長卿 泠泠七絃上,靜聽松風寒。古調雖自愛,今人多不彈。
Ex441_1.xsl
<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <xsl:for-each select=" 唐詩 / 五言絕句 "> <p> <xsl:copy> <xsl:value-of /> </xsl:copy> </p> </xsl:for-each> </xsl:template> </xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href=”ex441_2.xsl" type="text/xsl"?> <唐詩 > <五言絕句 標題 ="竹里館 "> < 作者 字號 ="摩詰 ">王維 </ 作者 > < 內容 > 獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 標題 ="相思 "> < 作者 字號 ="摩詰 ">王維 </ 作者 > < 內容 > 紅豆生南國,春來發幾枝。勸君多採擷,此物最相思。 </ 內容 > </五言絕句 > <五言絕句 標題 ="春曉 "> < 作者 字號 ="太白 ">李白 </ 作者 > < 內容 > 春眠不覺曉,處處聞啼鳥。夜來風雨聲,花落知多少。 </ 內容 > </五言絕句 > <五言絕句 標題 ="彈琴 "> < 作者 字號 =" 文房 ">劉長卿 </ 作者 > < 內容 > 泠泠七絃上,靜聽松風寒。古調雖自愛,今人多不彈。 </ 內容 > </五言絕句 > </唐詩 >
xsl:copy 範例 -2
在 xsl:for-each 中使用 xsl:copy 會使標籤名稱亦顯示在文件上< 五言絕句 > 王維 獨坐幽篁裡,彈琴復長嘯。
深林人不知,明月來相照。 < 五言絕句 > 王維 紅豆生南國,春來發幾枝。勸君多採擷,此物最相思。 < 五言絕句 > 李白 春眠不覺曉,處處聞啼鳥。夜來風雨聲,花落知多少。 < 五言絕句 > 劉長卿 泠泠七絃上,靜聽松風寒。古調雖自愛,今人多不彈。 。
Ex441_2.xsl
<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <table border="5"> <xsl:for-each select="唐詩 /五言絕句 "> <tr> <xsl:apply-templates/> </tr> </xsl:for-each> </table> </xsl:template> <xsl:template match="*"> <td style="color:red" width="10%"> <xsl:node-name /> </td> <td> <xsl:value-of /> </td> </xsl:template> </xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href=”ex443_1.xsl" type="text/xsl"?> <唐詩 > <五言絕句 標題 ="竹里館 "> < 作者 字號 ="摩詰 ">王維 </ 作者 > < 內容 > 獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 標題 ="相思 "> < 作者 字號 ="摩詰 ">王維 </ 作者 > < 內容 > 紅豆生南國,春來發幾枝。勸君多採擷,此物最相思。 </ 內容 > </五言絕句 > <五言絕句 標題 ="春曉 "> < 作者 字號 ="太白 ">李白 </ 作者 > < 內容 > 春眠不覺曉,處處聞啼鳥。夜來風雨聲,花落知多少。 </ 內容 > </五言絕句 > <五言絕句 標題 ="彈琴 "> < 作者 字號 =" 文房 ">劉長卿 </ 作者 > < 內容 > 泠泠七絃上,靜聽松風寒。古調雖自愛,今人多不彈。 </ 內容 > </五言絕句 > </唐詩 >
xsl:node-name 範例
xsl:node-name 用於顯示標籤名稱
作者 王維 內容 獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 作者 王維 內容 紅豆生南國,春來發幾枝。勸君多採擷,此物最相思。 作者 李白 內容 春眠不覺曉,處處聞啼鳥。夜來風雨聲,花落知多少。 作者 劉長卿 內容 泠泠七絃上,靜聽松風寒。古調雖自愛,今人多不彈。 。
Ex443_1.xsl
<?xml version="1.0" encoding="BIG5" ?><xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template> <xsl:element name="title"> <xsl:value-of select=" 唐詩 / 五言絕句 / 作者 " /> <xsl:value-of select=" 唐詩 / 五言絕句 /@ 標題 " /> </xsl:element> <h3> <xsl:value-of select="唐詩 /五言絕句 / 作者 " /> <br/> <xsl:value-of select="唐詩 /五言絕句 /@標題 " /> <br/> <xsl:value-of select="唐詩 /五言絕句 / 內容 "/> </h3> </xsl:template> </xsl:stylesheet>
<?xml version="1.0" encoding="BIG5" ?> <?xml-stylesheet href=”ex444_1.xsl" type="text/xsl"?> <唐詩 > <五言絕句 標題 ="竹里館 "> < 作者 字號 ="摩詰 ">王維 </ 作者 > < 內容 > 獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 </ 內容 > </五言絕句 > <五言絕句 標題 ="相思 "> < 作者 字號 ="摩詰 ">王維 </ 作者 > < 內容 > 紅豆生南國,春來發幾枝。勸君多採擷,此物最相思。 </ 內容 > </五言絕句 > <五言絕句 標題 ="春曉 "> < 作者 字號 ="太白 ">李白 </ 作者 > < 內容 > 春眠不覺曉,處處聞啼鳥。夜來風雨聲,花落知多少。 </ 內容 > </五言絕句 > <五言絕句 標題 ="彈琴 "> < 作者 字號 =" 文房 ">劉長卿 </ 作者 > < 內容 > 泠泠七絃上,靜聽松風寒。古調雖自愛,今人多不彈。 </ 內容 > </五言絕句 > </唐詩 >
xsl:element 範例
xsl:element 可建立新標籤本例 name=“title” 是將作者與標題 show 在 browser 的 Title 上
王維 竹里館 獨坐幽篁裡,彈琴復長嘯。深林人不知,明月來相照。 。
Ex444_1.xsl
67
問題與解答