$(function () { pageContext.i18n.modTalk = 'moderation talk'; pageContext.i18n.replyToComment = 'Reply'; pageContext.i18n.modTalkEmpty = 'moderation talk is empty'; pageContext.url.getModTalk = "/comments/%25ID%25/listModTalk.json"; pageContext.url.possibleCommentRecipients = "/comments/%ID%/possibleRecipients.json"; pageContext.url.commentEdit = '/comments/%25ID%25/edit.html'; pageContext.url.commentView = '/comments/%ID%/view.html'; pageContext.i18n.commentVisibility = { 'full': 'Viewable by all users', 'op': 'Viewable by the original poster', 'mod': 'Viewable by moderators', 'opAndMod': 'Viewable by moderators and the original poster', 'other': 'Advanced visibility', 'dialogTitle': 'Comment visibility', 'selectGroups': 'Visible to groups', 'selectOther': 'Other recipients', 'selectOriginalPoster': 'Original poster', 'selectModerators': 'Moderators', 'selectAssignees': 'Asked to answer users' }; pageContext.i18n.commentMenuLabels = { 'comment-edit': 'comments.menu.edit', 'comment-delete': 'comments.menu.delete', 'comment-convert': 'comments.menu.convert' };pageContext.i18n.answer= { bestAnswer: 'Best Answer', controlBar : { accept: 'Accept', unaccept: 'Unaccept', acceptCommand: 'Accept this answer as correct', cancelAcceptedCommand: 'Remove this answers accepted status' } }; window.croles = { u: false, op: false, m: false, og: false, as: false, ag: false, dc: false, doc: false, eo: false, ea: false }; tools.init({ q: { e: false, ew: false, eo: false, r: false, ro: false, d: false, dow: false, fv: false, c: false, co: false, p: false, tm: false , ms: false, mos: false }, n: { f: false, vf: false, vfo: false, vr: false, vro: false, c: false, co: false, vu: false, vd: false, w: false, wo: false, l: false }, c: { e: false, eo: false, d: false, dow: false, ta: false, tao: false, l: false }, a: { e: false, ew: false, eo: false, d: false, dow: false, a: false, aoq: false, ao: false, tc: false, tco: false, p: false, tm: false }, pc: croles }, { tc: true, nsc: true }); commandUtils.initializeLabels(); }); Skip to Content
-1

XML to ABAP internal Table using XSLT transformation: repeated tags value

Mar 13, 2017 at 07:28 AM

139

avatar image

hi,

i am using XSLT to convert XML data to ABAP table, but for repeated tags values is not coming .

below is my input and XSLT.

input XML.

<?xml version="1.0" encoding="utf-8"?>
  <CSTMRPMTSTSRPT>
    <GRPHDR>
      <MSGID>20120504-PSR/33</MSGID>
      <CREDTTM>2012-05-04T22:34:16</CREDTTM>
      <INITGPTY>
        <ID>
          <ORGID>
            <BICORBEI>CITIUS33</BICORBEI>
          </ORGID>
        </ID>
      </INITGPTY>
    </GRPHDR>
    <ORGNLGRPINFANDSTS>
      <ORGNLMSGID>V3C-4-PVT-MESSAGEID</ORGNLMSGID>
      <ORGNLMSGNMID>PAIN.001.001.03</ORGNLMSGNMID>
      <ORGNLCREDTTM>2012-05-04T14:07:01</ORGNLCREDTTM>
      <ORGNLNBOFTXS>75</ORGNLNBOFTXS>
      <ORGNLCTRLSUM>75</ORGNLCTRLSUM>
      <GRPSTS>PART</GRPSTS>
      <STSRSNINF>
        <ADDTLINF>ACK - FILE PARTIALLY SUCCESSFUL1</ADDTLINF>
		<ADDTLINF>ACK - FILE PARTIALLY SUCCESSFUL2</ADDTLINF>
		<ADDTLINF>ACK - FILE PARTIALLY SUCCESSFUL3</ADDTLINF>
		<ADDTLINF>ACK - FILE PARTIALLY SUCCESSFUL4</ADDTLINF>
      </STSRSNINF>
    </ORGNLGRPINFANDSTS>
  </CSTMRPMTSTSRPT>

