2013-10-07 4 views
0

XPath 또는 XSLT에서 도움이 필요합니다.현재 노드에서 논리 상위 노드 ID 가져 오기

나는 둘 다 새로운 해요,하지만 지금은 내가 해결하기 위해 :)

을 나는이 처음에 간단하지만 많은 시도 후, 하드처럼 소리 사건을 해결해야 다음 (으로 단순화) XML.

첫째, "깨끗한"하나

<root> 
    <a> 
     <a1> 
      <a11> 
       <x1>111</x1> 
       <x2>222</x2> 
       <x3>333</x3> 
      </a11> 
     </a1> 
    </a> 
    <b> 
     <b1> 
      <b11> 
       <b111> 
        <x2>777</x2> 
        <x3>888</x3> 
       </b111> 
      </b11> 
     </b1> 
    </b> 
</root> 

그리고 두 번째, 같은 XML하지만 "논리적"ID 번호 추가로. 이 ID는 나중에 결과를 교차 검사하는 데 유용하며 물리적으로 XML에 존재하지 않습니다.

<root> 
1 <a> 
    1 <a1> 
     1 <a11> 
      1 <x1>111</x1> 
      2 <x2>222</x2> 
      3 <x3>333</x3> 
      </a11> 
     </a1> 
    </a> 
2 <b> 
    1 <b1> 
     1 <b11> 
      1 <b111> 
       1 <x2>777</x2> 
       2 <x3>888</x3> 
       </b111> 
      </b11> 
     </b1> 
    </b> 
</root> 

내 목표는 가 현재 노드의 논리 ID 번호를 검색하려면이며, 모든 현재의 노드부터 순서대로합니다 ('루트'노드를 제외한) 등 부모, 조부모 ...입니다 . 내 현재 노드 위치가 root/a/a1/a11/x2에있는 경우

는 예를 들어,이 같은 출력 비슷한을 생성하려면 :

출력 : (순서대로 왼쪽 2.1.1.1

에서 오른쪽으로) :

'2' = 'x2' node 
'1' = 'a11' node 
'1' = 'a1' node 
'1' = 'a' node 

지금, 내가 아는 모든 현재 노드 ID 번호를 받고 있으며이 XPath를 사용하여, 단지보다 한 단계 위에있는 부모의 :

count(./preceding-sibling::*) + 1 
count(../preceding-sibling::*) + 1 

그러나 나는 아직도 부모의 ID 번호가 나머지 (있는 경우)를 얻는 방법을 알 수 없습니다. XML의 노드 깊이 수준은 다양하고 대부분의 시간은 2 단계 이상이므로 그 가능성도 설명해야합니다.

제 질문에 대한 답변을 드리겠습니다.

누구나 해결책이 있으십니까? 너무 초보자를위한 도움이 될 것입니다 만약 당신이 너무 귀하의 솔루션에 대한 몇 가지 설명을 줄 수 있습니다 :)

고맙습니다.

답변

0

이 같은 노드의 모든 조상을 열거 할 ancestor-or-self 축을 사용할 수 있습니다

<xsl:for-each select="ancestor-or-self::*[position() &lt; last()]"> 
    <xsl:sort select="position()" data-type="number" order="descending"/> 
    <xsl:value-of select="count(preceding-sibling::*) + 1"/> 
    <xsl:if test="position() != last()">.</xsl:if> 
</xsl:for-each> 

를 노드 root/a/a1/a11/x2이 출력됩니다 2.1.1.1하십시오.

술어 [position() &lt; last()]은 루트 요소를 제외시키는 데 사용됩니다. xsl:sort은 조상을 역순으로 처리하는 데 사용됩니다.

+0

답변 해 주셔서 감사합니다. 이제 실제 데이터로 솔루션을 시험해 보겠습니다.나는 결과와 함께 곧 돌아올 것이다. –

+0

당신의 솔루션이 나를 위해 일했습니다. 내 실제 XML 데이터에 대해 테스트 한 후 코드를 수정하여 필요에 맞게 조정합니다. 고맙습니다. 아주 고맙습니다. 케이스가 닫힙니다. –

관련 문제