on 2006 Sep 24 8:43 PM
Hi all,
In my scenario I need to map fields of IDOC XML to a v complex and generic Enevelope ( XML ) <b>As well as send the entire IDOC XML as a string to one of the fields of the target Envelope XML</b> </b> Now wht is the best approach for mapping :
Java / XSLT ?
Is there any better simpler method to achieve this requiremnet ?
Thanks and Regards,
KLK
Hi K.L.K,
If the data size is more then it is better to go for Java,XSLT mapping will consume more memory
Regards
Agasthuri Doss
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi,
You can go for Java or XSLT mapping
XSLT code for copying to single field
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<Target>
<SingleField>
<xsl:copy-of select="." />
</SingleField>
</Target>
</xsl:template>
</xsl:stylesheet>
You can refer this thread and check out the post by Bhavesh for Java mapping
Thanks,
Prakash
Hi Prakash,
Thanks for the valuable input , apart from sending the whole IDOC XML as string I also need to MAP IDOC fields to the Target XML also in the same Mapping
So do u still suggest using Java Mapping for BOTH ( Fields as well as whole Idoc as string ) ?
If I could use Message mapping for field mapping my life would be lot more easier
Clarify a bit more
Regards,
KLK
Hi,
One option, use multiple Mappings in Interface Mapping + Global Container / GLobal Variables.
First Mapping will be java which will convert the input stream into String XML and save it into the global variable. Output of this mapping will be the same input.
Next, message mapping, use the global variable in previous step to map it to target.
Havent tried this, but , worth a try.
Regards,
Bhavesh
Hi,
One option, use multiple Mappings in Interface Mapping + Global Container / Global Variables.
First Mapping will be java which will convert the input stream into String XML and save it into the global variable. Output of this mapping will be the same input.
Next, message mapping, use the global variable in previous step to map it to target.
Haven't tried this, but,worth a try.
Regards,
Bhavesh
Hi,
You can try as Bhavesh said using multiple mapping programs.
Or
Just modify the existing XSLT mapping and do it. I think it very simple and easy
eg:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<Target>
<Field1><xsl:value-of select="IDOCXPath"/></Field1>
<Field2><xsl:value-of select="IDOCXPath"/></Field2>
<Field3><xsl:value-of select="IDOCXPath"/></Field3>
<SingleField>
<xsl:copy-of select="." />
</SingleField>
</Target>
</xsl:template>
</xsl:stylesheet>
Field1, Field2 and Field3 are the target fields. IDOCXpath is the Xpath of the value to be mapped from the source IDOC.
Thanks,
Prakash
Hi Bhavesh,
I tried java mapping followed by Msg Mapping I get the
following Erro :
com.sap.aii.utilxi.misc.api.BaseRuntimeException: Parsing an empty source. Root element expected
My input stream is exhausted in the Java Mapping itself
though I tried saving the inputstream , increasing the
source and target Interfaces in the mapping nothing worked !!
Prakas -
I dont have a XSLT editor to enhance the code u have given to fit my scenario !!
Guys , It would be great if u could suggest me a workable solution .
Thanks and Regards,
KLK
Attached is the code in Java Mapping
private InputStream payload ;
/* (non-Javadoc)
@see com.sap.aii.mapping.api.StreamTransformation#setParameter(java.util.Map)
*/
public void setParameter(Map arg0) {
this.param = arg0;
if (param == null) {
this.param = new HashMap();
}
}
/* (non-Javadoc)
@see com.sap.aii.mapping.api.StreamTransformation#execute(java.io.InputStream, java.io.OutputStream)
*/
public void execute(InputStream arg0, OutputStream arg1)
throws StreamTransformationException {
DefaultHandler handler = this;
try {
payload = arg0;
BufferedReader inp = new BufferedReader(new InputStreamReader(payload));
StringBuffer buffer = new StringBuffer();
String line="";
while ((line = inp.readLine()) != null) {
buffer.append(line);
}
source=buffer.toString();
if(source != null)
param.put("key1",source);
else
param.put("key1","Its Empty");
}
catch (Exception e){
e.printStackTrace();
}
}
Hi,
You don't need a editor basically for writing a XSLT mapping. Whatever mapping you are going to do you need to parse the XML document so you do the same here in XSLT and which is simple. How many fields from your IDOC should be mappied to the target apart from the whole XML in one tag? In above code you just need to change the Field1..Fieldn to your Target field names and the IdocXPath is simple, the path from the root.
Eg:
IDOC
- DELVRY03
- SomeSegment
- Field1
your xpath is IDOC/DELVRY03/SomeSegment/Field1
thats it., repeat the same for all the fields
Thanks,
Prakash
Hi Prakash,
I am trying as u suggested but not getting values in the Target XML while testing from Interface Mapping
My Source IDOC Structure :
<?xml version="1.0" encoding="UTF-8"?>
<ZEU_MATMAS03>
<IDOC BEGIN="">
<EDI_DC40 SEGMENT="">
<TABNAM/>
<MANDT/>
<DOCNUM/>
my XSLT program
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<MATERIAL>
<MATNO><xsl:value-of select="ZEU_MATMAS03/IDOC/EDI_DC40/DOCNUM"/></MATNO>
<MATTEXT>
When I test the interface mapping I get the following out put :
<?xml version="1.0" encoding="utf-8"?>
<MATERIAL>
<MATNO/>
<MATTEXT>
Please help fixing the XPATH
Thanks and Regards,
KLK
Shabarish ,
that was just example I do have values in my XML
Even after giving values it is not working
Probably wrong with my mapping
Bhavesh,
I will insert the code and test
but source for second mapping needs to be a XML msg right ? not a string ..
Plese correct me if my understanding wrong !!
kind Regards
KLK
Source:
<?xml version="1.0" encoding="UTF-8"?>
<ZEU_MATMAS03>
<IDOC BEGIN="">
<EDI_DC40 SEGMENT="">
<TABNAM/>
<MANDT/>
<DOCNUM>ETC</DOCNUM>
</EDI_DC40>
</IDOC>
</ZEU_MATMAS03>
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<TEST>
<MATERIAL>TEST</MATERIAL>
<MATNO>
<xsl:value-of select="ZEU_MATMAS03/IDOC/EDI_DC40/DOCNUM"/>
</MATNO>
<MATTEXT>TEST</MATTEXT>
</TEST>
</xsl:template>
</xsl:stylesheet>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<TEST xmlns:fo="http://www.w3.org/1999/XSL/Format">
<MATERIAL>TEST</MATERIAL>
<MATNO>ETC</MATNO>
<MATTEXT>TEST</MATTEXT>
</TEST>
Well, just a trial and it works at my end ...
Hi,
<i>>>><?xml version="1.0" encoding="UTF-8"?>
<ZEU_MATMAS03>
<IDOC BEGIN="">
<EDI_DC40 SEGMENT="">
<TABNAM/>
<MANDT/>
<b><DOCNUM/></b>
my XSLT program
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<MATERIAL>
<MATNO><xsl:value-of select="<b>ZEU_MATMAS03/IDOC/EDI_DC40/DOCNUM</b>"/></MATNO>
<MATTEXT>
When I test the interface mapping I get the following out put :
<?xml version="1.0" encoding="utf-8"?>
<MATERIAL>
<b><MATNO/></b>
<MATTEXT></i>
Check your source document DOCNUM is empty in the source file so obviously you will not have any value in the MATNO. Your XPATH is perfect.
Thanks,
Prakash
User | Count |
---|---|
70 | |
10 | |
10 | |
7 | |
6 | |
6 | |
6 | |
5 | |
5 | |
5 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.