小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

xslt輕松入門(zt)

 duduwolf 2005-08-14

1.XSLT的概念

1.1 什么是XSLT
1.2 為什么要用XSLT
1.3 XSLT的歷史
1.4 什么是XPath
1.5 XSLT和CSS的比較
1.6 XSLT和IE5

1.XSLT的概念

我們首先來(lái)澄清一個(gè)概念,大家可能聽說(shuō)過(guò)XSL(eXtensible Stylesheet Language),XSL和我們這里說(shuō)的XSLT從狹義上理解是一樣的,而按照W3C的標(biāo)準(zhǔn),XSLT的說(shuō)法更嚴(yán)格些,因此我們?cè)谖恼轮薪y(tǒng)一使用XSLT的稱法。它們之間具體的關(guān)系我們會(huì)在下面講述。

1.1 什么是XSLT

XSLT的英文標(biāo)準(zhǔn)名稱為eXtensible Stylesheet Language Transformation。根據(jù)W3C的規(guī)范說(shuō)明書(http://www./TR/xslt),最早設(shè)計(jì)XSLT的用意是幫助XML文檔(document)轉(zhuǎn)換為其它文檔。但是隨著發(fā)展,XSLT已不僅僅用于將XML轉(zhuǎn)換為HTML或其它文本格式,更全面的定義應(yīng)該是:

XSLT是一種用來(lái)轉(zhuǎn)換XML文檔結(jié)構(gòu)的語(yǔ)言。

1.2 為什么要用XSLT

我們已經(jīng)知道,XML是一種電腦程序間交換原始數(shù)據(jù)的簡(jiǎn)單而標(biāo)準(zhǔn)的方法。它的成功并不在于它容易被人們書寫和閱讀,更重要的是,它從根本上解決了應(yīng)用系統(tǒng)間的信息交換。因?yàn)閄ML滿足了兩個(gè)基本的需求:

(1).將數(shù)據(jù)和表達(dá)形式分離。就象天氣預(yù)報(bào)的信息可以顯示在不同的設(shè)備上,電視,手機(jī)或者其它。

(2).在不同的應(yīng)用之間傳輸數(shù)據(jù)。電子商務(wù)數(shù)據(jù)交換的與日俱增使得這種需求越來(lái)越緊迫。

為了使數(shù)據(jù)便于人們的閱讀理解,我們需要將信息顯示出來(lái)或者打印出來(lái),例如將數(shù)據(jù)變成一個(gè)HTML文件,一個(gè)PDF文件,甚至是一段聲音;同樣,為了使數(shù)據(jù)適合不同的應(yīng)用程序,我們必須有能夠?qū)⒁环N數(shù)據(jù)格式轉(zhuǎn)換為另一種數(shù)據(jù)格式,比如需求格式可能是一個(gè)文本文件,一個(gè)SQL語(yǔ)句,一個(gè)HTTP信息,一定順序的數(shù)據(jù)調(diào)用等。而XSLT就是我們用來(lái)實(shí)現(xiàn)這種轉(zhuǎn)換功能的語(yǔ)言。將XML轉(zhuǎn)換為HTML,是目前XSLT最主要的功能。

1.3 XSLT的歷史

想很多其他XML家族成員一樣,XSLT是由W3C起草和制定的。它的主要發(fā)展歷程如下:

.1995年由James Clark提議;

.1997年8月正式提案為XSL;

.1998年5月由Norman Walsh完成需求概要;

.1998年8月18日XSL草案發(fā)布;

.1999年11月16日正式發(fā)布XSL 1.0推薦版本。