XSLT:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output encoding="iso-8859-1" indent="yes" method="xml" version="1.0"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="/">
    <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
      <asx:values>
        <CSTMRPMTSTSRPT_GET>
          <xsl:apply-templates select="//CSTMRPMTSTSRPT"/>
        </CSTMRPMTSTSRPT_GET>
      </asx:values>
    </asx:abap>
  </xsl:template>
  <xsl:template match="CSTMRPMTSTSRPT">
    <CSTMRPMTSTSRPT>
      <GRPHDR>
        <MSGID>
          <xsl:value-of select="GRPHDR/MSGID"/>
        </MSGID>
        <CREDTTM>
          <xsl:value-of select="GRPHDR/CREDTTM"/>
        </CREDTTM>
      </GRPHDR>
      <ORGNLGRPINFANDSTS>
        <ORGNLMSGID>
          <xsl:value-of select="ORGNLGRPINFANDSTS/ORGNLMSGID"/>
        </ORGNLMSGID>
        <ORGNLMSGNMID>
         <xsl:value-of select="ORGNLGRPINFANDSTS/ORGNLMSGNMID"/>
        </ORGNLMSGNMID>
        <ORGNLCREDTTM>
          <xsl:value-of select="ORGNLGRPINFANDSTS/ORGNLCREDTTM"/>
        </ORGNLCREDTTM>
        <ORGNLNBOFTXS>
          <xsl:value-of select="ORGNLGRPINFANDSTS/ORGNLNBOFTXS"/>
        </ORGNLNBOFTXS>
        <ORGNLCTRLSUM>
          <xsl:value-of select="ORGNLGRPINFANDSTS/ORGNLCTRLSUM"/>
        </ORGNLCTRLSUM>
        <GRPSTS>
          <xsl:value-of select="ORGNLGRPINFANDSTS/GRPSTS"/>
        </GRPSTS>
        <STSRSNINF>
          <xsl:for-each select="ORGNLGRPINFANDSTS/STSRSNINF/ADDTLINF">
            <ADDTLINF>
              <xsl:value-of select="ORGNLGRPINFANDSTS/STSRSNINF/ADDTLINF"/>
            </ADDTLINF>
         </xsl:for-each>
        </STSRSNINF>
      </ORGNLGRPINFANDSTS>
    </CSTMRPMTSTSRPT>
  </xsl:template>
</xsl:transform>

and out put :

 <?xml version="1.0" encoding="iso-8859-1" ?> 
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
 <asx:values>
 <CSTMRPMTSTSRPT_GET>
<CSTMRPMTSTSRPT>
 <GRPHDR>
<MSGID>20120504-PSR/33</MSGID> 
<CREDTTM>2012-05-04T22:34:16</CREDTTM> 
</GRPHDR>
<ORGNLGRPINFANDSTS>
 <ORGNLMSGID>V3C-4-PVT-MESSAGEID</ORGNLMSGID> 
 <ORGNLMSGNMID>PAIN.001.001.03</ORGNLMSGNMID> 
 <ORGNLCREDTTM>2012-05-04T14:07:01</ORGNLCREDTTM> 
 <ORGNLNBOFTXS>75</ORGNLNBOFTXS> 
 <ORGNLCTRLSUM>75</ORGNLCTRLSUM> 
 <GRPSTS>PART</GRPSTS> 
 <STSRSNINF>
   <ADDTLINF /> 
   <ADDTLINF /> 
   <ADDTLINF /> 
   <ADDTLINF /> 
 </STSRSNINF>
 </ORGNLGRPINFANDSTS>
 </CSTMRPMTSTSRPT>
</CSTMRPMTSTSRPT_GET>
</asx:values>
</asx:abap>

Since value of the <ADDTLINF> tag is not coming on the output.

please let me correct if I am making mistake in my XSLT.

Thanks & Regard,

Atique

10 |10000 characters needed characters left characters exceeded
* Please Login or Register to Answer, Follow or Comment.

3 Answers

Best Answer
Sandra Rossi Mar 13, 2017 at 08:02 AM
1

for-each does change the current node so you should only use xsl:value-of select ="."

Show 1 Share
10 |10000 characters needed characters left characters exceeded

Thank you Rossi for ur reply.

Now I am struggling in ABAP code, I have check my code and did not find place to correct it.

Since I am not getting the data <ADDTLINF> tag in my ABAP internal table defined in my report.

Below is my ABAP code:

TYPES: BEGIN OF  GRPHDR,
         MSGID   TYPE CHAR50,
         CREDTTM TYPE CHAR20,
       END OF GRPHDR.
TYPES: BEGIN OF ADDTLINF,
         ADDTLINF(50),
       END OF ADDTLINF.
TYPES: BEGIN OF  STSRSNINF,
         ADDTLINF TYPE STANDARD TABLE OF ADDTLINF WITH NON-UNIQUE DEFAULT KEY,
       END OF  STSRSNINF.

