2010-03-30 84 views
2

我正在嘗試遍歷可能嵌套的XML文檔中的一些元素,但是當我遍歷它們時,我可能會從樹中刪除一些元素。我在考慮最好的方法是遞歸執行此操作,所以我試圖創建一個XPath查詢來選擇所有相對於當前節點的頂級節點。 // foo [not(ancestor :: foo)]在文檔級別上效果很好,但我試圖弄清楚如何從相對查詢中做到這一點。XPath查詢 - 選擇相關的頂級節點

<foo id="1"> 
    <foo id="2" /> 
    <foo id="3"> 
     <foo id="4"> 
      <bar> 
       <foo id="5"> 
        <foo id="6" /> 
       </foo> 
       <foo id="7" /> 
      </bar> 
     </foo> 
    </foo> 
</foo> 

如果當前節點是foo#3,我只想選擇foo#4。當前節點是foo#4時,我只想選擇foo#5和foo#7。

我想我試圖選擇當前節點的任何後代foo節點,但沒有任何祖先節點之間的當前節點和我選擇的節點之間。我的難題是,如果我們已經在foo節點中,而不是(ancestor :: foo)不起作用。

+0

你有沒有得到一個答案呢? – 2012-12-29 06:06:51

+0

我想我找到了一個不同的解決方案。我一直沒有在這個項目上一年多,所以不知道我最終做了什麼...... – John 2013-02-15 19:01:29

回答

0

從繁忙遍歷的集合/枚舉中刪除項目的最佳方法是將鍵/引用加載到單獨列表中,並在完成遍歷後將其刪除。

1

給定起始元素的id,你可以找到它的下一級foo。

./descendant::foo[ancestor::foo[1]/@id='3'] 
+0

如何做到這一點,但沒有指定id屬性(只依賴當前節點)? – johnnyno 2014-11-25 16:01:31