Transform에서 for-each 주의사항!

Posted at 2010. 4. 29. 14:26 | Posted in Oracle Solution/BPEL
반응형
일반적으로 트랜스폼(Transform)에서 여러개의 데이터일 경우 for-each 컴포넌트를 이용하여 돌릴 수 있습니다.

하지만 내가 의도하지 않는 결과가 나올 때가 있습니다. ㅠ_ㅠ



아래는 입력과 출력의 XML 스키마입니다.



단순히 입력 받은 그대로를 출력하는 BPEL 입니다.



트랜스폼으로 처리 했습니다.

<sample> 태그의 수만큼 루프가 돌게 됩니다.





<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body xmlns:ns1="http://www.example.org">
    <ns1:request>
      <ns1:sample>  <!-- 1개 -->
        <ns1:seq>1</ns1:seq>
        <ns1:id>1</ns1:id>
        <ns1:data>data_1</ns1:data>
      </ns1:sample>
      <ns1:sample>  <!-- 2개 -->
        <ns1:seq>2</ns1:seq>
        <ns1:id>2</ns1:id>
        <ns1:data>data_2</ns1:data>
      </ns1:sample>
    </ns1:request>
  </soap:Body>
</soap:Envelope>

위와 같은 데이터를 입력하게 되면 아래와 같은 데이터가 나오게 됩니다.

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:wsa="http://www.w3.org/2005/08/addressing">
  <env:Header>
    <wsa:MessageID>urn:231BE770534E11DFBFC6CF3D19573BDE</wsa:MessageID>
    <wsa:ReplyTo>
      <wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address>
    </wsa:ReplyTo>
  </env:Header>
  <env:Body>
    <response xmlns:ns0="http://www.example.org" xmlns="http://www.example.org">
      <ns0:sample>
        <ns0:seq>1</ns0:seq>
        <ns0:id>1</ns0:id>
        <ns0:data>data_1</ns0:data>
      </ns0:sample>
      <ns0:sample>
        <ns0:seq>2</ns0:seq>
        <ns0:id>2</ns0:id>
        <ns0:data>data_2</ns0:data>
      </ns0:sample>
    </response>
  </env:Body>
</env:Envelope>

하지만!! 아래와 같이 의도하지 않은 결과가 나올때가 있습니다. ㅠ_ㅠ

갯수는 제대로 나왔는데 데이터가 1첫째의 데이터만 계속 반복해서 나옵니다.

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:wsa="http://www.w3.org/2005/08/addressing">
  <env:Header>
    <wsa:MessageID>urn:71B1A920534D11DFBFC6CF3D19573BDE</wsa:MessageID>
    <wsa:ReplyTo>
      <wsa:Address>http://www.w3.org/2005/08/addressing/anonymous</wsa:Address>
    </wsa:ReplyTo>
  </env:Header>
  <env:Body>
    <response xmlns:ns0="http://www.example.org" xmlns="http://www.example.org">
      <ns0:sample>
        <ns0:seq>1</ns0:seq>
        <ns0:id>1</ns0:id>
        <ns0:data>data_1</ns0:data>
      </ns0:sample>
      <ns0:sample>
        <ns0:seq>1</ns0:seq>
        <ns0:id>1</ns0:id>
        <ns0:data>data_1</ns0:data>
        </ns0:sample>
    </response>
  </env:Body>
</env:Envelope>

Mapper 파일을 Source 모드로 보면 정상적인 for-each 가 적용되면 아래와 같이 됩니다.

  <xsl:template match="/">
    <ns0:response>
      <xsl:for-each select="/ns0:request/ns0:sample">
        <ns0:sample>
          <ns0:seq>
            <xsl:value-of select="ns0:seq"/>
          </ns0:seq>
          <ns0:id>
            <xsl:value-of select="ns0:id"/>
          </ns0:id>
          <ns0:data>
            <xsl:value-of select="ns0:data"/>
          </ns0:data>
        </ns0:sample>
      </xsl:for-each>
    </ns0:response>
  </xsl:template>

하지만 정상적으로 for-each가 안되는 소스를 보면 아래와 같이 되어있습니다.

  <xsl:template match="/">
    <ns0:response>
      <xsl:for-each select="/ns0:request/ns0:sample">
        <ns0:sample>
          <ns0:seq>
            <xsl:value-of select="/ns0:request/ns0:sample/ns0:seq"/>
          </ns0:seq>
          <ns0:id>
            <xsl:value-of select="/ns0:request/ns0:sample/ns0:id"/>
          </ns0:id>
          <ns0:data>
            <xsl:value-of select="/ns0:request/ns0:sample/ns0:data"/>
          </ns0:data>
        </ns0:sample>
      </xsl:for-each>
    </ns0:response>
  </xsl:template>

현재 JDeveloper 의 버그 같지만 이런 에러(?)가 안나게 하는 방법은 맵핑할 때 자동 맵핑(Auto Map)을 이용하거나, for-each 컴포넌트를 먼저 적용 한 후 선을 연결하면 됩니다.

선을 먼저 연결하고 for-each 컴포넌트를 적용하면 원하는 결과가 안나올 수 있습니다.

반응형

'Oracle Solution > BPEL' 카테고리의 다른 글

프로젝트 구조가 이상해질 때!!!  (0) 2010.04.27
Database Adapter  (0) 2010.04.19
//