Web Services 應用開發學習筆記(四):XML顯示—XSL


 
本文內容
  1.  引言
  2.  CSS級聯樣式表
  3.  XSL基礎
  4.  XSL文檔結構
  5.  XSL元素
  6.  XSLT
   7.  XPath基礎
   8.  XPath表達式
   9.  XPath定位路徑
 

1.引言

下面是一個xml的文件,如果用瀏覽器直接打開,會是什么效果呢?

product.xml

<?xml version="1.0" encoding="gb2312"?>
<PRODUCTS>
<PRODUCT PRODID="p001" CATEGORY="Toy">
<PRODUCTNAME>模型飛機</PRODUCTNAME>
<DESCRIPTION>適合於5歲以上兒童</DESCRIPTION>
<PRICE>239</PRICE>
<QUANTITY>20</QUANTITY>
</PRODUCT>
<PRODUCT PRODID="p002" CATEGORY="Toy">
<PRODUCTNAME>電動汽車</PRODUCTNAME>
<DESCRIPTION>適合4歲以上兒童</DESCRIPTION>
<PRICE>860</PRICE>
<QUANTITY>12</QUANTITY>
</PRODUCT>
</PRODUCTS>

很顯然,瀏覽器僅僅是作為一個xml文件的解析器,無法理解這些標記的含義,所以它就將文件原封不動的顯示出來。嘿嘿!想要控制xml像web頁面那樣顯示,就需要用到W3C推薦的樣式表標准:CSS級聯樣式表XSL可擴展樣式表

 

2.CSS級聯樣式表

CSS是一種文本文檔,用於控制XML文檔和HTML文檔中的標簽如何被格式化。簡單點來說, 怎樣去顯示文檔中的內容。

不過CSS與XML結合時存在局限性:

(1)CSS可以格式化XML文檔,能夠很好的控制輸出的樣式,比如色彩、字體、大小等,但只能靜態控制文檔的樣式或外觀

(2)CSS不能重新排序文檔中的元素

(3)CSS不能動態判斷和控制元素的顯示

(4)CSS無法動態統計元素中的數據

至於CSS的語法規則這里不多說,可以去參考其他資料

那應該如何讓XML與CSS關聯起來呢?

在XML中通過xml-stylesheet指令引入CSS樣式表,其語法格式如下:

<?xml-stylesheet type="text/css" href="location" ?>
(1)<?xml-stylesheet?>處理指令中的type屬性是正在使用的樣式表的類型。對CSS來說,其值是text/css,對XSL來說,則是text/xsl

(2)<?xml-stylesheet?>處理指令中的href屬性值是一個URL,通常是相對值,指明在何處可找到樣式表。如果樣式表沒有找到,Web瀏覽器很可能使用其缺省的樣式表,此時瀏覽器可能會報告一條錯誤信息

現在我們引入product.css:

product.xml:

<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/css" href="product.css"?>
<PRODUCTS>
<PRODUCT PRODID="p001" CATEGORY="Toy">
<PRODUCTNAME>模型飛機</PRODUCTNAME>
<DESCRIPTION>適合於5歲以上兒童</DESCRIPTION>
<PRICE>239</PRICE>
<QUANTITY>20</QUANTITY>
</PRODUCT>
<PRODUCT PRODID="p002" CATEGORY="Toy">
<PRODUCTNAME>電動汽車</PRODUCTNAME>
<DESCRIPTION>適合4歲以上兒童</DESCRIPTION>
<PRICE>860</PRICE>
<QUANTITY>12</QUANTITY>
</PRODUCT>
</PRODUCTS>

product.css:

PRODUCTNAME
{font-family:Arial;
font-size
:20pt;
font-weight
:bold;
color
:red;
display
:block;
padding-top
:6pt;
padding-bottom
:6pt
}
PRICE,DESCRIPTION,QUANTITY
{font-family:Arial;
font-size
:12pt;
color
:teal;
display
:block;
padding-top
:3pt;
padding-bottom
:3pt
}

瀏覽器效果:

 

3.XSL基礎

如果說HTML與CSS是最佳搭檔的話,那么XSL就是XML的就是天作之和了。先來看基本的定義

XSL(eXtensible Stylesheet Language)是一種基於XML的語言,是一種顯示XML文件的規范,遵循XML的規范制定。

XSL實際上包含三種語言:

(1)XSLT是一種轉換XML的語言,着重於XML文檔轉換

(2)XPath是一種用來訪問XML文檔不同部分或模式的語言,着重於從XML層次結構上訪問結點

(3)XSLFO(XSL格式化對象)是一種定義XML顯示方式的語言,着重於格式對象,作用就類似CSS在HTML中的作用 

 

4.XSL文檔結構

XSL文檔本身是格式良好的XML文檔,在XSL文件的開頭要有和XML文件相同的聲明,XSL文檔的標准格式如下

