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