實例 1
基本的XPath語法類似於在一個文件系統中定位文件,如果路徑以斜線 / 開始, 那麼該路徑就表示到一個元素的絕對路徑
/AAA
|
選擇根元素AAA
|
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA>
|
/AAA/CCC
|
選擇AAA的所有CCC子元素
|
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA>
|
/AAA/DDD/BBB
|
選擇AAA的子元素DDD的所有子元素
|
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA>
|
實例 2
如果路徑以雙斜線 // 開頭, 則表示選擇文檔中所有滿足雙斜線//之後規則的元素(無論層級關係)
//BBB
|
選擇所有BBB元素
|
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC> </AAA>
|
//DDD/BBB
|
選擇所有父元素是DDD的BBB元素
|
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC> </AAA>
|
實例 3
星號 * 表示選擇所有由星號之前的路徑所定位的元素
/AAA/CCC/DDD/*
|
選擇所有路徑依附於/AAA/CCC/DDD的元素
|
<AAA> <XXX> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </CCC> <CCC> <BBB> <BBB> <BBB/> </BBB> </BBB> </CCC> </AAA>
|
/*/*/*/BBB
|
選擇所有的有3個祖先元素的BBB元素
|
<AAA> <XXX> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </CCC> <CCC> <BBB> <BBB> <BBB/> </BBB> </BBB> </CCC> </AAA>
|
//*
|
選擇所有元素
|
<AAA> <XXX> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </CCC> <CCC> <BBB> <BBB> <BBB/> </BBB> </BBB> </CCC> </AAA>
|
實例 4
方塊號裏的表達式可以進一步的指定元素, 其中數字表示元素在選擇集裏的位置, 而last()函數則表示選擇集中的最後一個元素.
/AAA/BBB[1]
|
選擇AAA的第一個BBB子元素
|
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA>
|
/AAA/BBB[last()]
|
選擇AAA的最後一個BBB子元素
|
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA>
|
實例 5
//@id
|
選擇所有的id屬性
|
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>
|
//BBB[@id]
|
選擇有id屬性的BBB元素
|
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>
|
//BBB[@name]
|
選擇有name屬性的BBB元素
|
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>
|
//BBB[@*]
|
選擇有任意屬性的BBB元素
|
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>
|
//BBB[not(@*)]
|
選擇沒有屬性的BBB元素
|
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA>
|
實例 6
屬性的值可以被用來作爲選擇的準則, normalize-space函數刪除了前部和尾部的空格, 並且把連續的空格串替換爲一個單一的空格
//BBB[@id='b1']
|
選擇含有屬性id且其值爲'b1'的BBB元素
|
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA>
|
//BBB[@name='bbb']
|
選擇含有屬性name且其值爲'bbb'的BBB元素
|
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA>
|
//BBB[normalize-space(@name)='bbb']
|
選擇含有屬性name且其值(在用normalize-space函數去掉前後空格後)爲'bbb'的BBB元素
|
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA>
|
實例 7
count()函數可以計數所選元素的個數
//*[count(BBB)=2]
|
選擇含有2個BBB子元素的元素
|
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA>
|
//*[count(*)=2]
|
選擇含有2個子元素的元素
|
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA>
|
//*[count(*)=3]
|
選擇含有3個子元素的元素
|
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA>
|
實例 8
name()函數返回元素的名稱, start-with()函數在該函數的第一個參數字符串是以第二個參數字符開始的情況返回true, contains()函數當其第一個字符串參數包含有第二個字符串參數時返回true.
//*[name()='BBB']
|
選擇所有名稱爲BBB的元素(這裏等價於//BBB)
|
<AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA>
|
//*[starts-with(name(),'B')]
|
選擇所有名稱以"B"起始的元素
|
<AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA>
|
//*[contains(name(),'C')]
|
選擇所有名稱包含"C"的元素
|
<AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA>
|
實例 10
多個路徑可以用分隔符 | 合併在一起
//CCC | //BBB
|
選擇所有的CCC和BBB元素
|
<AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA>
|
/AAA/EEE | //BBB
|
選擇所有的BBB元素和所有是AAA的子元素的EEE元素
|
<AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA>
|
/AAA/EEE | //DDD/CCC | /AAA | //BBB
|
可以合併的路徑數目沒有限制
|
<AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA>
|
實例 11
child軸(axis)包含上下文節點的子元素, 作爲默認的軸,可以忽略不寫.
/AAA
|
等價於 /child::AAA
|
<AAA> <BBB/> <CCC/> </AAA>
|
/child::AAA
|
等價於/AAA
|
<AAA> <BBB/> <CCC/> </AAA>
|
/AAA/BBB
|
等價於/child::AAA/child::BBB
|
<AAA> <BBB/> <CCC/> </AAA>
|
/child::AAA/child::BBB
|
等價於/AAA/BBB
|
<AAA> <BBB/> <CCC/> </AAA>
|
/child::AAA/BBB
|
二者都可以被合併
|
<AAA> <BBB/> <CCC/> </AAA>
|
實例 12
descendant (後代)軸包含上下文節點的後代,一個後代是指子節點或者子節點的子節點等等, 因此descendant軸不會包含屬性和命名空間節點.
/descendant::*
|
選擇文檔根元素的所有後代.即所有的元素被選擇
|
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>
|
/AAA/BBB/descendant::*
|
選擇/AAA/BBB的所有後代元素
|
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>
|
//CCC/descendant::*
|
選擇在祖先元素中有CCC的所有元素
|
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>
|
//CCC/descendant::DDD
|
選擇所有以CCC爲祖先元素的DDD元素
|
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>
|
實例 13
parent軸(axis)包含上下文節點的父節點, 如果有父節點的話
//DDD/parent::*
|
選擇DDD元素的所有父節點
|
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>
|
實例 14
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元素的祖先節點
|
<AAA> <BBB> <DDD> <CCC> <DDD/> <EEE/> </CCC> </DDD> </BBB> <CCC> <DDD> <EEE> <DDD> <FFF/> </DDD> </EEE> </DDD> </CCC> </AAA>
|
實例 15
following-sibling軸(axis)包含上下文節點之後的所有兄弟節點
/AAA/BBB/following-sibling::*
|
|
<AAA> <BBB> <CCC/> <DDD/> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
//CCC/following-sibling::*
|
|
<AAA> <BBB> <CCC/> <DDD/> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
實例 16
preceding-sibling 軸(axis)包含上下文節點之前的所有兄弟節點
/AAA/XXX/preceding-sibling::*
|
|
<AAA> <BBB> <CCC/> <DDD/> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
//CCC/preceding-sibling::*
|
|
<AAA> <BBB> <CCC/> <DDD/> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
實例 17
following軸(axis)包含同一文檔中按文檔順序位於上下文節點之後的所有節點, 除了祖先節點,屬性節點和命名空間節點
/AAA/XXX/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>
|
//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>
|
實例 18
preceding軸(axis)包含同一文檔中按文檔順序位於上下文節點之前的所有節點, 除了祖先節點,屬性節點和命名空間節點
/AAA/XXX/preceding::*
|
|
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </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>
|
實例 19
descendant-or-self 軸(axis)包含上下文節點本身和該節點的後代節點
/AAA/XXX/descendant-or-self::*
|
|
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
//CCC/descendant-or-self::*
|
|
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
實例 20
ancestor-or-self 軸(axis)包含上下文節點本身和該節點的祖先節點
/AAA/XXX/DDD/EEE/ancestor-or-self::*
|
|
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
//GGG/ancestor-or-self::*
|
|
<AAA> <BBB> <CCC/> <ZZZ> <DDD/> </ZZZ> </BBB> <XXX> <DDD> <EEE/> <DDD/> <CCC/> <FFF/> <FFF> <GGG/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
實例 21
ancestor, descendant, following, preceding 和self軸(axis)分割了XML文檔(忽略屬性節點和命名空間節點), 不能交迭, 而一起使用則包含所有節點
//GGG/ancestor::*
|
|
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
//GGG/descendant::*
|
|
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
//GGG/following::*
|
|
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
//GGG/preceding::*
|
|
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
//GGG/self::*
|
|
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*
|
|
<AAA> <BBB> <CCC/> <ZZZ/> </BBB> <XXX> <DDD> <EEE/> <FFF> <HHH/> <GGG> <JJJ> <QQQ/> </JJJ> <JJJ/> </GGG> <HHH/> </FFF> </DDD> </XXX> <CCC> <DDD/> </CCC> </AAA>
|
實例 22
div運算符做浮點除法運算, mod運算符做求餘運算, floor函數返回不大於參數的最大整數(趨近於正無窮), ceiling返回不小於參數的最小整數(趨近於負無窮)
//BBB[position() mod 2 = 0 ]
|
選擇偶數位置的BBB元素
|
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <CCC/> <CCC/> <CCC/> </AAA>
|
//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]
|
選擇中間的BBB元素
|
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <CCC/> <CCC/> <CCC/> </AAA>
|
//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]
|
選擇中間的CCC元素
|
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <BBB/> <CCC/> <CCC/> <CCC/> </AAA>
|
來自 :http://ipointer.cnblogs.com/archive/2005/10/20/258305.html