TYPES: BEGIN OF  ORGNLGRPINFANDSTS,
         ORGNLMSGID   TYPE CHAR50,
         ORGNLMSGNMID TYPE CHAR20,
         ORGNLCREDTTM TYPE CHAR25,
         ORGNLNBOFTXS TYPE NUMC10,
         ORGNLCTRLSUM TYPE P DECIMALS 3,
         GRPSTS       TYPE CHAR20,
         STSRSNINF    TYPE STSRSNINF,
       END OF  ORGNLGRPINFANDSTS.

TYPES: BEGIN OF CSTMRPMTSTSRPT,
         GRPHDR            TYPE GRPHDR,
         ORGNLGRPINFANDSTS TYPE ORGNLGRPINFANDSTS,
       END OF CSTMRPMTSTSRPT.

TYPES: BEGIN OF TY_FINAL,
        CSTMRPMTSTSRPT TYPE CSTMRPMTSTSRPT,
       END OF  TY_FINAL.

DATA: IT_FINAL TYPE STANDARD TABLE OF TY_FINAL,
      WA_FINAL TYPE                   TY_FINAL.
.........
GET REFERENCE OF IT_FINAL INTO GS_RESULT_XML-VALUE.
  GS_RESULT_XML-NAME = 'CSTMRPMTSTSRPT_GET'.
  APPEND GS_RESULT_XML TO GT_RESULT_XML.

* Perform the XSLT stylesheet
  TRY.
     CALL TRANSFORMATION ZXSLT_TEST
      SOURCE XML GT_ITAB
      RESULT (GT_RESULT_XML).
    CATCH CX_ROOT INTO GS_RIF_EX.
      GS_VAR_TEXT = GS_RIF_EX->GET_TEXT( ).
      MESSAGE GS_VAR_TEXT TYPE 'E'.
  ENDTRY.

Above structure I am passing to the XSLT Transformation.

0
Sandra Rossi Mar 13, 2017 at 08:02 AM
0

for-each does change the current node so you should only use xsl:value-of select ="."

Share
10 |10000 characters needed characters left characters exceeded
ATIQUE KHAN Mar 13, 2017 at 12:20 PM
0

Thank you Rossi for ur reply.

Now I am struggling in ABAP code, I have check my code and did not find place to correct it.

Since I am not getting the data <ADDTLINF> tag in my ABAP internal table defined in my report.

Below is my ABAP code:

TYPES: BEGIN OF  GRPHDR,
         MSGID   TYPE CHAR50,
         CREDTTM TYPE CHAR20,
       END OF GRPHDR.
TYPES: BEGIN OF ADDTLINF,
         ADDTLINF(50),
       END OF ADDTLINF.
TYPES: BEGIN OF  STSRSNINF,
         ADDTLINF TYPE STANDARD TABLE OF ADDTLINF WITH NON-UNIQUE DEFAULT KEY,
       END OF  STSRSNINF.

TYPES: BEGIN OF  ORGNLGRPINFANDSTS,
         ORGNLMSGID   TYPE CHAR50,
         ORGNLMSGNMID TYPE CHAR20,
         ORGNLCREDTTM TYPE CHAR25,
         ORGNLNBOFTXS TYPE NUMC10,
         ORGNLCTRLSUM TYPE P DECIMALS 3,
         GRPSTS       TYPE CHAR20,
         STSRSNINF    TYPE STSRSNINF,
       END OF  ORGNLGRPINFANDSTS.

TYPES: BEGIN OF CSTMRPMTSTSRPT,
         GRPHDR            TYPE GRPHDR,
         ORGNLGRPINFANDSTS TYPE ORGNLGRPINFANDSTS,
       END OF CSTMRPMTSTSRPT.

TYPES: BEGIN OF TY_FINAL,
        CSTMRPMTSTSRPT TYPE CSTMRPMTSTSRPT,
       END OF  TY_FINAL.

DATA: IT_FINAL TYPE STANDARD TABLE OF TY_FINAL,
      WA_FINAL TYPE                   TY_FINAL.
.........
GET REFERENCE OF IT_FINAL INTO GS_RESULT_XML-VALUE.
  GS_RESULT_XML-NAME = 'CSTMRPMTSTSRPT_GET'.
  APPEND GS_RESULT_XML TO GT_RESULT_XML.

* Perform the XSLT stylesheet TRY. CALL TRANSFORMATION ZXSLT_TEST SOURCE XML GT_ITAB RESULT (GT_RESULT_XML). CATCH CX_ROOT INTO GS_RIF_EX. GS_VAR_TEXT = GS_RIF_EX->GET_TEXT( ). MESSAGE GS_VAR_TEXT TYPE 'E'. ENDTRY.

Above structure I am passing to the XSLT Transformation.

Share
10 |10000 characters needed characters left characters exceeded