2010-03-30 56 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