2011-05-16 4 views
2

나는 특정 노드의 첫 번째 자손 인 조상이없는 노드를 얻는 xpath를 원한다.특정 조상을 가지고 있지 않은 노드를 얻는다. xml xpath

의 우리가이 같은 XML 문서가 있다고 가정하자

<a> 
    <b>This node</b> 
    <c> 
    <a> 
     <b>not this</b> 
     <g> 
     <b>not this</b> 
     </g> 
    </a> 
    <a> 
     <b>This node</b> 
     <c/> 
    </a> 
    </c> 
</a> 


<a> 
    <c> 
    <a> 
     <b>not this</b> 
    </a> 
    <a> 
     <b>This node</b> 
    </a> 
    <a> 
     <b>This node</b> 
    </a> 
    <a> 
     <b>This node</b> 
    </a> 
    </c> 
</a> 


<d> 
    <b>This node</b> 
</d> 

내가 그들의 조상 노드가없는 문서의 모든 B 노드를 선택하고 싶습니다 // A/C/A [1].

+0

이 형식은 올바른 형식의 XML 문서가 아닙니다. 그것은 심하게 기형입니다 !!! –

+0

정말 죄송합니다. 이제는 괜찮을 것입니다. – tach

+0

여전히 형식이 올바르지 않습니다. 올바른 형식의 XML 문서에는 정확히 하나의 최상위 요소가 있습니다. 질문에 당신은 세 가지 최상위 요소가 있습니다. –

답변

6

내가 그들의 조상 노드 //a/c/a[1]

사용이 XPath 식로하지 않아도 문서의 모든 B 노드를 선택하고 싶습니다 :

//b[not(ancestor::a 
      [parent::c[parent::a] 
      and 
       not(preceding-sibling::a) 
      ] 
     ) 
    ] 

이 선택을 모든 b 부모가없는 a 조상을 가지고 있지 않은 문서의 요소부모가 a 부모가 인 a 상위 항목이있는 상위은 상위의 하위 항목이 처음이 아니기 때문에 a입니다.

주어진 다음의 XML 문서 (제공된하지만 만든 기반으로 잘 구성도 선택해야 노드의 식별 텍스트)를 넣어 :

<t> 
    <a> 
     <b>This node 1</b> 
     <c> 
      <a> 
       <b>not this</b> 
       <g> 
        <b>not this</b> 
       </g> 
      </a> 
      <a> 
       <b>This node 2</b> 
       <c/> 
      </a> 
     </c> 
    </a> 
    <a> 
     <c> 
      <a> 
       <b>not this</b> 
      </a> 
      <a> 
       <b>This node 3</b> 
      </a> 
      <a> 
       <b>This node 4</b> 
      </a> 
      <a> 
       <b>This node 5</b> 
      </a> 
     </c> 
    </a> 
    <d> 
     <b>This node 6</b> 
    </d> 
</t> 

을 정확히 원 6 개 b 요소 가 선택됩니다.

인증는 XSLT를 사용 :이 변환은, 상기 XML 문서에 적용되어 정확하게 원하는 b 요소가 선택되고 출력 복사

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
<xsl:copy-of select= 
"//b[not(ancestor::a 
      [parent::c[parent::a] 
      and 
       not(preceding-sibling::a) 
      ] 
     ) 
    ] 

"/> 
</xsl:template> 
</xsl:stylesheet> 

. 원하는 올바른 결과가 생성됩니다. :

<b>This node 1</b> 
<b>This node 2</b> 
<b>This node 3</b> 
<b>This node 4</b> 
<b>This node 5</b> 
<b>This node 6</b> 
+0

와우, 고마워, 너는 내 목숨을 구했어! – tach

+0

@ tach : 안녕하십니까. –

관련 문제