目前,XSLT仍然在快速的發(fā)展中,XSLT1.1的草案已經(jīng)可以在W3C網(wǎng)站(http://www./TR/xslt11)上看到。

1.4 什么是XPath

XPath是XSLT的重要組成部分,我們將在第四章講解它的詳細(xì)語(yǔ)法。那么XPath是什么呢?我們首先來(lái)了解一下XSL系列的"家族"關(guān)系。如下圖:



XSL在轉(zhuǎn)換XML文檔時(shí)分為明顯的兩個(gè)過(guò)程,第一轉(zhuǎn)換文檔結(jié)構(gòu);其次將文檔格式化輸出。這兩步可以分離開來(lái)并單獨(dú)處理,因此XSL在發(fā)展過(guò)程中逐漸分裂為XSLT(結(jié)構(gòu)轉(zhuǎn)換)和XSL-FO(formatting objects)(格式化輸出)兩種分支語(yǔ)言,其中XSL-FO的作用就類似CSS在HTML中的作用。而我們這里重點(diǎn)討論的是第一步的轉(zhuǎn)換過(guò)程,也就是XSLT。

另外,在學(xué)習(xí)XML時(shí)我們已經(jīng)知道XML是一個(gè)完整的樹結(jié)構(gòu)文檔。在轉(zhuǎn)換XML文檔時(shí)可能需要處理其中的一部分(節(jié)點(diǎn))數(shù)據(jù),那么如何查找和定位XML文檔中的信息呢,XPath就是一種專門用來(lái)在XML文檔中查找信息的語(yǔ)言。XPath隸屬XSLT,因此我們通常會(huì)將XSLT語(yǔ)法和XPath語(yǔ)法混在一起說(shuō)。

用一種比較好理解的解釋:如果將XML文檔看作一個(gè)數(shù)據(jù)庫(kù),XPath就是SQL查詢語(yǔ)言;如果將XML文檔看成DOS目錄結(jié)構(gòu),XPath就是cd,dir等目錄操作命令的集合。

1.5 XSLT和CSS的比較

CSS同樣可以格式化XML文檔,那么有了CSS為什么還需要XSLT呢?因?yàn)镃SS雖然能夠很好的控制輸出的樣式,比如色彩,字體,大小等,但是它有嚴(yán)重的局限性,就是:

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

(2) CSS不能判斷和控制哪個(gè)元素被顯示,哪個(gè)不被顯示;

(3) CSS不能統(tǒng)計(jì)計(jì)算元素中的數(shù)據(jù);

換句話說(shuō),CSS只適合用于輸出比較固定的最終文檔。CSS的優(yōu)點(diǎn)是簡(jiǎn)潔,消耗系統(tǒng)資源少;而XSLT雖然功能強(qiáng)大,但因?yàn)橐匦滤饕齒ML結(jié)構(gòu)樹,所以消耗內(nèi)存比較多。

因此,我們常常將它們結(jié)合起來(lái)使用,比如在服務(wù)器端用XSLT處理文檔,在客戶端用CSS來(lái)控制顯示??梢詼p少響應(yīng)時(shí)間。

1.6 XSLT和IE5

在XSLT草案發(fā)布不久,微軟就在IE4中提供了支持XSL功能的預(yù)覽版本,到IE5.0發(fā)布時(shí),正式全面支持XSLT,可是由于IE5發(fā)布的比XSLT1.0標(biāo)準(zhǔn)時(shí)間早,因此在IE5.0中支持的XSTL功能和XSLT 1.0略有不同。(呵呵~~XML推行的主要原因之一就是解決HTML過(guò)分依賴瀏覽器的問(wèn)題,現(xiàn)在微軟又想標(biāo)新立異?)。好在微軟的IE5.5中執(zhí)行的標(biāo)準(zhǔn)已經(jīng)和W3C的XSLT1.0基本相近。但令人頭疼的是IE5.0已經(jīng)發(fā)行了幾百萬(wàn)套,您使用的XSLT很可能不能被客戶的瀏覽器正確執(zhí)行。目前XSLT 1.1仍在發(fā)展中,W3C及有關(guān)組織也在和微軟協(xié)商爭(zhēng)取獲得統(tǒng)一。呵呵~~故事還遠(yuǎn)遠(yuǎn)沒(méi)有結(jié)束噢。

注意:本文中提到的語(yǔ)法都是根據(jù)XSLT 1.0的標(biāo)準(zhǔn)來(lái)講的,沒(méi)有任何微軟的"方言"。

Posted by 老冒 at 16:11  閱讀(87) 評(píng)論(4) 引用(0) 技術(shù)文摘
開放權(quán)限:所有人可見

引用

http://www2./app/trackBack.do?type=blog&trackBackID=35758

評(píng)論

2.XSLT的實(shí)例

2.1 XSLT如何轉(zhuǎn)換XML
2.2 一個(gè)實(shí)例
2.3 過(guò)程解析
2.4 XSLT的用途

2.1 XSLT如何轉(zhuǎn)換XML

我們打個(gè)有趣的比方,你玩過(guò)橡皮泥吧,用不同的模子按上去,就可以做出需要的形狀。如果我們假設(shè)XML數(shù)據(jù)文檔是一塊大橡皮泥,XSLT就象是一個(gè)模子,用力一按,就做出需要的形狀來(lái)---符合不同需要的HTML文檔。

具體看下面的過(guò)程示意圖:



我們將XML原文檔輸入,用XSL作為模板,通過(guò)轉(zhuǎn)換引擎,最終輸出需要的HTML文檔。其中的轉(zhuǎn)換引擎就是比喻中"用力一按"的過(guò)程。在具體應(yīng)用中,有專門的軟件來(lái)實(shí)現(xiàn)這個(gè)轉(zhuǎn)換過(guò)程,名為XML Processor。目前已經(jīng)有很多 Processor 軟件(下面將詳細(xì)提到),在IE5.5中也已經(jīng)內(nèi)嵌了XML Processor。

