2010-03-30 3 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 노드가없는 것으로 생각합니다. 내 수수께끼는 우리가 이미 foo 노드 안에 있다면, (ancestor :: foo) 도움이되지 않는다는 것입니다.

+0

답변을 얻었습니까? –

+0

다른 해결책을 찾았다 고 생각합니다. 나는 1 년 넘게이 프로젝트에 참여하지는 않았으므로, 내가 무엇을하고 있는지 잘 모르겠다. ... – John

답변

0

트래버스중인 모음/열거 형에서 항목을 제거 할 때 가장 좋은 방법은 별도의 목록에 키/참조를로드하고 순회를 완료 한 후 제거하는 것입니다.

1

시작 요소의 id가 주어지면 다음 레벨의 foo를 찾을 수 있습니다.

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

id 속성을 지정하지 않고 동일하게 수행하는 방법 (현재 노드에만 의존). – johnnyno