XSLT輕松入門(mén)第三章:XSLT的元素語(yǔ)法
通過(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è)類(lèi),或者一個(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ǔ)句寫(xiě)法說(shuō)明模板匹配所有的para元素
<xsl:template match="para">
</xsl:template>
下面的語(yǔ)句寫(xiě)法說(shuō)明模板匹配所有的para元素和所有的chapter元素:
<xsl:template match="(chapter|para)">
</xsl:template>
下面的語(yǔ)句寫(xiě)法說(shuō)明模板匹配所有的父節(jié)點(diǎn)為chapter元素的para元素:
<xsl:template match="chapter//para">
</xsl:template>
下面的語(yǔ)句寫(xiě)法說(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)將源文檔中元素的文本值寫(xiě)到輸出文檔中。例如:
有一個(gè)個(gè)人資料的XML文檔:
<?xml version="1.0" encoding="iso-8859-1"?>
<PERSON>
<name>ajie</name>
<age>28</age>
</PERSON>
我如果想在輸出文檔中顯示上面這個(gè)XML源文檔中的name元素的值,可以這樣寫(xiě)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代碼寫(xiě)成:
<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類(lèi)似普通程序語(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 = 'ajie'">
<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)大功能。
相關(guān)文章
XSL簡(jiǎn)明教程(4)在服務(wù)器端的實(shí)現(xiàn)
XSL簡(jiǎn)明教程(4)在服務(wù)器端的實(shí)現(xiàn)...2006-10-10XML輕松學(xué)習(xí)手冊(cè)(2)XML概念
XML輕松學(xué)習(xí)手冊(cè)(2)XML概念...2006-10-10XML輕松學(xué)習(xí)手冊(cè)(三):XML的術(shù)語(yǔ)
XML輕松學(xué)習(xí)手冊(cè)(三):XML的術(shù)語(yǔ)...2006-10-10XML創(chuàng)建可排序、分頁(yè)的數(shù)據(jù)顯示頁(yè)面
XML創(chuàng)建可排序、分頁(yè)的數(shù)據(jù)顯示頁(yè)面...2006-10-10用XML數(shù)據(jù)島結(jié)合Dom制作通訊錄
用XML數(shù)據(jù)島結(jié)合Dom制作通訊錄...2006-10-10使用PHP DOM-XML創(chuàng)建和解析XML文件
使用PHP DOM-XML創(chuàng)建和解析XML文件...2006-10-10