2.2 一個(gè)實(shí)例

現(xiàn)在我們來(lái)看一個(gè)簡(jiǎn)單的XSLT實(shí)際應(yīng)用例子,獲得一些感官上的認(rèn)識(shí)。很多網(wǎng)頁(yè)設(shè)計(jì)師看到類似HTML的代碼才會(huì)放心,代碼是那樣的親切和熟悉。

例子1: "Hello, world!"

hello world作為第一個(gè)教程已經(jīng)是程序語(yǔ)言中的慣例了。我們也遵守這個(gè)慣例,看看如何利用XSLT來(lái)顯示"hello world"。雖然這個(gè)例子沒(méi)有什么實(shí)際用途,但是請(qǐng)大家不要急,后面還有更詳細(xì)的例子。

第一步:建立要輸入XML文檔hello.xml。

<?xml version="1.0" encoding="iso-8859-1"?>

<greeting>Hello, world!</greeting>

這是一個(gè)很簡(jiǎn)單XML文檔,只包含一個(gè)節(jié)點(diǎn)的XML結(jié)構(gòu)樹。

第二步:建立XSLT文檔hello.xsl。提示:默認(rèn)的XSLT文件的后綴名為.xsl。

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet xmlns:xsl="http://www./TR/WD-xsl">

<xsl:template match="/">

<html>

<head>

<title>First XSLT example</title>

</head>

<body>

<p><xsl:value-of select="greeting"/></p>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

你現(xiàn)在可以用IE5.0以上版本瀏覽器打開這個(gè)hello.xsl文件,看到XSL的結(jié)構(gòu)樹。

第三步:在XML中調(diào)用這個(gè)XSL文件。修改hello.xml的代碼為:

<?xml version="1.0" encoding="iso-8859-1"?>

<?xml-stylesheet type="text/xsl" href="hello.xsl"?>

<greeting>Hello, world!</greeting>

ok,到這一步原理上已經(jīng)完成了所有的代碼,接下來(lái)只要用一個(gè)XSLT的處理器(XML Processor)來(lái)執(zhí)行hello.xml就可以看到"hello
world"的顯示結(jié)果了。流行的處理器軟件有以下幾種:

(1).James Clark的XT。下載網(wǎng)址:http://www./xml/xt.html

(2).IBM的XML for Java軟件包,名為L(zhǎng)otusXSL。下載網(wǎng)址:www.alphaworks.ibm.com/tech/xml4j

(3).Saxon。下載網(wǎng)址:http://www.

(4).微軟的MSXML3。下載網(wǎng)址:http://www.microsoft.com/xml

有網(wǎng)友要問(wèn),我想在瀏覽器中看到"hello world"的效果應(yīng)該怎么做?在微軟的IE5.5內(nèi)嵌了MSXML3解釋器,你可以用IE5.5打開hello.xml文件,就可以看到結(jié)果。如果只看到XML結(jié)構(gòu)樹,不是單獨(dú)的"hello
world"字樣,說(shuō)明你的瀏覽器沒(méi)有安裝MSXML3版本。

如果沒(méi)有安裝又想看效果怎么辦?那還是用我們?cè)赬ML教程中的老辦法,采用JS實(shí)現(xiàn)。(這已經(jīng)超出了本文要講的范圍,但為了更加直觀,便于理解,我們?cè)谶@里提供實(shí)例代碼。)下面是一種實(shí)現(xiàn)的代碼,可以保存為hello.htm,和上面的hello.xml,hello.xsl放在同一目錄下面。最后用IE5.0以上版本打開hello.htm就可以看到效果了。

<html>

<head>

<script language="javascript" for="window" event="onload">

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

xmlDoc.async="false";

xmlDoc.load("hello.xml");

nodes = xmlDoc.documentElement.childNodes;

greeting.innerText = nodes.item(0).text;

</script>

<title>First XSLT Example</title>

</head>

<body bgcolor="#FFFFFF">

<span id="greeting"></span><br>

</body>

</html>

2.3 過(guò)程解析

如果你成功的看到效果,你也許想知道這些代碼的具體含義,我們來(lái)詳細(xì)解說(shuō):看hello.xsl文件

<?xml version="1.0" encoding="iso-8859-1"?>

