2012-06-02 177 views
27

之間的所有元素我有一個下面的XML:的XPath選擇兩個特定元素

<doc> 
    <divider /> 
    <p>text</p> 
    <p>text</p> 
    <p>text</p> 
    <p>text</p> 
    <p>text</p> 
    <divider /> 
    <p>text</p> 
    <p>text</p> 
    <divider /> 
    <p>text</p> 
    <divider /> 
</doc> 

我想選擇第一分隔元件後所有的p節點,直到分頻器元件的下一次出現。我試着用下面的xpath:

//divider[1]/following-sibling::p[following::divider] 

但問題是它選擇所有p元素之前最後一個divider元素。我不知道如何使用XPath 1.

回答

24

概念相同bytebuster,但不同的XPath:

/*/p[count(preceding-sibling::divider)=1] 
+0

好主意! 'count'比較習慣,因爲'1'只使用一次。 – bytebuster

4

做關於選擇具有完全相同一個元素dividerpreceding-sibling所有p什麼?

//doc/p[preceding-sibling::divider[1] and not (preceding-sibling::divider[2])] 
14

這是一個普遍的XPath表達式

/*/divider[$k] 
    /following-sibling::p 
     [count(.|/*/divider[$k+1]/preceding-sibling::p) 
     = 
     count(/*/divider[$k+1]/preceding-sibling::p) 
     ] 

如果替代$k1則完全通緝選擇了p個節點。

如果替代$k2然後第二和第三divider,...等等之間的所有p元素

說明

這是Kayessian的XPath的一個簡單的應用程序1.0公式節點集交集:

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

se將屬於兩個的所有節點引導到節點集$ns1$ns2

在這種特定的情況下,我們代替$ns1有:

/*/divider[$k]/following-sibling::p 

,我們用替代$ns2

/*/divider[$k+1]/preceding-sibling::p 
+0

+1 Kayessian方法的很好的實現。 – Cylian

+0

@Cylian:不客氣。 –

4

我覺得有一個更簡單,也許更快的解決方案:你想要的所有前面的兄弟姐妹具有至少一個前面的兄弟分配器的第二分配器:

/doc/divider[2]/preceding-sibling::p[preceding-sibling::divider] 

當然,如果你想找到第二和第三個分隔線之間的分支,它會變得更復雜一點:那麼你想要更像Daniel Haley的解決方案。