2011-09-30 46 views
0

匹配時,我想創建一個XPath表達式,其導致成3個匹配項,其中MATCH1 = text1text1text,MATCH2 = text2text2text2等Xpath的 - 組作爲我有以下問題組合結果

我能找到每個單獨的,但我不能'分組'他們。

表達式應該說的是:「在[@ class =」random-a-tag「]後給我所有在每個元素之前存在的所有p標籤的文本,其中div [@id]」

<a class="random-a-tag"></a> 
<p>text1</p> 
<p>text1</p> 
<p>text1</p> 
<div id="1"></div> 
<p>text2</p> 
<p>text2</p> 
<p>text2</p> 
<div id="2"></div> 
<p>text3</p> 
<p>text3</p> 
<p>text3</p> 
<div id="3"></div> 

回答

2

您可以分兩步進行。

找到所有div

//a[@class="random-a-tag"]/following-sibling::div[@id] 

併爲每個DIV @id做:

//a[@class="random-a-tag"]/following-sibling::p[following-sibling::div[1][@id="3"]]/text() 
1

這不能用一個XPath 1.0表達式來完成。

可以選擇最是用於@id給定值設定的p:2

 /*/a/following-sibling::div 
     [@id=$pId] 
      /preceding-sibling::p 
      [count(. 
        | 
        /*/a/following-sibling::div 
            [@id=$pId] 
            /preceding-sibling::div[1] 
             /preceding-sibling::p 
        ) 
      = 
       count(/*/a/following-sibling::div 
            [@id=$pId] 
            /preceding-sibling::div[1] 
             /preceding-sibling::p 
        ) 
       +1 
      ] 

如果$pId(通過取代),和上述的XPath表達式應用於此XML文檔上(你的XML片段,包裹在頂部元件,使之良好的XML文檔):

<t> 
    <a class="random-a-tag"></a> 
    <p>text1</p> 
    <p>text1</p> 
    <p>text1</p> 
    <div id="1"></div> 
    <p>text2</p> 
    <p>text2</p> 
    <p>text2</p> 
    <div id="2"></div> 
    <p>text3</p> 
    <p>text3</p> 
    <p>text3</p> 
    <div id="3"></div> 
</t> 

那麼這個選擇下列節點

<p>text2</p> 
<p>text2</p> 
<p>text2</p> 

在我們使用的公知的Kayessian(由@邁克爾凱創建)公式節點集合相交上述XPath表達式:

$ns1[count(.|$ns2) = count($ns2)] 

是節點集$ns1$ns2的交叉點。

二,的XPath 2.0溶液

(a/following-sibling::div 
        [@id=$pId] 
        /preceding-sibling::p 
except 
    a/following-sibling::div 
        [@id=$pId] 
        /preceding-sibling::div[1] 
         /preceding-sibling::p 
)/string() 

當這個XPath 2.0表達式與相同的XML文檔(上述)評估和$pId爲2,則結果是完全所需文本

text2 text2 text2