這是標(biāo)準(zhǔn)的XML文檔的首行代碼,因?yàn)閄SLT本身也是XML文檔。encoding屬性用來(lái)定義文檔使用的編碼形式,iso-8859-1主要支持西歐和北美的語(yǔ)言編碼。如果你想使用簡(jiǎn)體中文,那么就應(yīng)該寫成:

<?xml version="1.0" encoding="GB2312"?>

接下去的代碼是:

<xsl:stylesheet

xmlns:xsl="http://www./1999/XSL/Transform"

version="1.0">

這是標(biāo)準(zhǔn)的XSLT文件首行代碼。xsl:stylesheet代碼的意思是將文檔作為一個(gè)樣式表來(lái)(stylesheet)處理。xmlns:xsl屬性是一個(gè)名字空間聲明,和XML中的名字空間使用方法一樣,用來(lái)防止元素名稱重復(fù)和混亂。其中前綴xsl的意思是文檔中使用的元素遵守W3C的XSLT規(guī)范。最后的version屬性說(shuō)明樣式表只采用XSLT
1.0的標(biāo)準(zhǔn)功能,這也是目前僅有的標(biāo)準(zhǔn)。

<xsl:template match="/">

一個(gè)<xsl:template>元素定義一個(gè)模板規(guī)則。屬性match="/"說(shuō)明XML源文檔中,這個(gè)模板規(guī)則作用的起點(diǎn)。"/"是一種XPath語(yǔ)法,我們?cè)诤竺鎸⒃敿?xì)講述,這里的"/"代表XML結(jié)構(gòu)樹的根(root)。

接下去的代碼是:

<html>

<head>

<title>First XSLT Example</title>

</head>

<body>

<p><xsl:value-of select="greeting"/></p>

</body>

</html>

說(shuō)明:當(dāng)模板規(guī)則被觸發(fā),模板的內(nèi)容就會(huì)控制輸出的結(jié)果。例子中,模板大部分內(nèi)容由HTML元素和文本構(gòu)成。只有<xsl:value-of>元素是XSLT語(yǔ)法,這里<xsl:value-of>的作用是拷貝原文檔中的一個(gè)節(jié)點(diǎn)的值到輸出文檔。而select屬性則詳細(xì)指定要處理的節(jié)點(diǎn)名稱。這是XPath語(yǔ)法,"greeting"的意思就是尋找根節(jié)點(diǎn)名為greeting的元素,并用模板來(lái)處理這個(gè)節(jié)點(diǎn)。具體的就是找到<greeting>元素,然后將元素的值"hello
world"按模板樣式拷貝到輸出文件。

提示:由于XML文檔是嚴(yán)格的層級(jí)結(jié)構(gòu)(用IE5查看XML文件,會(huì)看見XML文檔類似多級(jí)關(guān)聯(lián)菜單),所以我們形象的稱XML文檔為文檔樹,其中每一對(duì)元素稱作樹的一個(gè)節(jié)點(diǎn)。根元素就是根節(jié)點(diǎn)。

最后關(guān)閉所有元素:

</xsl:template>

</xsl:stylesheet>

好,例子解說(shuō)完畢。你是否想過(guò)為什么要用這么復(fù)雜的方法來(lái)顯示"hello world"呢?

關(guān)鍵不在表面,而在于實(shí)質(zhì):用這種方法,hello world可以從XML文檔中被提取出來(lái),并用各種不同的XSLT模板處理,來(lái)輸出不同需求的文檔。我們來(lái)看看XSLT的主要用途:

2.4 XSLT的用途

XSLT的主要用途就是數(shù)據(jù)轉(zhuǎn)換應(yīng)用。

由于以XML為基礎(chǔ)的電子商務(wù)廣泛普及,XSLT作為數(shù)據(jù)轉(zhuǎn)換的角色也越來(lái)越重要。例如直接將電視新聞的數(shù)據(jù)格式轉(zhuǎn)換成報(bào)紙新聞需要的數(shù)據(jù)格式;將股票數(shù)據(jù)直接轉(zhuǎn)換成圖片顯示在網(wǎng)頁(yè)上;對(duì)EDI(電子數(shù)據(jù)交換)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),排序等等。

XSLT是處理類似工作的理想工具。

Posted by 老冒 at 2005-08-14 16:16:11

通過(guò)前面兩章的介紹,我們已經(jīng)對(duì)XSLT的基本概念和它的轉(zhuǎn)換過(guò)程有了一些了解。下面我們一起來(lái)學(xué)習(xí)XSLT的具體語(yǔ)法。說(shuō)到語(yǔ)法總是比較枯燥的,您可以大體上瀏覽一遍,等您真正需要使用XSLT的時(shí)候,再仔細(xì)研究它們。

3.XSLT的元素語(yǔ)法

3.1 xsl:template和xsl:apply-templates

3.2 xsl:value-of

3.3 xsl:for-each

3.4 xsl:if

3.5 Xxsl:choose, when, otherwise

3.6 xsl:sort

3.1 xsl:template和xsl:apply-templates


 

模板(template)是XSLT中最重要的概念之一。XSLT文件就是由一個(gè)一個(gè)的模板組成,任何一個(gè)XSLT文件至少包含一個(gè)模板。模板的概念就象是搭積木;你如果是程序員,也可以將模板看作一個(gè)方法,一個(gè)類,或者一個(gè)模塊。它們可以被拼裝組合,也可以單獨(dú)成塊,不同的模板控制不同的輸出格式。

模板(template)由兩部分組成:匹配模式(match pattern)和執(zhí)行。簡(jiǎn)單的講模式定義XML源文檔中哪一個(gè)節(jié)點(diǎn)將被模板處理,執(zhí)行則定義輸出的是什么格式。兩部分對(duì)應(yīng)的語(yǔ)法為xsl:template和xsl:apply-templates。


 

xsl:template的語(yǔ)法是:


 

<xsl:template

match = pattern

name = qname

priority = number

mode = qname>

<!-- 執(zhí)行內(nèi)容 -->

</xsl:template>


 

xsl:template的作用是定義一個(gè)新模板。屬性中name,priority,和mode用來(lái)區(qū)別匹配同一節(jié)點(diǎn)的不同模板。它們不是常用的屬性。match屬性則控制模板的匹配模式(pattern),匹配模式是用來(lái)定位XML源文檔中哪一個(gè)節(jié)點(diǎn)被模板處理。一個(gè)模板匹配一個(gè)節(jié)點(diǎn)。我們用一個(gè)例子來(lái)幫助理解:

假設(shè)我們要處理一個(gè)包含章節(jié)和段落文檔。我們用para元素定義段落,用chapter元素定義章節(jié)。我們來(lái)看看match屬性可能的值。下面的語(yǔ)句寫法說(shuō)明模板匹配所有的para元素


 

<xsl:template match="para">

</xsl:template>


 

下面的語(yǔ)句寫法說(shuō)明模板匹配所有的para元素和所有的chapter元素:


 

<xsl:template match="(chapter|para)">

</xsl:template>


 

下面的語(yǔ)句寫法說(shuō)明模板匹配所有的父節(jié)點(diǎn)為chapter元素的para元素:


 

<xsl:template match="chapter//para">

</xsl:template>


 

下面的語(yǔ)句寫法說(shuō)明模板匹配根節(jié)點(diǎn):


 

<xsl:template match="/">

</xsl:template>


 

我們?cè)賮?lái)看apply-templates語(yǔ)法:


 

<xsl:apply-templates

select = node set-expression

mode = qname>

</xsl:apply-templates>


 

xsl:apply-templates用來(lái)執(zhí)行那一個(gè)節(jié)點(diǎn)被模板具體處理。你可以將它理解為程序中調(diào)用子函數(shù)。select屬性用來(lái)定義確切的節(jié)點(diǎn)名稱。xsl:apply-templates總是包含在xsl:template元素中,象這樣:


 

<xsl:template match="/">

<xsl:apply-templates select="para"/>

</xsl:template>


 

這段代碼說(shuō)明摸板匹配整個(gè)文檔(根節(jié)點(diǎn)),具體執(zhí)行時(shí)處理根節(jié)點(diǎn)下所有para元素。


 

<xsl:template match="para">

<p><xsl:apply-templates/></p>

</xsl:template>


 

而這一段代碼則表示摸板匹配para節(jié)點(diǎn),所有para下的子元素都將被處理。

3.2 xsl:value-of


 

XSL:value-of用來(lái)將源文檔中元素的文本值寫到輸出文檔中。例如:

有一個(gè)個(gè)人資料的XML文檔:


 

<?xml version="1.0" encoding="iso-8859-1"?>

<PERSON>

<name>ajie</name>

<age>28</age>

</PERSON>


 

我如果想在輸出文檔中顯示上面這個(gè)XML源文檔中的name元素的值,可以這樣寫XSLT代碼:


 

<xsl:template match="PERSON">

<xsl:value-of select="name"/>

</xsl:template>


 

執(zhí)行后,你會(huì)看到"ajie"被單獨(dú)顯示出來(lái)。其中match="PERSON"定義摸板匹配PERSON節(jié)點(diǎn),xsl:value-of
語(yǔ)法說(shuō)明需要輸出一個(gè)節(jié)點(diǎn)的值,而select="name"則定義需要被輸出的元素為name??催@個(gè)過(guò)程是不是和數(shù)據(jù)庫(kù)里查詢一個(gè)人的名字很象?當(dāng)然,xsl:value-of查詢還有更多,更復(fù)雜的語(yǔ)法,因?yàn)槭巧婕皩ふ液投ㄎ坏墓δ?,我們?huì)放在后面的XPath語(yǔ)法中在仔細(xì)講解。

