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" ?>
(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>
語法解析:
例子:
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元素
示例代碼
模板匹配所有的name元素:
<xsl:template match="name">
</xsl:template>
<xsl:template match="student//name">
</xsl:template>
(2)<xsl:value-of>元素
<xsl:value-of select ="匹配模式"/>
(3)<xsl:for-each>元素
若想循環選擇多條數據,可使用<xsl:for-each>元素。其語法格式如下:
<xsl:for-each select="匹配模式">
<!--輸出內容-->
</xsl:for-each>
(4)<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 test="匹配模式">
<!--輸出內容-->
</xsl:when>
<xsl:when test="匹配模式">
<!--輸出內容-->
</xsl:when>
... ...
<xsl:otherwise>
<!--輸出內容-->
</xsl:otherwise>
</xsl:choose>
(7)<xsl:apply-templates>元素
<xsl:apply-templates select ="匹配模式">
</xsl:apply-templates>
6.XSLT
XSLT(eXtensible Stylesheet Language Transformation)是一種用來轉換XML文檔結構的語言。
XSL的處理過程:
首先是根據XML文檔構造源樹,然后根據XSL規則將源樹轉換為結果樹,生成結果樹后,對其進行解釋,格式化為一種適合顯示、打印或是播放的格式。
| 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)
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元素 |
| 運算符 |
描述 |
實例 |
| | |
計算兩個節點集 |
//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 |
軸名::節點測試[謂語]
其中:
(1)軸(axis),定義某個相對於當前節點的節點集。
示例代碼:child::price[price=9.90]
XPath的軸名稱 :
| 軸名稱 |
描述 |
| ancestor |
選取當前節點的所有先輩 |
| ancestor-or-self |
選取當前節點的所有先輩以及當前節點本身 |
| attribute |
選取當前節點的所有屬性 |
| child |
選取當前節點的所有子元素 |
| descendant |
選取當前節點的所有后代元素 |
| descendant-or-self |
選取當前節點的所有后代元素以及當前節點本身 |
| following |
選取文檔中當前節點的結束標簽之后的所有節點 |
| namespace |
選取當前節點的所有命名空間節點 |
| parent |
選取當前節點的父節點 |
| preceding |
選取文檔中當前節點的開始標簽之前的所有節點 |
| preceding-sibling |
選取當前節點之前的所有同級節點 |
| self |
選取當前節點 |
