XPath通俗教程

XPath通俗教程

出處:http://www.zvon.org/xxl/XPath...html

實例 1

基本的XPath語法相似於在一個文件系統中定位文件,若是路徑以斜線 / 開始, 那麼該路徑就表示到一個元素的絕對路徑函數

選擇根元素AAA,/AAAspa

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

選擇AAA的全部CCC子元素/AAA/CCCcode

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

選擇AAA的子元素DDD的全部子元素/AAA/DDD/BBBorm

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

實例 2

若是路徑以雙斜線 // 開頭, 則表示選擇文檔中全部知足雙斜線//以後規則的元素(不管層級關係)htm

選擇全部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/*get

<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>

選擇全部的有3個祖先元素的BBB元素/*/*/*/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子元素/AAA/BBB[1]

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

選擇AAA的最後一個BBB子元素/AAA/BBB[last()]

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

實例 5

選擇全部的id屬性//@id

<AAA>
    <BBB id="b1" />
    <BBB id="b2" />
    <BBB name="bbb" />
    <BBB/>
</AAA>

選擇有id屬性的BBB元素//BBB[@id]

<AAA>
    <BBB id="b1" />
    <BBB id="b2" />
    <BBB name="bbb" />
    <BBB/>
</AAA>

選擇有name屬性的BBB元素//BBB[@name]

<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元素//BBB[not(@*)]

<AAA>
    <BBB id="b1" />
    <BBB id="b2" />
    <BBB name="bbb" />
    <BBB/>
</AAA>

實例 6

屬性的值能夠被用來做爲選擇的準則, normalize-space函數刪除了前部和尾部的空格, 而且把連續的空格串替換爲一個單一的空格

選擇含有屬性id且其值爲'b1'的BBB元素//BBB[@id='b1']

<AAA>
    <BBB id="b1" />
    <BBB name=" bbb " />
    <BBB name="bbb" />
</AAA>

選擇含有屬性name且其值爲'bbb'的BBB元素//BBB[@name='bbb']

<AAA>
    <BBB id="b1" />
    <BBB name=" bbb " />
    <BBB name="bbb" />
</AAA>

選擇含有屬性name且其值(在用normalize-space函數去掉先後空格後)爲'bbb'的BBB元素//BBB[normalize-space(@name)='bbb']

<AAA>
    <BBB id="b1" />
    <BBB name=" bbb " />
    <BBB name="bbb" />
</AAA>

實例 7

count()函數能夠計數所選元素的個數

選擇含有2個BBB子元素的元素//*[count(BBB)=2]

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

選擇含有2個子元素的元素//*[count(*)=2]

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

選擇含有3個子元素的元素//*[count(*)=3]

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

實例 8

name()函數返回元素的名稱, start-with()函數在該函數的第一個參數字符串是以第二個參數字符開始的狀況返回true, contains()函數當其第一個字符串參數包含有第二個字符串參數時返回true.

選擇全部名稱爲BBB的元素(這裏等價於//BBB)//*[name()='BBB']

<AAA>
    <BCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </BCC>
    <DDB>
        <BBB/>
        <BBB/>
    </DDB>
    <BEC>
        <CCC/>
        <DBD/>
    </BEC>
</AAA>

選擇全部名稱以"B"起始的元素//*[starts-with(name(),'B')]

<AAA>
    <BCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </BCC>
    <DDB>
        <BBB/>
        <BBB/>
    </DDB>
    <BEC>
        <CCC/>
        <DBD/>
    </BEC>
</AAA>

選擇全部名稱包含"C"的元素//*[contains(name(),'C')]

<AAA>
    <BCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </BCC>
    <DDB>
        <BBB/>
        <BBB/>
    </DDB>
    <BEC>
        <CCC/>
        <DBD/>
    </BEC>
</AAA>

實例 9

string-length函數返回字符串的字符數,你應該用<替代<, 用>代替>

選擇名字長度爲3的元素//*[string-length(name()) = 3]

<AAA>
    <Q/>
    <SSSS/>
    <BB/>
    <CCC/>
    <DDDDDDDD/>
    <EEEE/>
</AAA>

選擇名字長度小於3的元素//*[string-length(name()) < 3]

<AAA>
    <Q/>
    <SSSS/>
    <BB/>
    <CCC/>
    <DDDDDDDD/>
    <EEEE/>
</AAA>

選擇名字長度大於3的元素選擇名字長度大於3的元素

<AAA>
    <Q/>
    <SSSS/>
    <BB/>
    <CCC/>
    <DDDDDDDD/>
    <EEEE/>
</AAA>

實例 10

多個路徑能夠用分隔符 | 合併在一塊兒

選擇全部的CCC和BBB元素//CCC | //BBB

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

選擇全部的BBB元素和全部是AAA的子元素的EEE元素/AAA/EEE | //BBB

<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)包含上下文節點的子元素, 做爲默認的軸,能夠忽略不寫.

等價於 /child::AAA/AAA

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

等價於/AAA/child::AAA

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

等價於/child::AAA/child::BBB/AAA/BBB

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

等價於/AAA/BBB/child::AAA/child::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的全部後代元素/AAA/BBB/descendant::*

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

選擇在祖先元素中有CCC的全部元素//CCC/descendant::*

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

選擇全部以CCC爲祖先元素的DDD元素//CCC/descendant::DDD

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

實例 13

parent軸(axis)包含上下文節點的父節點, 若是有父節點的話

選擇DDD元素的全部父節點//DDD/parent::*

<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元素的祖先節點//FFF/ancestor::*

<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元素//BBB[position() mod 2 = 0 ]

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

選擇中間的BBB元素//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]

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

選擇中間的CCC元素//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]

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

XPath

相關文章
相關標籤/搜索