同樣功能的還有xsl:copy-of,用法一樣,就不重復(fù)解釋了。

3.3 xsl:for-each


 

xsl:for-each語(yǔ)法允許你循環(huán)處理被選擇的節(jié)點(diǎn)。例如:有一個(gè)含多個(gè)個(gè)人資料的XML文檔:


 

<?xml version="1.0" encoding="iso-8859-1"?>

<PEOPLE>

<PERSON>

<name>ajie</name>

<age>28</age>

</PERSON>

<PERSON>

<name>tom</name>

<age>24</age>

</PERSON>

<PERSON>

<name>miake</name>

<age>30</age>

</PERSON>

</PEOPLE>


 

我需要顯示所有人的姓名,則可以將XSLT代碼寫成:


 

<xsl:template match="PEOPLE">

<xsl:for-each select="child::PERSON">

<xsl:value-of select="name"/>

</ xsl:for-each>

</xsl:template>

3.4 xsl:if


 

xsl:if類似普通程序語(yǔ)言的if條件語(yǔ)句,允許設(shè)定節(jié)點(diǎn)滿足某個(gè)條件時(shí),被模板處理。xsl:if的語(yǔ)法格式為:


 

<xsl:if test=布爾表達(dá)式>

template body

</xsl:if>


 

例如:


 

<xsl:template match="PEOPLE">

<xsl:if test="@name">

<p><xsl:value-of select="@name"/></p>

</xsl:if>

</xsl:template>


 

這段代碼的意思是檢測(cè)PEOPLE節(jié)點(diǎn)下所有的元素,如果發(fā)現(xiàn)有<name>元素,則將<name>元素的值輸出。其中@符號(hào)是統(tǒng)配符,表示節(jié)點(diǎn)下所有的元素。

3.5 xsl:choose, xsl:when 和 xsl:otherwise


 

xsl:if語(yǔ)法沒(méi)有else的屬性。如果我們要進(jìn)行多項(xiàng)選擇,那么就要使用xsl:choose / xsl:when / xsl:otherwise系列流程控制語(yǔ)法了。具體的使用請(qǐng)看下面的XSL文件例子:


 

<xsl:template match="PEOPLE">

<xsl:choose>

<xsl:when test="@name = ‘a(chǎn)jie‘">

<B><xsl:value-of select="@name"/></B>

</xsl:when>

<xsl:when test="@name">

<I><xsl:value-of select="@name"/></I>

</xsl:when>

<xsl:otherwise>

No name available

</xsl:otherwise>

<xsl:choose>

</xsl:template>


 

說(shuō)明:首先在PEOPLE節(jié)點(diǎn)下尋找<name>屬性值為ajie的元素,如果找到,將ajie用粗體輸出;如果沒(méi)有發(fā)現(xiàn)值為ajie的<name>元素,則將所有的<name>元素的值都用斜體輸出;如果沒(méi)有發(fā)現(xiàn)任何<name>元素,則顯示"No
name available"。


 

3.6 xsl:sort


 

在XSLT中可以對(duì)XML源文檔的元素進(jìn)行重新排序,排序的語(yǔ)法就是xsl:sort。舉例:下面的代碼就是將文檔元素按name排序。


 

<xsl:template match="PEOPLE">

<xsl:apply-templates select="PERSON">

<xsl:sort select="@name"/>

</xsl:apply-templates>

</xsl:template>


 

以上是XSLT的元素的主要語(yǔ)法,還有很多其他的語(yǔ)法,例如:import, include, element, attribute, number, param等等語(yǔ)法,在這里就不一一解釋。我們的目的是讓您對(duì)XSLT的語(yǔ)法有基本的概念,理解XSLT作為一種轉(zhuǎn)換語(yǔ)言的強(qiáng)大功能。

Posted by 老冒 at 2005-08-14 16:17:29

4.XPath的語(yǔ)法

我們?cè)谇懊嬉呀?jīng)提到過(guò),XPath是用來(lái)幫助XSLT在XML源文檔中查找定位信息的語(yǔ)言。在實(shí)際使用過(guò)程中,XPath和XSLT總是混在一起使用,在上面一章的語(yǔ)法例子中我們已經(jīng)有使用到XPath的語(yǔ)法,只是沒(méi)有明確點(diǎn)出。但W3C將它們分成兩個(gè)標(biāo)準(zhǔn),所以我們也將它們拆成兩章來(lái)講解。