<xsl:stylesheet version="1.0“
xmlns:xsl="
http://www.w3.org/1999/XSL/Transform">
模板規則
輸出模板
</xsl:stylesheet>

語法解析:

<xsl:stylesheet>既是XSL的聲明語句,也是根元素,必須位於文件的首部,xsl是代表着stylesheet元素所屬命名空間的前綴

例子:

student.xml:

<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="student.xsl"?>
<class>
<student ID="101">
<name>李華</name>
<sex></sex>
<birthday>1988.12.12</birthday>
<score>92</score>
<skill>Java</skill>
</student>
<student ID="102">
<name>王燕</name>
<sex></sex>
<birthday>1989.9.10</birthday>
<score>89</score>
<skill>Visual Basic</skill>
</student>
<student ID="103">
<name>張磊</name>
<sex></sex>
<birthday>1987.9.9</birthday>
<score>98</score>
<skill>UML</skill>
</student>
<student ID="104">
<name>楊菲</name>
<sex></sex>
<birthday>1989.6.16</birthday>
<score>85</score>
<skill>SQL Server</skill>
</student>
</class>

student.xsl:

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>學生成績單</title>
</head>
<body>
<h2 align="center">學生成績單</h2>
<table border="2" cellpadding="0" align="center">
<tr bgcolor="#9acd32">
<th>姓名</th>
<th>性別</th>
<th>生日</th>
<th>成績</th>
</tr>
<xsl:for-each select="/class/student">
<tr>
<td>
<xsl:value-of select="name"/>
</td>
<td>
<xsl:value-of select="sex"/>
</td>
<td>
<xsl:value-of select="birthday"/>
</td>
<td>
<xsl:value-of select="score"/>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

瀏覽器效果:

5.XSL元素

根據上面的例子可以總結出元素的種類。
(1)<xsl:template>元素
模板(template)是XSLT中最重要的概念之一,模板由兩部分組成:匹配模式(match pattern)和執行。
<xsl:template>元素的match屬性,指定要將該模板應用於輸入文檔的哪些節點,match屬性的值是一個XPath表達式

示例代碼

模板匹配所有的name元素:

<xsl:template match="name">
</xsl:template>
 
模板匹配所有的父節點為student元素的name元素:
<xsl:template match="student//name">
</xsl:template>

 

(2)<xsl:value-of>元素 

使用<xsl:value-of>元素可用來取出XML文件中被選擇的元素或屬性的內容,語法格式如下:
<xsl:value-of  select ="匹配模式"/>

 

(3)<xsl:for-each>元素

若想循環選擇多條數據,可使用<xsl:for-each>元素。其語法格式如下:

<xsl:for-each select="匹配模式">
<!--輸出內容-->
</xsl:for-each>

 

(4)<xsl:sort>元素 

如需對結果進行排序,只需在XSL文件中的<xsl:for-each>元素內部添加一個<xsl:sort>元素即可。其語法格式如下:
<xsl:sort select="匹配模式" order="ascending|descending"
case-order
="upper-first|lower-first" data-type="text|number|qname"/>

 

(5)<xsl:if>元素

<xsl:if>類似普通程序語言的if條件語句,允許設定節點滿足某個條件時,被模板處理。其語法格式如下:

<xsl:if test="匹配模式">
<!--輸出內容-->
</xsl:if>


(6)<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>

 

(7)<xsl:apply-templates>元素 

<xsl:apply-templates>元素用來指示處理器發現一個合適的模板,並且在每個選擇的元素上執行指定的任務,可以將其理解為程序中的子函數調用。其語法格式如下:
<xsl:apply-templates select ="匹配模式">
</xsl:apply-templates>
pselect屬性用來定義確切的節點名稱,是可選的,缺省值是“node()”,意味着對當前結點的所有子節點執行該模板
 

 6.XSLT

 XSLT(eXtensible Stylesheet Language Transformation)是一種用來轉換XML文檔結構的語言。

XSL的處理過程:

首先是根據XML文檔構造源樹,然后根據XSL規則將源樹轉換為結果樹,生成結果樹后,對其進行解釋,格式化為一種適合顯示、打印或是播放的格式。

XSLT和CSS的比較:

CSS

XSLT

使用簡單

使用復雜

不能排序、添加或刪除元素

可排序、添加或刪除元素

不能訪問文檔除元素外的其它信息

能訪問其它信息

使用內存比較少

使用較多內存和處理器能力

與XML語法不同

語法與XML相同


7.XPath基礎

XPath就是一種專門用來在XML文檔中定位和查找信息的語言,通過XPath可對XML文檔中的元素和屬性進行遍歷,是高級XML應用的基礎 。

 

XPath主要有四種數據類型:

(1)節點集

(2)布爾類型

(3)字符串類型

(4)數值類型

 

在XPath中,可以將節點划分為七種節點類型:

(1)根節點(Root Node)

(2)元素節點(Element Nodes)

