XPath教程——实例介绍<二>

本文详细介绍了XPath中的各种轴,包括descendant、parent、ancestor等轴的使用方法,并通过具体实例展示了如何选择XML文档中的不同节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

12、descendant (后代)轴包含上下文节点的后代,一个后代是指子节点或者子节点的子节点等等, 因此descendant轴不会包含属性和命名空间节点

(1)."/descendant::*"表示选择文档根元素的所有后代.即所有的元素被选择:

     <AAA>
          <
BBB>
               <
DDD>
                    <
CCC>
                         <
DDD/>
                         <
EEE/>
                    </
CCC>
               </
DDD>
          </
BBB>
          <
CCC>
               <
DDD>
                    <
EEE>
                         <
DDD>
                              <
FFF/>
                         </
DDD>
                    </
EEE>
               </
DDD>
          </
CCC>
     </
AAA>

(2)."/AAA/BBB/descendant::*"表示选择/AAA/BBB的所有后代元素

    <AAA>
          <BBB>
               <DDD>
                    <
CCC>
                         <
DDD/>
                         <
EEE/>
                    </
CCC>
               </
DDD>
          </BBB>
          <CCC>
               <DDD>
                    <EEE>
                         <DDD>
                              <FFF/>
                         </DDD>
                    </EEE>
               </DDD>
          </CCC>
     </AAA>

(3)."//CCC/descendant::*"表示选择CCC元素的所有子元素:

     <AAA>
          <BBB>
               <DDD>
                    <CCC>
                         <DDD/>
                         <
EEE/>
                    </CCC>
               </DDD>
          </BBB>
          <CCC>
               <DDD>
                    <
EEE>
                         <
DDD>
                              <
FFF/>
                         </
DDD>
                    </
EEE>
               </
DDD>
          </CCC>
     </AAA>

(4)."//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)包含上下文节点的父节点, 如果有父节点的话

(1)."//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轴总是包含有根节点,除非上下文节点就是根节点本身

(1)."/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>

(2)."//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)包含上下文节点之后的所有兄弟节点

(1)."/AAA/BBB/following-sibling::*":

     <AAA>
          <BBB>
               <CCC/>
               <DDD/>
          </BBB>
          <XXX>
               <DDD>
                    <EEE/>
                    <DDD/>
                    <CCC/>
                    <FFF/>
                    <FFF>
                         <GGG/>
                    </FFF>
               </DDD>
          </XXX>
          <CCC>
               <DDD/>
          </CCC>
     </AAA>

(2)."//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)包含上下文节点之前的所有兄弟节点

(1)."//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)包含同一文档中按文档顺序位于上下文节点之后的所有节点, 除了祖先节点,属性节点和命名空间节点

(1)."//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、descendant-or-self 轴(axis)包含上下文节点本身和该节点的后代节点

(1)."/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>

20、ancestor-or-self 轴(axis)包含上下文节点本身和该节点的祖先节点

(1)."/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>

21、ancestor, descendant, following, preceding 和self轴(axis)分割了XML文档(忽略属性节点和命名空间节点), 不能交迭, 而一起使用则包含所有节点

(1)."//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>

(2)."//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>

(3)."//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>

(4)."//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>

(5)."//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>

(6)."//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返回不小于参数的最小整数(趋近于负无穷)

(1)."//BBB[position() mod 2 = 0 ]"表示选择偶数位置的BBB元素:

 <AAA>
          <BBB/>
          <BBB/>
          <BBB/>
          <BBB/>
          <BBB/>
          <BBB/>
          <BBB/>
          <BBB/>
          <CCC/>
          <CCC/>
          <CCC/>
     </AAA>

(2)."//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>

(3)."//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://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值