4.XPath的語(yǔ)法

4.1 當(dāng)前位置
4.2 尋址操作
4.3 運(yùn)算符
4.4 功能函數(shù)

4.1 當(dāng)前位置

當(dāng)我們使用XSLT處理XML源文檔是,我們用Context來(lái)表示當(dāng)前正在被模板處理的節(jié)點(diǎn)位置。比如xsl:template match="/"語(yǔ)句中表示Context在文檔的根(root)節(jié)點(diǎn)。我不知道如何準(zhǔn)確的翻譯Context這個(gè)詞,它類似于C語(yǔ)言里的指針,表示程序當(dāng)前運(yùn)行的位置。理解Context對(duì)于正確處理XSL模板非常重要,當(dāng)您的XSL模板輸出的文檔和您想要的不一樣,最先應(yīng)該分析的就是Context在哪里。
Location Paths是用于設(shè)定你想要尋找的Context節(jié)點(diǎn)位置。就類似DOS的目錄命令。我們看個(gè)例子

<xsl:for-each select="child::PEOPLE/descendant::PERSON">

其中child::PEOPLE/descendant::PERSON就是XPath語(yǔ)法,這個(gè)表達(dá)式就是一個(gè)Location Paths,代碼說(shuō)明要顯示所有PEOPLE元素的子元素和所有PERSON元素的子元素。通常我們會(huì)采用更簡(jiǎn)單的寫法:

<xsl:for-each select="PEOPLE//PERSON">

我們來(lái)解釋path的兩種表示方法:"/"和"http://"。
"/"是表示當(dāng)前文檔的節(jié)點(diǎn),類似DOS目錄分割符。例如:/PEOPLE表示選擇根節(jié)點(diǎn)下的PEOPLE元素;PEOPLE/PERSON表示選擇PEOPLE元素下所有的PESON子元素。
"http://"則表示當(dāng)前文檔所有的節(jié)點(diǎn)。類似查看整個(gè)目錄。例如://PEOPLE表示選擇文檔中所有的PEOPLE元素,無(wú)論它在什么層次;PEOPLE//PERSON表示在PEOPLE元素下所有的PERSON元素,無(wú)論它的層次多深。

4.2 尋址操作

Axis和Predicate是XPath語(yǔ)法中對(duì)Location Paths進(jìn)行定位操作的語(yǔ)法,具體的用法列表如下

Axis語(yǔ)法表
--------------------------------------------------------
表達(dá)式 簡(jiǎn)寫 說(shuō)明
--------------------------------------------------------
self . 選擇當(dāng)前的節(jié)點(diǎn).。
例子 :
<TD><xsl:value-of select="."/></TD>
代碼表示在當(dāng)前位置插入當(dāng)前的節(jié)點(diǎn)包含的文本(text)值,
--------------------------------------------------------
parent .. 選擇當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。
--------------------------------------------------------
attribute @ 選擇一個(gè)元素的所有屬性。
例子:
<TD><xsl:value-of select="@PERSONID"/></TD>
選擇PERSON元素的所有屬性.
--------------------------------------------------------
child 選擇當(dāng)前節(jié)點(diǎn)的所有子元素。
--------------------------------------------------------
ancestor 選擇當(dāng)前節(jié)點(diǎn)的所有父元素(包括父元素的父元素,類推)
--------------------------------------------------------

Axis幫助我們選擇當(dāng)前節(jié)點(diǎn)周圍所有的節(jié)點(diǎn),而Predicate則用來(lái)定位當(dāng)前節(jié)點(diǎn)內(nèi)部的元素。表示方法為方括號(hào)[]中加表達(dá)式:[ Expression ]。具體舉例如下:

PERSON[position()=2]
這句代碼表示尋找第二個(gè)"PERSON" 元素

PERSON[starts-with(name, "B")]
這句代碼表示尋找所有名稱以"B"開頭的PERSON元素。

4.3 運(yùn)算符

這一節(jié)介紹XPath的運(yùn)算符(Expressions),列表如下:
--------------------------------------------------------
運(yùn)算符 說(shuō)明
--------------------------------------------------------
and, or 就是普通意義的and, or
--------------------------------------------------------
= 等于
--------------------------------------------------------
!= 不等于
--------------------------------------------------------
>, >= 大于,大于等于
--------------------------------------------------------
<, <= 小于,小于等于。注意:在XSL文件中,<符號(hào)要用< 表示
--------------------------------------------------------
+, -, *, div 加減乘除
--------------------------------------------------------
mod 取模
--------------------------------------------------------
| 兩個(gè)節(jié)點(diǎn)一起計(jì)算
--------------------------------------------------------

