2011-09-28 2 views
1

이것은 내 XML 문서입니다. <w:tbl><w:tr> 내 위의 XML 파일 encounters.for, 그것은 <w:tbl> 내부에 두 개의 <w:tr> 노드가 때마다어떻게하면 xslt2.0을 사용하여 특정 태그를 읽는 동안 전역 변수를 증가시킬 수 있습니까?

<w:document xmlns:w="w"> 
<w:body> 
    <w:p> 
     <w:r> 
      <w:t> 
       Para1 
      </w:t> 
     </w:r> 
    </w:p> 
    <w:p> 
     <w:r> 
      <w:t> 
       Para2 
      </w:t> 
     </w:r> 
    </w:p> 
    <w:p> 
     <w:r> 
      <w:t> 
       Para3 
      </w:t> 
     </w:r> 
    </w:p> 
    <w:p> 
     <w:r> 
      <w:t> 
       Para4 
      </w:t> 
     </w:r> 
    </w:p> 
    <w:p> 
     <w:r> 
      <w:t> 
       Para5 
      </w:t> 
     </w:r> 
    </w:p> 

    <w:tbl> 
     <w:tr> 
      <w:tc> 
       <w:p> 
        <w:r> 
        <w:t> 
         Para6 
        </w:t> 
        </w:r> 
       </w:p> 
       </w:tc> 
      <w:tc> 
       <w:p> 
        <w:r> 
        <w:t> 
         Para7 
        </w:t> 
        </w:r> 
       </w:p> 
       </w:tc> 
      </w:tr> 
     </w:tbl> 
    <w:p> 
     <w:r> 
      <w:t> 
       Para8 
      </w:t> 
     </w:r> 
    </w:p> 
    <w:tbl> 
     <w:tr> 
      <w:tc> 
       <w:p> 
        <w:r> 
        <w:t> 
         Para9 
        </w:t> 
        </w:r> 
       </w:p> 
       </w:tc> 
      <w:tc> 
       <w:p> 
        <w:r> 
        <w:t> 
         Para10 
        </w:t> 
        </w:r> 
       </w:p> 
       </w:tc> 
      </w:tr> 
     </w:tbl> 
    <w:p> 
     <w:r> 
      <w:t> 
       Para11 
      </w:t> 
     </w:r> 
    </w:p> 
</w:body> 
</w:document> 

지금, 내 전역 변수를 증가합니다.

So, for example : 
       1. if my current node is Para8 then it's count will be 1. 
       2. if my current node is para11 then it's count will be 2. 

어떻게해야합니까?

+0

이 게시물 질문을 anwser한다 [1] : http://stackoverflow.com/questions/833118/in-xslt-how-do-i-increment-a-global-variable-from-a-different-scope –

답변

2

XSLT는 함수형 언어이며 모든 함수 언어에서 변수의 값인 한 세트는 업데이트 할 수 없습니다.. 변수를 업데이트하는 "능력"이 전혀 필요 없다는 것을 이해하기 위해서는 기능적 사고 방식을 시작하기위한 "패러다임 변화"가 필요합니다. 변수 알고리즘을 사용하는 모든 명령형 알고리즘에는 해당 함수 알고리즘 (모든 변수를 업데이트 할 필요가 없음)이 있습니다.

명령형보다 기능적 프로그래밍 스타일을 사용하면 기능적 프로그램이 읽고, 이해하고, 유지 관리하고, 정확하다고 증명하는 것이 훨씬 더 중요하다는 점에서 여러 가지 장점이 있습니다. 변수가 변경 가능하지 않기 때문에 컴파일러의 최적화 프로그램은 훨씬 더 적극적인 최적화를 수행 할 수 있으며 결과적으로 최적화되고 컴파일 된 프로그램이보다 효율적으로 최적화됩니다. 이러한 변화는 제공된 XML 문서에인가되는 경우

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:w="w"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:for-each select= 
     "//w:t 
     [contains(., 'Para8') 
     or 
      contains(., 'Para11') 
     ] 
    "> 
     <xsl:number level="any" count="w:tbl/w:tr"/> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

: 특히이 경우

은, 상기 요구 카운트를 얻기 위해 변수를 갱신 할 필요는 없다

<w:document xmlns:w="w"> 
    <w:body> 
     <w:p> 
      <w:r> 
       <w:t>    Para1    </w:t> 
      </w:r> 
     </w:p> 
     <w:p> 
      <w:r> 
       <w:t>    Para2    </w:t> 
      </w:r> 
     </w:p> 
     <w:p> 
      <w:r> 
       <w:t>    Para3    </w:t> 
      </w:r> 
     </w:p> 
     <w:p> 
      <w:r> 
       <w:t>    Para4    </w:t> 
      </w:r> 
     </w:p> 
     <w:p> 
      <w:r> 
       <w:t>    Para5    </w:t> 
      </w:r> 
     </w:p> 
     <w:tbl> 
      <w:tr> 
       <w:tc> 
        <w:p> 
         <w:r> 
          <w:t>       Para6      </w:t> 
         </w:r> 
        </w:p> 
       </w:tc> 
       <w:tc> 
        <w:p> 
         <w:r> 
          <w:t>       Para7      </w:t> 
         </w:r> 
        </w:p> 
       </w:tc> 
      </w:tr> 
     </w:tbl> 
     <w:p> 
      <w:r> 
       <w:t>    Para8    </w:t> 
      </w:r> 
     </w:p> 
     <w:tbl> 
      <w:tr> 
       <w:tc> 
        <w:p> 
         <w:r> 
          <w:t>       Para9      </w:t> 
         </w:r> 
        </w:p> 
       </w:tc> 
       <w:tc> 
        <w:p> 
         <w:r> 
          <w:t>       Para10      </w:t> 
         </w:r> 
        </w:p> 
       </w:tc> 
      </w:tr> 
     </w:tbl> 
     <w:p> 
      <w:r> 
       <w:t>    Para11    </w:t> 
      </w:r> 
     </w:p> 
    </w:body> 
</w:document> 

이 원하는 정확한 결과는을 생성됩니다

,691

<xsl:variable name="vMyCount"> 
    <xsl:number level="any" count="w:tbl/w:tr"/> 
</xsl:variable> 

그리고 당신은이를 사용할 수 있습니다 -이 값이 변수에 포함되어야 경우 363,210

1 2 

나중에 어딘가의 범위에서 사용할 수, 하나는 단순히로 변수를 정의합니다 동일한 정확한 결과 제조

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:w="w"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:for-each select= 
     "//w:t 
     [contains(., 'Para5') 
     or 
      contains(., 'Para8') 
     or 
      contains(., 'Para11') 
     ] 
    "> 
    <xsl:variable name="vMyCount"> 
     <xsl:number level="any" count="w:tbl/w:tr"/> 
    </xsl:variable> 
    <xsl:value-of select= 
     "concat($vMyCount, 
       substring('0', 1 + boolean(string($vMyCount))) 
      )"/> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

: 아래의 변환에서와 같이 가변 : [IN-XSLT-방법-DO-I-증가-A-글로벌 변수-에서-A-서로 다른 범위] [1] :

0 
1 
2 
+0

@_Dimitre Novatchev : 작동 중입니다. 예를 들어, 현재 노드가 Para5 인 경우 Nan으로 표시됩니다. 그때는 이 없습니다.이 새로운 케이스에서 0을 반환 할 수 있습니까? – Saravanan

+0

@Saravanan : ''의 사양을 읽을 필요가 있습니다. 매우 복잡합니다. 대안을 사용할 수 있습니다 :' '-이 것은 정상적으로 작동합니다. –

+0

@_Dimitre Novatchev : 새로운 케이스 Para5에서는 작동하지만 이전 케이스에서는 작동하지 않습니다. 실제로, 오래된 케이스에는 이 포함되지 않습니다. vMyCount가 숫자인지 확인하는 방법이 있습니까? – Saravanan

관련 문제