2017-01-10 2 views
0

몇 가지 카운트 로직을 사용하여 for-each에서 루프 로직으로 전환하는 방법을 모르겠습니다.XSLT 1.0 루핑

다음은 XML의 작은 샘플입니다. 시퀀스 번호와 할인 번호는 크게 다를 수 있습니다. xml이 올바른 순서로 정렬되도록 사전 정렬했습니다.

<ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
    <ns2:RETAILSEQUENCENUMBER>1</ns2:RETAILSEQUENCENUMBER> 
    <ns2:DISCOUNTSEQUENCENUMBER>1</ns2:DISCOUNTSEQUENCENUMBER> 
    <ns2:DISCOUNTTYPECODE>ZD01</ns2:DISCOUNTTYPECODE> 
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
<ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
    <ns2:DATAHEADERCOLUMN_SEGNAM>/POSDW/E1BPLINEITEMDISCOUNT002</ns2:DATAHEADERCOLUMN_SEGNAM> 
    <ns2:RETAILSEQUENCENUMBER>1</ns2:RETAILSEQUENCENUMBER> 
    <ns2:DISCOUNTSEQUENCENUMBER>2</ns2:DISCOUNTSEQUENCENUMBER> 
    <ns2:DISCOUNTTYPECODE>Z407</ns2:DISCOUNTTYPECODE> 
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
<ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
    <ns2:DATAHEADERCOLUMN_SEGNAM>/POSDW/E1BPLINEITEMDISCOUNT002</ns2:DATAHEADERCOLUMN_SEGNAM> 
    <ns2:RETAILSEQUENCENUMBER>1</ns2:RETAILSEQUENCENUMBER> 
    <ns2:DISCOUNTSEQUENCENUMBER>3</ns2:DISCOUNTSEQUENCENUMBER> 
    <ns2:DISCOUNTTYPECODE>Z407</ns2:DISCOUNTTYPECODE> 
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
    <ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
    <ns2:RETAILSEQUENCENUMBER>2</ns2:RETAILSEQUENCENUMBER> 
    <ns2:DISCOUNTSEQUENCENUMBER>1</ns2:DISCOUNTSEQUENCENUMBER> 
    <ns2:DISCOUNTTYPECODE>ZD01</ns2:DISCOUNTTYPECODE> 
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
<ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
    <ns2:DATAHEADERCOLUMN_SEGNAM>/POSDW/E1BPLINEITEMDISCOUNT002</ns2:DATAHEADERCOLUMN_SEGNAM> 
    <ns2:RETAILSEQUENCENUMBER>2</ns2:RETAILSEQUENCENUMBER> 
    <ns2:DISCOUNTSEQUENCENUMBER>2</ns2:DISCOUNTSEQUENCENUMBER> 
    <ns2:DISCOUNTTYPECODE>Z407</ns2:DISCOUNTTYPECODE> 
</ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 

가 여기에 XML과 장소는 NS2하지만 내 요구 사항은 루프입니다

 <xsl:for-each select="ns0:idocData/ns2:_x002F_POSDW_x002F_E1POSTR_CREATEMULTIP001GRP"> 
     <xsl:for-each select="ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002"> 
      <ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
    <ns2:DATAHEADERCOLUMN_SEGNAM><xsl:value-of select="ns2:DATAHEADERCOLUMN_SEGNAM"/></ns2:DATAHEADERCOLUMN_SEGNAM> 
    <ns2:RETAILSEQUENCENUMBER><xsl:value-of select="ns2:RETAILSEQUENCENUMBER"/></ns2:RETAILSEQUENCENUMBER> 
    <ns2:DISCOUNTSEQUENCENUMBER><xsl:value-of select="ns2:DISCOUNTSEQUENCENUMBER"/></ns2:DISCOUNTSEQUENCENUMBER> 
    <ns2:DISCOUNTTYPECODE><xsl:value-of select="ns2:DISCOUNTTYPECODE"/></ns2:DISCOUNTTYPECODE> 
      </ns2:_x002F_POSDW_x002F_E1BPLINEITEMDISCOUNT002> 
     </xsl:for-each> 
     </xsl:for-each> 

내 XSLT입니다 : DISCOUNTTYPECODE는 것으로 밝혀 ZD01 ZD11 확인하십시오. 동일한 ns2 : RETAILSEQUENCENUMBER 내에 다른 ZD01이있는 경우 다음 DISCOUNTTYPECODE = ZD12를 작성한 다음 ZD13 등을 작성하십시오 (ZD01 레코드에만 해당).

XML이 다음 RETAILSEQUENCENUMBER로 떨어지면 논리는 ZD01이 ZD11이되도록 다시 시작해야합니다.

+0

이것은 XSLT 1.0에서 까다로운 문제입니다. (변수를 증가시킬 수있는 루프 유형이 없습니다.) http://www.dpawson.co.uk/xsl/sect2/N4486.html#d5509e427을 읽고이를 통해 도움이되는지 확인하십시오. – LarsH

답변

0

위에서 언급 한 dpawson 사이트의 기술 중 하나를 사용하여 데이터를 사전 처리하고 그룹화하는 다른 변환을 작성하는 것이 좋습니다. 이렇게하면 할인 유형을 훨씬 쉽게 결정할 수 있습니다.

일단 데이터가 그룹화되고 정렬되면이 변환은 할인 유형 등의 변경에만 관련이 있습니다. 그런 다음 이전 ZD01 형제의 수를 확인하고 그 수를 기반으로 새로운 할인 유형을 추론 할 수 있습니다. 이전 형제

  • 0 이전 ZD01 요소 = ZD11
  • 1 이전 ZD01 소자 = ZD12

이전 형제를 사용하여 다른 소매 번호 값을 기준으로 번호 다시 매김을 다시 시작해야하는지 여부를 결정할 수도 있습니다.

+0

감사합니다 Lars/Matt. 나는 매일 처리하는 파일의 수와 이것이 처리 속도에 끼칠 수있는 우려로 인해 정말로하고 싶지 않은 또 다른 수준의 사전 처리를 도입해야했습니다. – Jimmy