4.4 功能函數(shù)(Functions)

在XPath里有很多功能函數(shù)可以幫助我們精確尋找需要的節(jié)點(diǎn)。

count()功能
作用:統(tǒng)計(jì)計(jì)數(shù),返回符合條件的節(jié)點(diǎn)的個(gè)數(shù)。
舉例:<p><xsl:value-of select="count(PERSON[name=tom])"/></p>
說(shuō)明:代碼的用途是顯示PERSON元素中姓名屬性值為tom有幾個(gè)。

number()功能
作用:將屬性的值中的文本轉(zhuǎn)換為數(shù)值。
舉例:<p>The number is: <xsl:value-of select="number(book/price)"/></p>
說(shuō)明:代碼的用途是顯示書的價(jià)格。

substring() 功能
語(yǔ)法:substring(value, start, length)
作用:截取字符串。
舉例:<p><xsl:value-of select="substring(name, 1, 3)"/></p>
說(shuō)明:代碼的用途是截取name元素的值,從第一個(gè)字母開始顯示到第三個(gè)。

sum()功能
作用:求和。
舉例:<p>Total Price = <xsl:value-of select="sum(//price)"/></p>
說(shuō)明:代碼的用途是計(jì)算所有價(jià)格的和。

上面這些功能只是XPath語(yǔ)法中的一部分,還有大量的功能函數(shù)沒(méi)有介紹,而且目前XPath的語(yǔ)法仍然在不斷發(fā)展中。通過(guò)這些函數(shù)我們可以實(shí)現(xiàn)更加復(fù)雜的查詢和操作。

看到這里,我們的入門教程就快結(jié)束了。通過(guò)走馬觀花式的快速學(xué)習(xí),希望大家對(duì)XSLT應(yīng)該有了一點(diǎn)基本概念:XSLT是一種轉(zhuǎn)換XML文檔的語(yǔ)言,它包含兩個(gè)過(guò)程:轉(zhuǎn)換和格式化。XSLT的功能比CSS強(qiáng)大得多,它有類似數(shù)據(jù)查詢的語(yǔ)法。如果您對(duì)XSLT感興趣,那么以上的知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,需要查詢更多的資料。阿捷在最后一章附錄為大家提供了主要的XSLT資源。

4.4 功能函數(shù)(Functions)

在XPath里有很多功能函數(shù)可以幫助我們精確尋找需要的節(jié)點(diǎn)。

count()功能
作用:統(tǒng)計(jì)計(jì)數(shù),返回符合條件的節(jié)點(diǎn)的個(gè)數(shù)。
舉例:<p><xsl:value-of select="count(PERSON[name=tom])"/></p>
說(shuō)明:代碼的用途是顯示PERSON元素中姓名屬性值為tom有幾個(gè)。

number()功能
作用:將屬性的值中的文本轉(zhuǎn)換為數(shù)值。
舉例:<p>The number is: <xsl:value-of select="number(book/price)"/></p>
說(shuō)明:代碼的用途是顯示書的價(jià)格。

substring() 功能
語(yǔ)法:substring(value, start, length)
作用:截取字符串。
舉例:<p><xsl:value-of select="substring(name, 1, 3)"/></p>
說(shuō)明:代碼的用途是截取name元素的值,從第一個(gè)字母開始顯示到第三個(gè)。

sum()功能
作用:求和。
舉例:<p>Total Price = <xsl:value-of select="sum(//price)"/></p>
說(shuō)明:代碼的用途是計(jì)算所有價(jià)格的和。

上面這些功能只是XPath語(yǔ)法中的一部分,還有大量的功能函數(shù)沒(méi)有介紹,而且目前XPath的語(yǔ)法仍然在不斷發(fā)展中。通過(guò)這些函數(shù)我們可以實(shí)現(xiàn)更加復(fù)雜的查詢和操作。

看到這里,我們的入門教程就快結(jié)束了。通過(guò)走馬觀花式的快速學(xué)習(xí),希望大家對(duì)XSLT應(yīng)該有了一點(diǎn)基本概念:XSLT是一種轉(zhuǎn)換XML文檔的語(yǔ)言,它包含兩個(gè)過(guò)程:轉(zhuǎn)換和格式化。XSLT的功能比CSS強(qiáng)大得多,它有類似數(shù)據(jù)查詢的語(yǔ)法。如果您對(duì)XSLT感興趣,那么以上的知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,需要查詢更多的資料。阿捷在最后一章附錄為大家提供了主要的XSLT資源。

Posted by 老冒 at 2005-08-14 16:19:14


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多