(3)文本節點(Text Nodes)

(4)屬性節點(Attribute Nodes)

(5)命名空間節點(Namespace Nodes)

(6)處理指令節點(Processing Instruction Nodes)

(7)注釋節點(Comment Nodes)
 
XPath節點關系:
(1)父(parent)
(2)子(children)
(3)同胞(sibling)
(4)先輩(ancestor)
(5)后代(descendant)
 

8.XPath表達式

XPath將XML文檔看作由節點構成的層次樹,通過編寫XPath表達式來定位樹中特定的節點

XPath路徑表達式: 

表達式

描述

nodename

選取此節點的所有子節點

/

從根節點選取,絕對路徑,表示當前文檔的根節點 

//

從任意節點選取,相對路徑,表示當前文檔所有的節點

.

選取當前節點

..

選取當前節點的父節點

@

選取屬性

 

 例子:

<?xml version="1.0" encoding="GB2312"?>
<bookstore>
<book>
<title lang="en">RESTful Web Services</title>
<price>29.00</price>
</book>
<book>
<title lang="zh">C#編程基礎</title>
<price>46.00</price>
</book>
</bookstore>

解析:

bookstore 

選取 bookstore 元素的所有子節點

/bookstore

選取根節點bookstore元素

/bookstore/book/price

選取bookstore元素下所有book元素的所有price元素

/bookstore/book/*

選取/bookstore/book的所有子元素

bookstore/book

選取bookstore元素下所有的book子元素

//bookstore

選取文檔中所有的bookstore元素,無論它在什么層次

bookstore//book

選取在bookstore元素下所有的book元素,無論它們位於bookstore之下的什么位置

/bookstore/*/price

選取bookstore的子元素中,包含有price作為子元素的元素

//*

選取文件中的所有元素

//@lang

選取所有名為 lang 的屬性

 

謂語表達式:

路徑表達式

描述

/bookstore/book[last()]

選取屬於bookstore子元素的最后一個book元素

/bookstore/book[last()-1]

選取屬於bookstore子元素的倒數第二個book元素

/bookstore/book[position()<3]

選取前兩個屬於bookstore元素的子元素的book元素

//title[@lang]

選取所有擁有名為lang的屬性的title元素

//title[@lang="en"]

選取所有title元素,且這些元素擁有值為 eng 的 lang 屬性

/bookstore/book[price>15.00]

選取所有bookstore元素的book元素,且其中的price元素的值須大於15.00

/bookstore/book[price>15.00]/title

選取所有bookstore元素中的book元素的title元素,且其中的price元素的值須大於15.00

//title[@*]

選取所有帶有屬性的 title 元素

 

如果需要選擇一個以上的路徑,可以在XPath表達式中使用“|”運算符:

路徑表達式

描述

//book/title | //book/price

選取所有book元素的title和price元素

//title | //price

選取文檔中所有的title和price元素

/bookstore/book/title | //price

選取所有屬於bookstore元素的book元素的title元素,以及文檔中所有的price元素

 
XPath表達式的常用運算符:

運算符

描述

實例

|

計算兩個節點集

//book | //cd,返回所有帶有 book 和 cd 元素的節點集

+

加法

6 + 4,

-

減法

6 - 4

*

乘法

6 * 4

div

除法

8 div 4

=

等於

price=15

!=

不等於

price!=15

<

小於

price<15

<=

小於或等於

price<=15

>

大於

price>15

>=

大於或等於

price>=15

or

price=15 or price=35

and

price>15 or price<35

mod

計算除法的余數

5 mod 2

 
9.XPath定位路徑
 
定位步驟從左到右,依次按順序計算
 
XPath的定位步驟的語法如下:

軸名::節點測試[謂語]

其中:

(1)軸(axis),定義某個相對於當前節點的節點集。

(2)節點測試(node-test),識別某個軸內部的節點
 
(3)謂語(predicate),零或多個預測,以更深入地提煉所選的節點集

示例代碼:child::price[price=9.90]

XPath的軸名稱 :

軸名稱

描述

ancestor

選取當前節點的所有先輩

ancestor-or-self

選取當前節點的所有先輩以及當前節點本身

attribute

選取當前節點的所有屬性

child

選取當前節點的所有子元素

descendant

選取當前節點的所有后代元素

descendant-or-self

選取當前節點的所有后代元素以及當前節點本身

following

選取文檔中當前節點的結束標簽之后的所有節點

namespace

選取當前節點的所有命名空間節點

parent

選取當前節點的父節點

preceding

選取文檔中當前節點的開始標簽之前的所有節點

preceding-sibling

選取當前節點之前的所有同級節點

self

選取當前節點

 
作者: ForEvErNoME
出處: http://www.cnblogs.com/ForEvErNoME/
歡迎轉載或分享,但請務必聲明文章出處。如果文章對您有幫助,希望你能 推薦關注
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM