當(dāng)前位置
當(dāng)我們使用XSLT處理XML源文檔是,我們用Context來表示當(dāng)前正在被模板處理的節(jié)點位置。比如xsl:template match="/"語句中表示Context在文檔的根(root)節(jié)點。我不知道如何準(zhǔn)確的翻譯Context這個詞,它類似于C語言里的指針,表示程序當(dāng)前運行的位置。理解Context對于正確處理XSL模板非常重要,當(dāng)您的XSL模板輸出的文檔和您想要的不一樣,最先應(yīng)該分析的就是Context在哪里。
Location Paths是用于設(shè)定你想要尋找的Context節(jié)點位置。就類似DOS的目錄命令。我們看個例子
<xsl:for-each select="child::PEOPLE/descendant::PERSON">
其中child::PEOPLE/descendant::PERSON就是XPath語法,這個表達(dá)式就是一個Location Paths,代碼說明要顯示所有PEOPLE元素的子元素和所有PERSON元素的子元素。通常我們會采用更簡單的寫法:
<xsl:for-each select="PEOPLE//PERSON"> 我們來解釋path的兩種表示方法:"/"和"http://"。 "/"是表示當(dāng)前文檔的節(jié)點,類似DOS目錄分割符。 例如: /PEOPLE表示選擇根節(jié)點下的PEOPLE元素; PEOPLE/PERSON表示選擇PEOPLE元素下所有的PESON子元素。 "http://"則表示當(dāng)前文檔所有的節(jié)點。類似查看整個目錄。 例如: //PEOPLE表示選擇文檔中所有的PEOPLE元素,無論它在什么層次; PEOPLE//PERSON表示在PEOPLE元素下所有的PERSON元素,無論它的層次多深。
尋址操作
Axis和Predicate是XPath語法中對Location Paths進行定位操作的語法,具體的用法列表如下
Axis語法表 -------------------------------------------------------- 表達(dá)式 簡寫 說明 -------------------------------------------------------- self . 選擇當(dāng)前的節(jié)點.。 例子 : <TD><xsl:value-of select="."/></TD> 代碼表示在當(dāng)前位置插入當(dāng)前的節(jié)點包含的文本(text)值, -------------------------------------------------------- parent .. 選擇當(dāng)前節(jié)點的父節(jié)點。 -------------------------------------------------------- attribute @ 選擇一個元素的所有屬性。 例子: <TD><xsl:value-of select="@PERSONID"/></TD> 選擇PERSON元素的所有屬性. -------------------------------------------------------- child 選擇當(dāng)前節(jié)點的所有子元素。 -------------------------------------------------------- ancestor 選擇當(dāng)前節(jié)點的所有父元素(包括父元素的父元素,類推) --------------------------------------------------------
Axis幫助我們選擇當(dāng)前節(jié)點周圍所有的節(jié)點,而Predicate則用來定位當(dāng)前節(jié)點內(nèi)部的元素。表示方法為方括號[]中加表達(dá)式:[ Expression ]。具體舉例如下:
PERSON[position()=2] 這句代碼表示尋找第二個"PERSON" 元素 PERSON[starts-with(name, "B")] 這句代碼表示尋找所有名稱以"B"開頭的PERSON元素。
運算符
這一節(jié)介紹XPath的運算符(Expressions),列表如下:
-------------------------------------------------------- 運算符 說明 -------------------------------------------------------- and, or 就是普通意義的and, or -------------------------------------------------------- = 等于 -------------------------------------------------------- != 不等于 -------------------------------------------------------- >, >= 大于,大于等于 -------------------------------------------------------- <, <= 小于,小于等于。注意:在XSL文件中,<符號要用< 表示 -------------------------------------------------------- +, -, *, div 加減乘除 -------------------------------------------------------- mod 取模 -------------------------------------------------------- | 兩個節(jié)點一起計算 --------------------------------------------------------
功能函數(shù)(Functions)
在XPath里有很多功能函數(shù)可以幫助我們精確尋找需要的節(jié)點。
count()功能 作用:統(tǒng)計計數(shù),返回符合條件的節(jié)點的個數(shù)。 舉例:<p><xsl:value-of select="count(PERSON[name=tom])"/></p> 說明:代碼的用途是顯示PERSON元素中姓名屬性值為tom有幾個。 number()功能 作用:將屬性的值中的文本轉(zhuǎn)換為數(shù)值。 舉例:<p>The number is: <xsl:value-of select="number(book/price)"/></p> 說明:代碼的用途是顯示書的價格。 substring() 功能 語法:substring(value, start, length) 作用:截取字符串。 舉例:<p><xsl:value-of select="substring(name, 1, 3)"/></p> 說明:代碼的用途是截取name元素的值,從第一個字母開始顯示到第三個。 sum()功能 作用:求和。 舉例:<p>Total Price = <xsl:value-of select="sum(//price)"/></p> 說明:代碼的用途是計算所有價格的和。
normalize-space()刪除了前部和尾部的空格
//BBB[normalize-space(@name)='bbb']------
選擇含有屬性
name
且其值
(
在用
normalize-space
函數(shù)去掉前后空格后
)
為
'bbb'
的
BBB
元素
name()
函數(shù)返回元素的名稱
//*[name()='BBB']----選擇所有名稱為BBB的元素(這里等價于//BBB)
start-with()
函數(shù)在該函數(shù)的第一個參數(shù)字符串是以第二個參數(shù)字符開始的情況返回
true
//*[starts-with(name(),'B')]-----選擇所有名稱以"B"起始的元素
contains()
函數(shù)當(dāng)其第一個字符串參數(shù)包含有第二個字符串參數(shù)時返回
true.
//*[contains(name(),'C')]-----選擇所有名稱包含"C"的元素
多個路徑可以用分隔符
|
合并在一起,可以合并的路徑數(shù)目沒有限制
//CCC | //BBB-----選擇所有的CCC和BBB元素
/AAA/EEE | //BBB---
選擇所有的
BBB
元素和所有是
AAA
的子元素的
EEE
元素
<AAA>
<
BBB
/>
<CCC/>
<DDD>
<CCC/>
</DDD>
<
EEE
/>
</AAA>
child
軸
(axis)
包含上下文節(jié)點的子元素
,
作為默認(rèn)的軸
,
可以忽略不寫
.
/AAA----等價于 /child::AAA
/AAA/BBB----等價于/child::AAA/child::BBB
二者都可以被合并----/child::AAA/BBB
descendant (后代)軸包含上下文節(jié)點的后代,一個后代是指子節(jié)點或者子節(jié)點的子節(jié)點等等, 因此descendant軸不會包含屬性和命名空間節(jié)點.
/descendant::*-----選擇文檔根元素的所有后代.即所有的元素被選擇
/AAA/BBB/descendant::*-----選擇/AAA/BBB的所有后代元素
//CCC/descendant::*----選擇在祖先元素中有CCC的所有元素
//CCC/descendant::DDD----選擇所有以CCC為祖先元素的DDD元素
<AAA>
<BBB>
<DDD>
<CCC>
<DDD/>
<EEE/>
</CCC>
</DDD>
</BBB>
<CCC>
<DDD>
<EEE>
<DDD>
<FFF/>
</DDD>
</EEE>
</DDD>
</CCC>
</AAA>
parent
軸
(axis)
包含上下文節(jié)點的父節(jié)點
,
如果有父節(jié)點的話
//DDD/parent::*---選擇DDD元素的所有父節(jié)點
ancestor軸(axis)包含上下節(jié)點的祖先節(jié)點, 該祖先節(jié)點由其上下文節(jié)點的父節(jié)點以及父節(jié)點的父節(jié)點等等諸如此類的節(jié)點構(gòu)成,所以ancestor軸總是包含有根節(jié)點,除非上下文節(jié)點就是根節(jié)點本身.
/AAA/BBB/DDD/CCC/EEE/ancestor::*----選擇一個絕對路徑上的所有節(jié)點
<
AAA
>
<
BBB
>
<
DDD
>
<
CCC
>
<DDD/>
<EEE/>
</
CCC
>
</
DDD
>
</
BBB
>
<CCC>
<DDD>
<EEE>
<DDD>
<FFF/>
</DDD>
</EEE>
</DDD>
</CCC>
</
AAA
>
//FFF/ancestor::*-----
選擇
FFF
元素的祖先節(jié)點
following-sibling
軸
(axis)
包含上下文節(jié)點之后的所有兄弟節(jié)點
/AAA/BBB/following-sibling::*
//CCC/following-sibling::*
preceding-sibling
軸
(axis)
包含上下文節(jié)點之前的所有兄弟節(jié)點
/AAA/XXX/preceding-sibling::*
//CCC/preceding-sibling::*
<AAA>
<BBB>
<CCC/>
<DDD/>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>
following
軸
(axis)
包含同一文檔中按文檔順序位于上下文節(jié)點之后的所有節(jié)點
,
除了祖先節(jié)點
,
屬性節(jié)點和命名空間節(jié)點
/AAA/XXX/following::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<EEE/>
</ZZZ>
<FFF>
<GGG/>
</FFF>
</BBB>
<XXX>
<DDD>
<CCC/>
</DDD>
</XXX>
<
CCC
>
<
DDD
/>
</
CCC
>
</AAA>
//ZZZ/following::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
<DDD>
<EEE/>
</DDD>
</ZZZ>
<FFF>
<GGG/>
</FFF>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>
preceding
軸
(axis)
包含同一文檔中按文檔順序位于上下文節(jié)點之前的所有節(jié)點
,
除了祖先節(jié)點
,
屬性節(jié)點和命名空間節(jié)點
/AAA/XXX/preceding::*
<AAA>
<
BBB
>
<
CCC
/>
<
ZZZ
>
<
DDD
/>
</
ZZZ
>
</
BBB
>
<XXX>
<DDD>
<EEE/>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>
//GGG/preceding::*
<AAA>
<BBB>
<CCC/>
<ZZZ>
<DDD/>
</ZZZ>
</BBB>
<XXX>
<DDD>
<EEE/>
<DDD/>
<CCC/>
<FFF/>
<FFF>
<GGG/>
</FFF>
</DDD>
</XXX>
<CCC>
<DDD/>
</CCC>
</AAA>
descendant-or-self
軸
(axis)
包含上下文節(jié)點本身和該節(jié)點的后代節(jié)點
/AAA/XXX/descendant-or-self::*
ancestor-or-self
軸
(axis)
包含上下文節(jié)點本身和該節(jié)點的祖先節(jié)點
/AAA/XXX/DDD/EEE/ancestor-or-self::*
div
運算符做浮點除法運算
mod
運算符做求余運算
floor
函數(shù)返回不大于參數(shù)的最大整數(shù)
(
趨近于正無窮
)
ceiling
返回不小于參數(shù)的最小整數(shù)
(
趨近于負(fù)無窮
)
//BBB[position() mod 2 = 0 ]----
選擇偶數(shù)位置的
BBB
元素
//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]----
選擇中間的
BBB
元素
上面這些功能只是XPath語法中的一部分,還有大量的功能函數(shù)沒有介紹,而且目前XPath的語法仍然在不斷發(fā)展中。通過這些函數(shù)我們可以實現(xiàn)更加復(fù)雜的查詢和操作。
看到這里,我們的入門教程就快結(jié)束了。通過走馬觀花式的快速學(xué)習(xí),希望大家對XSLT應(yīng)該有了一點基本概念:XSLT是一種轉(zhuǎn)換XML文檔的語言,它包含兩個過程:轉(zhuǎn)換和格式化。XSLT的功能比CSS強大得多,它有類似數(shù)據(jù)查詢的語法。如果您對XSLT感興趣,那么以上的知識是遠(yuǎn)遠(yuǎn)不夠的,需要查詢更多的資料。在最后一章附錄為大家提供了主要的XSLT資源。