Remove header by XSLT Mapping

Hello Experts,
I have an incoming XML coming through HTTP protocol which consiste of Header and the data is like below.
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/
<?xml version="1.0" encoding="utf-8"?>
<PurchaseOrder>
</PurchaseOrder>
Footer
I need only the lines in bold.
Can any one help
Regards,
Arijit

Hi Arijit,
   This is an invalid XML. Parser is producing errors for this XML.
Please check.
regards
Anupam
Hi Arijit,
              Could you please kindly post the complete target structure? Here you need java mapping to remove the extra envelop, then put the result in the target XML.   Could you please specify what version of PI you are working with?
The sender communication channel will consist of File adapter. The contents of the file will directly flow to java mapping and no need to use FCC. The java mapping code with remove the envelop and produce the target XML. To do this follow the blog http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/4018. [original link is broken] [original link is broken] [original link is broken]
If you need help in java mapping code. Please post the complete target XML and your PI version since java mapping is different in PI 7.0 and PI 7.1.Alternatively you can follow these links for java mapping help (if required)
http://wiki.sdn.sap.com/wiki/display/XI/ParametrizedJavaMappinginPI+7.1
http://wiki.sdn.sap.com/wiki/display/XI/BeginnersguidetoJavamappingusingDOMparserinSAPXI
regards
Anupam
Edited by: anupamsap on Sep 1, 2011 8:59 AM

Similar Messages

  • How to remove CDATA from XSLT mapping result

    Dear All,
    Using the following code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
         <xsl:template match="/">
              <DlrDiscItemWise>
                   <DlrDiscItemWiseXML>
                        <xsl:text disable-output-escaping="yes"><![CDATA[<![CDATA[]]></xsl:text>
                        <xsl:copy-of select="."/>
                        <xsl:text disable-output-escaping="yes"><![CDATA[]]]]></xsl:text>
                        <xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text>
                   </DlrDiscItemWiseXML>
              </DlrDiscItemWise>
         </xsl:template>
    </xsl:stylesheet>
    I am getting result as
    <?xml version="1.0" encoding="UTF-8"?><DlrDiscItemWise><DlrDiscItemWiseXML><![CDATA[<ns0:MT_DlrDis_Sender xmlns:ns0="http://MTSINDIA/TC/DealerDiscount"><ITEM><nDlrAddEdit>1</nDlrAddEdit><nItemCode>101000080</nItemCode><nItemDisc>100</nItemDisc><dtDiscFromdt>15/May/2010</dtDiscFromdt><dtDiscToDt>31/may/2010</dtDiscToDt><nItemAddDisc/><dtAddDiscFromDt/><dtAddDiscToDt/><nDlrTypeCode/><nItemDisQtyMulti/><nItemDiscQtyFree/><sItemDiscPerAmt/><sItemDiscType/><nDlrCode>10010000088</nDlrCode><nCircleCode>4</nCircleCode></ITEM></ns0:MT_DlrDis_Sender>]]></DlrDiscItemWiseXML></DlrDiscItemWise>
    but client doesnot want <![CDATA] and ]] at the end. Basically client doesn't want CDATA tag as it is throwing error wihile collecting message in Web Service.
    Please help!!

    Hi,
    You remove CDATA from xsl program which you are using in mapping so that it will come in output. Because CDATA we will use in DTD only, not required in XSL program.
    thanks,
    madhu

  • Removing specific XML tag in XSLT mapping

    Hi there,
    I've asked before about a XML to string XSLT mapping and the answers provided here helped me to successfully do that mapping! Thanks a lot!
    I'm using the following mapping to convert a string back to XML.
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:m="http://my.namespace.com">
         <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
         <xsl:template match="/">
              <xsl:for-each select="//m:my_tag">
                   <xsl:value-of select="." disable-output-escaping="yes"/>
              </xsl:for-each>
         </xsl:template>
    </xsl:stylesheet>
    But now, I'm having a problem converting back from string to XML. The response tag "m:mytag" has a string like this:
    "<?xml version="1.0" encoding="UTF-8"?><tag1><tag2>Data</tag2></tag1>".
    And  when I use the XSLT mapping shown above, the output file comes like this:
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml version="1.0" encoding="UTF-8"?>
    <tag1>
    <tag2>Data</tag2>
    </tag1>
    As you can see, the initial <?xml ...> tag is duplicated, and it generates a parsing error in XI.
    How can I eliminate one of the "<?xml version="1.0" encoding="UTF-8"?>" strings in the mapping?
    Thanks a lot.

    Wow!!!
    The output="html" actually worked on XML Spy!
    Removing the XSLT file initial tag didn't work.
    I had already resolved this problem using the replace-string method that I found here: http://aspn.activestate.com/ASPN/Cookbook/XSLT/Recipe/65426
    But your method is way more elegant and efficient. :o)
    I'll test the html method on XI, but I'm almost sure it'll work too.

  • SOAP Header XSLT mapping

    Hi,
    I am working on Proxy to SOAP synchronous scenario.  How to create SOAP header message in XSLT mapping...I am trying but no sauces becz receiver side SOAP header and Body in different message types please see below.
    Header part is message type 1
    <CredentialsHeader xmlns="http://reuters.com/datascopeselect/ExtractionService/v1/">
          <Username>string</Username>
          <Password>string</Password>
          <AuthenticationToken>string</AuthenticationToken>
        </CredentialsHeader>
    Body part is
    message type 2
    <soap:Body>
        <Extract xmlns="http://reuters.com/datascopeselect/ExtractionService/v1/">
          <request>
            <OutputFields>
              <string>string</string>
              <string>string</string>
            </OutputFields>
          </request>
        </Extract>
      </soap:Body>
    </soap:Envelope>
    But source is single.. I try ed multi mapping but synchronous scenario it will not working. 
    I am trying to generate both message types as single message type in XSLT mapping target side and will give service interface as dummy in ESR.
    Please guide how to generate 2 message types as single message type in XSLT mapping...
    Thanks,
    Venkat

    Hi Venkat,
    I suggest to produce a complete SOAP message in message mapping. Import the SOAP XSD from [http://schemas.xmlsoap.org/soap/envelope/] as external definition and use it as target message in message mapping. You need at 2 mapping programs in order to produce the message. The first mapping creates header and body. In the second mapping use "Return as XML" to map the header and body nodes to the SOAP envelope.
    In the SOAP receiver communication channel, you need to activate the parameter "Do Not Use SOAP Envelope", see [Configuring the Receiver SOAP Adapter|http://help.sap.com/saphelp_nw04/helpdata/en/29/5bd93f130f9215e10000000a155106/content.htm].
    Regards, Martin

  • Remove SOAP Envelop using XSLT  mapping.

    Hi,
    I need a code to remove SOAP Envelop using XSLT mapping.
    Source:
    <?xml version="1.0" encoding="UTF-8" ?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:enterprise.soap.sforce.com">
    <soapenv:Body>
    <getServerTimestampResponse>
    <result>
      <timestamp>2008-06-19T14:22:25.004Z</timestamp>
      </result>
      </getServerTimestampResponse>
      </soapenv:Body>
      </soapenv:Envelope>
    target:
    <?xml version="1.0" encoding="UTF-8" ?>
    <a>
          <b>
             <c>2008-06-19T14:22:25.004Z<c>
           </b>
    </a>
    Please help me in this
    Thanks&Regards,
    Yuga

    hi,
    <?xml version='1.0' ?>
    <xsl:stylesheet version="1.0" xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/"
                                  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
       <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
       <xsl:template match="/">
          <ns0:c>       
                   <xsl:copy-of select="SOAP-ENV:Envelope/SOAP-ENV:Body"/ />
          </ns0:c>
       </xsl:template>
    </xsl:stylesheet>
    This will get your whole body...
    Your root node should belong to some namesapce...i.e. getServerTimestampResponse .
    Thanks,
    Vijaya.

  • XSLT Mapping: how to add one day to TimeStamp

    Hello Experts,
    My requirement is to add one day to current timestamp. Used $TimeSent to get the currenttimestamp. In Expired field, the need to add one day
    say Created= 2011-03-30T20:29:13Z
           Expired = 2011-03-31T20:29:13Z
         <xsl:param name="TimeSent"/>
         <created><xsl:value-of select="$TimeSent"/></created>
         <expired>2011-03-31T20:29:13Z</expired>
    How to add one day to the current timestamp. I am new to XSLT mapping and need some help with the code.
    Thanks
    Shikha Jain
    Edited by: Jain Shikha on Mar 30, 2011 8:34 PM
    Edited by: Jain Shikha on Mar 30, 2011 8:36 PM

    Hello All,
    Thanks for your reply. i tried the function and the code is working when i am testing in stylus studio. But the same code gives error when i  tested the xslt mapping in PI (Error: TransformerConfigurationException triggered while loading XSLT mapping).
    $TimeSent function is working when code is tested in PI , but it doesnot give value in stylus studio. Also Current-dateTime() function is doesnot give value in PI but works in stylus studio. Is there any difference in the functions used in stylus studio and XSLT mapping in PI?
    Also if i remove the code used for function(to add one day to timestamp), and use constant value(2011-04-02T23:24:56.763Z)the code is working fine in PI. Please help me to find out where the code is going wrong when tested in PI.
    Below is the XSLT code i am using
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ds="http://xsltsl.org/date-time" xmlns:functx="http://www.functx.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">
       <xsl:function name="functx:next-day" as="xs:date?">
          <xsl:param name="TimeSent" as="xs:anyAtomicType?"/>
          <xsl:sequence select="xs:date(current-date()) + xs:dayTimeDuration(&apos;P1D&apos;) "/>
       </xsl:function> 
    <xsl:template match="/">
          <xsl:param name="TimeSent"/>
          <soapenv:Envelope xmlns:olsa="http://www.skillsoft.com/services/olsa_v1_0/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
             <soapenv:Header>
                <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                   <wsu:Timestamp wsu:Id="Timestamp-191900" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsu:Created>
                         <xsl:value-of select="$TimeSent"/>
               </wsu:Created>
    <wsu:Expires>
         <xsl:value-of select="concat(substring(functx:next-day($TimeSent) ,1,10) ,&apos;T&apos;, current-time())"/>                  </wsu:Expires>
                   </wsu:Timestamp>
                   <wsse:UsernameToken wsu:Id="UsernameToken-19030197" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
                      <wsse:Username>ABC</wsse:Username>
                      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">XYZ</wsse:Password>
                      <wsse:Nonce>erDTBNoUWv7GdHDaErrLwA==</wsse:Nonce>
                      <wsu:Created>2011-02-15T23:24:56.763Z</wsu:Created>
                   </wsse:UsernameToken>
                </wsse:Security>
             </soapenv:Header>
             <soapenv:Body>
                <olsa:GetMultiActionSignOnUrlRequest>
                   <olsa:customerId>ABC</olsa:customerId>
                   <olsa:userName>XYZ</olsa:userName>
                   <olsa:actionType>launch</olsa:actionType>
                   <olsa:assetId>222499_eng</olsa:assetId>
                   <olsa:groupCode>testgrp</olsa:groupCode>
                </olsa:GetMultiActionSignOnUrlRequest>
             </soapenv:Body>
          </soapenv:Envelope>
       </xsl:template>
    </xsl:stylesheet>
    Thanks
    Shikha Jain
    Edited by: Jain Shikha on Apr 2, 2011 9:51 PM

  • XSLT mapping - namespace problem?

    Hello,
    I am trying to proces a message with the following format:
    <XMLMESSAGE  xsi:nonamespaceSchemalocation='schema.xsd' >
       <ORDER>
         <HEADER>
         </HEADER>
         <ITEM>
         </ITEM
      </ORDER>
    <XMLMESSAGE>
    the mapping (XSLT or message mapping) throws an exception. During runtime or test, this is the same.
    The problem occurs, I think, because of the nonamespace atriibute. If a change or remove the value, the mapping is fine.
    Does anybody know if I should save the file mentioned in the attribute somewhere? Or is there a workaround for this problem?
    thnx, Paul
    PS: we are using PI 7.0.

    Hi Russ (and others),
    I tested it in the real example, but it still throws the same error on the  java (=compiled) mapping.
    this is my input:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE ORDER [
    <!ENTITY % iso-lat1 PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1//EN//XML" "http://www.oasis-open.org/docbook/xmlcharent/0.3/iso-lat1.ent">
    %iso-lat1;
    ]>
    <XMLMESSAGE xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:noNamespaceSchemaLocation="OrderBericht.xsd">
         <ORDER>
              <HEADER>
                   <ACCOUNT_NUMBER></ACCOUNT_NUMBER>
              </HEADER>
              <LINE_ITEMS>
                   <ITEM>
                        <LINE>1</LINE>
                   </ITEM>
              </LINE_ITEMS>
         </ORDER>
    </XMLMESSAGE>
    this is my xslt:
    <?xml version='1.0' ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="no" standalone="no" indent="yes"/>
         <xsl:template match="/">
              <ORDERS05 xmlns="com:root">
                   <IDOC BEGIN="1">
                       <xsl:call-template name="CrtEDIDC40"/>
                   </IDOC>
              </ORDERS05>
         </xsl:template>
         <xsl:template name="CrtEDIDC40">
              <EDI_DC40 SEGMENT="1">
                   <TABNAM>EDI_DC40</TABNAM>
                   <SNDPRT>LS</SNDPRT>
                   <SNDPRN>XIDCLNT300</SNDPRN>
              </EDI_DC40>
         </xsl:template>
    </xsl:stylesheet>
    and this is the error:
    18:00:41 Start of test
    Creating XSLT mapping mindef_test
    Call XSLT processor with stylsheet mindef_test.xsl.
    Method error called terminate transformation
    javax.xml.transform.TransformerException: IOException occurred while parsing stream. An empty document will be used! at com.sap.engine.lib.jaxp.TransformerImpl.transformWithStylesheet(TransformerImpl.java:351) at com.sap.engine.lib.jaxp.TransformerImpl.transform(TransformerImpl.java:240) at com.sap.aii.ibrep.server.mapping.ibrun.RepMappingTransformer.transform(RepMappingTransformer.java:150) at com.sap.aii.ibrep.server.mapping.ibrun.RepXSLTMapping.execute(RepXSLTMapping.java:81) at com.sap.aii.ibrep.server.mapping.ibrun.RepMappingHandler.run(RepMappingHandler.java:80) at com.sap.aii.ibrep.server.mapping.rt.MappingHandlerAdapter.run(MappingHandlerAdapter.java:107) at com.sap.aii.ibrep.server.mapping.ServerMapService.transformInterfaceMapping(ServerMapService.java:127) at com.sap.aii.ibrep.server.mapping.ServerMapService.transform(ServerMapService.java:104) at com.sap.aii.ibrep.sbeans.mapping.MapServiceBean.transform(MapServiceBean.java:40) at com.sap.aii.ibrep.sbeans.mapping.MapServiceRemoteObjectImpl0.transform(MapServiceRemoteObjectImpl0.java:167) at com.sap.aii.ibrep.sbeans.mapping.MapServiceRemoteObjectImpl0p4_Skel.dispatch(MapServiceRemoteObjectImpl0p4_Skel.java:104) at com.sap.engine.services.rmi_p4.DispatchImpl._runInternal(DispatchImpl.java:320) at com.sap.engine.services.rmi_p4.DispatchImpl._run(DispatchImpl.java:198) at com.sap.engine.services.rmi_p4.server.P4SessionProcessor.request(P4SessionProcessor.java:129) at com.sap.engine.core.service630.context.cluster.session.ApplicationSessionMessageListener.process(ApplicationSessionMessageListener.java:33) at com.sap.engine.core.cluster.impl6.session.MessageRunner.run(MessageRunner.java:41) at com.sap.engine.core.thread.impl3.ActionObject.run(ActionObject.java:37) at java.security.AccessController.doPrivileged(Native Method) at com.sap.engine.core.thread.impl3.SingleThread.execute(SingleThread.java:100) at com.sap.engine.core.thread.impl3.SingleThread.run(SingleThread.java:170) Caused by: java.io.IOException: Failed to load resource from the context classloader of the current thread! Loading from classloader was caused by: java.net.UnknownHostException: www.oasis-open.org at com.sap.engine.lib.xml.parser.URLLoaderBase.resolveEntity(URLLoaderBase.java:148) at com.sap.engine.lib.xml.parser.helpers.AdvancedXMLStreamReader.addInputFromEntity(AdvancedXMLStreamReader.java:393) at com.sap.engine.lib.xml.parser.XMLParser.handleDTDReference(XMLParser.java:2267) at com.sap.engine.lib.xml.parser.XMLParser.scanIntSubset(XMLParser.java:1057) at com.sap.engine.lib.xml.parser.XMLParser.scanDTD(XMLParser.java:1246) at com.sap.engine.lib.xml.parser.XMLParser.scanProlog(XMLParser.java:2795) at com.sap.engine.lib.xml.parser.XMLParser.scanDocument(XMLParser.java:2830) at com.sap.engine.lib.xml.parser.XMLParser.parse0(XMLParser.java:229) at com.sap.engine.lib.xml.parser.AbstractXMLParser.parseAndCatchException(AbstractXMLParser.java:145) at com.sap.engine.lib.xml.parser.AbstractXMLParser.parse(AbstractXMLParser.java:160) at com.sap.engine.lib.xml.parser.AbstractXMLParser.parse(AbstractXMLParser.java:261) at com.sap.engine.lib.jaxp.TransformerImpl.transformWithStylesheet(TransformerImpl.java:347) ... 19 more --------- java.io.IOException: Failed to load resource from the context classloader of the current thread! Loading from classloader was caused by: java.net.UnknownHostException: www.oasis-open.org at com.sap.engine.lib.xml.parser.URLLoaderBase.resolveEntity(URLLoaderBase.java:148)
    any ideas? I am totally lost here.

  • Java Error in RFC Lookup in XSLT Mapping usinf Java helper class

    Hi All,
    I am doing RFC Lookup in XSLT Mapping using Java Helper class.
    The Lookup works fine when called one RFC at a time However my requirement is I want to do 2 Lookups.
    Both Lookups works when done individually however when I call both lookups in one mapping I get following error "javax.xml.transform.TransformerException: DOMSource whose Node is null."
    Following is the code I have written in XSLT for the lookup:
         <xsl:template name="Lookup_1">
              <xsl:param name="STDPN"/>
                   <rfc:RFC_READ_TABLE>
                        <QUERY_TABLE>KNA1</QUERY_TABLE>
                        <OPTIONS><item><TEXT>
                                  <xsl:value-of select="$STDPN"/>
                             </TEXT></item>
                        </OPTIONS>
                        <FIELDS>
                             <item>
                                  <FIELDNAME>KUNNR</FIELDNAME>
                             </item>
                        </FIELDS>
                   </rfc:RFC_READ_TABLE>
              </xsl:variable>
              <xsl:variable name="response" xmlns:lookup="java:urn.mt.pi" select="lookup:execute($request, 'BS_D, 'cc_RfcLookup', $inputparam)"/>
              <xsl:element name="STDPN">
                   <xsl:value-of select="$response//DATA/item/WA"/>
              </xsl:element>
         </xsl:template>
         <xsl:template name="Lookup_2">
              <xsl:param name="BELNR"/>
                   <xsl:variable name="Query">AGMNT = '<xsl:value-of select="$BELNR"/>'</xsl:variable>
                   <xsl:variable name="request1">
                        <rfc:RFC_READ_TABLE>
                             <QUERY_TABLE>ZTABLE</QUERY_TABLE>
                             <OPTIONS><item><TEXT>
                                  <xsl:value-of select="$Query"/>
                                  </TEXT></item>
                             </OPTIONS>
                             <FIELDS>
                                  <item>
                                       <FIELDNAME>KUNAG</FIELDNAME>
                                  </item>
                             </FIELDS>
                        </rfc:RFC_READ_TABLE>
                   </xsl:variable>
                   <xsl:variable name="response1" xmlns:lookup="java:urn.mt.pi" select="lookup:execute($request1, 'BS_D','cc_RfcLookup', $inputparam)"/>
                   <xsl:element name="BELNR">
                        <xsl:value-of select="$response1//DATA/item/WA"/>
                   </xsl:element>
         </xsl:template>
    My Question: Am I doing anything wrong? Or Is it possible to call multiple lookups in one XSLT?
    Thanks and Regards,
    Atul

    Hi Atul,
    I had the same problem like you had.
    The main Problem is that with the example code the request variable is created as NodeList object. In XSLT a variable is somekind of a constant and can't be changed. As the request object is empty after the first request the programm fails at the following line:
    Source source = new DOMSource(request.item(0));
    So I've created a workaround for this problem.
    In the call of the template I've put the request as a parameter object at the template call:
    <xsl:with-param name="req">
    <rfc:PLM_EXPLORE_BILL_OF_MATERIAL xmlns:rfc="urn:sap-com:document:sap:rfc:functions">
      <APPLICATION>Z001</APPLICATION>
      <FLAG_NEW_EXPLOSION>X</FLAG_NEW_EXPLOSION>
      <MATERIALNUMBER><xsl:value-of select="value"/></MATERIALNUMBER>
      <PLANT>FSD0</PLANT>
      <VALIDFROM><xsl:value-of select="//Recordset/Row[name='DTM-031']/value"/></VALIDFROM>
      <BOMITEM_DATA/>
    </rfc:PLM_EXPLORE_BILL_OF_MATERIAL>
    </xsl:with-param>
    With this change the request will be provided as a String object and not as a NodeList object.
    Afterwards the RfcLookup.java has to be changed to the following:
    package com.franke.mappings;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.util.Map;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.Source;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import com.sap.aii.mapping.lookup.Channel;
    import com.sap.aii.mapping.api.StreamTransformationConstants;
    import com.sap.aii.mapping.api.AbstractTrace;
    import com.sap.aii.mapping.lookup.RfcAccessor;
    import com.sap.aii.mapping.lookup.LookupService;
    import com.sap.aii.mapping.lookup.XmlPayload;
    * @author Thorsten Nordholm Søbirk, AppliCon A/S
    * Helper class for using the XI Lookup API with XSLT mappings for calling RFCs.
    * The class is generic in that it can be used to call any remote-enabled
    * function module in R/3. Generation of the XML request document and parsing of
    * the XML response is left to the stylesheet, where this can be done in a very
    * natural manner.
    * TD:
    * Changed the class that request is sent as String, because of IndexOutOfBound-exception
    * When sending multiple requests in one XSLT mapping.
    public class RfcLookup {
         * Execute RFC lookup.
         * @param request RFC request - TD: changed to String
         * @param service name of service
         * @param channelName name of communication channel
         * @param inputParam mapping parameters
         * @return Node containing RFC response
         public static Node execute( String request,
                 String service,
                 String channelName,
                 Map inputParam)
              AbstractTrace trace = (AbstractTrace) inputParam.get(StreamTransformationConstants.MAPPING_TRACE);
              Node responseNode = null;
              try {
                  // Get channel and accessor
                  Channel channel = LookupService.getChannel(service, channelName);
                  RfcAccessor accessor = LookupService.getRfcAccessor(channel);
                   // Serialise request NodeList - TD: Not needed anymore as request is String
                   /*TransformerFactory factory = TransformerFactory.newInstance();
                   Transformer transformer = factory.newTransformer();
                   Source source = new DOMSource(request.item(0));
                   ByteArrayOutputStream baos = new ByteArrayOutputStream();
                   StreamResult streamResult = new StreamResult(baos);
                   transformer.transform(source, streamResult);*/
                    // TD: Add xml header and remove linefeeds for the request string
                    request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+request.replaceAll("[\r\n]+", ""); 
                    // TD: Get byte Array from request String to send afterwards
                    byte[] requestBytes = request.getBytes();
                   // TD: Not used anymore as request is String
                    //byte[] requestBytes = baos.toByteArray();
                    trace.addDebugMessage("RFC Request: " + new String(requestBytes));
                    // Create input stream representing the function module request message
                    InputStream inputStream = new ByteArrayInputStream(requestBytes);
                    // Create XmlPayload
                    XmlPayload requestPayload =LookupService.getXmlPayload(inputStream);
                    // Execute lookup
                    XmlPayload responsePayload = accessor.call(requestPayload);
                    InputStream responseStream = responsePayload.getContent();
                    TeeInputStream tee = new TeeInputStream(responseStream);
                    // Create DOM tree for response
                    DocumentBuilder docBuilder =DocumentBuilderFactory.newInstance().newDocumentBuilder();
                    Document document = docBuilder.parse(tee);
                    trace.addDebugMessage("RFC Response: " + tee.getStringContent());
                    responseNode = document.getFirstChild();
              } catch (Throwable t) {
                   StringWriter sw = new StringWriter();
                   t.printStackTrace(new PrintWriter(sw));
                   trace.addWarning(sw.toString());
              return responseNode;
         * Helper class which collects stream input while reading.
         static class TeeInputStream extends InputStream {
               private ByteArrayOutputStream baos;
               private InputStream wrappedInputStream;
               TeeInputStream(InputStream inputStream) {
                    baos = new ByteArrayOutputStream();
                    wrappedInputStream = inputStream;
               * @return stream content as String
               String getStringContent() {
                    return baos.toString();
              /* (non-Javadoc)
              * @see java.io.InputStream#read()
              public int read() throws IOException {
                   int r = wrappedInputStream.read();
                   baos.write(r);
                   return r;
    Then you need to compile and upload this class and it should work.
    I hope that this helps you.
    Best regards
    Till

  • XSLT Mapping of Adapter-Specific Message Attributes

    Hi,
    We have the requirement to build a soap request with a custom soap envelop/header which contains a sessionId.
    Therefore we developed a xlst mapping which is called directly after a graphical mapping.
    In the graphical mapping the session id is written to the dynamic configuration.
    The goal is to read this session id in the xslt mapping from the dynamic configuration using XSLT Mapping of Adapter-Specific Message Attributes. We used  [this|http://help.sap.com/saphelp_nwpi711/helpdata/en/43/03fe1bdc7821ade10000000a1553f6/content.htm] documentation as an example.
    But we are getting the following error: TransformerConfigurationException triggered while loading XSLT mapping. The error is raised at this node: <xsl:variable name="dynamic-conf" select="map:get($inputparam, 'DynamicConfiguration')" />
    This is the coding of the xslt transformation:
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:ns1="urn:enterprise.soap.sforce.com"
          xmlns:map="java:java.util.Map"
          xmlns:dyn="java:com.sap.aii.mapping.api.DynamicConfiguration"
          xmlns:key="java:com.sap.aii.mapping.api.DynamicConfigurationKey">
    <xsl:output indent="no" />
    <xsl:param name="inputparam"/>
    <xsl:template match="/">
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com">
    <soapenv:Header>
    <urn:SessionHeader>
    <xsl:variable name="dynamic-conf" select="map:get($inputparam, 'DynamicConfiguration')" />
    <xsl:variable name="dynamic-key" select="key:create('http://sap.com/xi/XI/System/SOAP', 'sessionId')" />
    <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />
    <urn:sessionId><xsl:value-of select="$dynamic-value"></xsl:value-of></urn:sessionId>
    </urn:SessionHeader>
    </soapenv:Header>
    <soapenv:Body>
    <xsl:copy-of select="*"/>
    </soapenv:Body>
    </soapenv:Envelope>
    </xsl:template>
    </xsl:stylesheet>
    Any help will be highly appreciated.
    Regards, Henk

    Hi, yes we did try that and lot's of other combination.
    The results of those trials are that it seems to go wrong with <xsl:variable name="dynamic-conf" select="map:get($inputparam, 'DynamicConfiguration')" />
    When we enclose it with <xsl:if test="function-available('map:get')"> the transformation is not dumping, but the function is not available.
    Regards, Henk

  • XSLT Mapping issue

    Hello Friends,
    I have got one scenario in which XSLT mapping is used.The third party file is mapped to IDoc INVOIC01.After the development of the mapping code,I got the result as below in the XML Spy
    <E1EDP01 SEGMENT="1">* first segment
                   <POSEX>0</POSEX>
                   <E1EDP02 SEGMENT="1"> Subsegment1
                        <QUALF>001</QUALF>
                   </E1EDP02>
                   <E1EDP04 SEGMENT="1"> Subsegment2
                        <MWSKZ></MWSKZ>
                        <MSATZ>22.00</MSATZ>
                        <MWSBT>6.660</MWSBT>
                   </E1EDP04>
                   <E1EDP04 SEGMENT="1">Subsegment2
                        <MWSKZ></MWSKZ>
                        <MSATZ>22.00</MSATZ>
                        <MWSBT>13.330</MWSBT>
                   </E1EDP04>
              </E1EDP01>
              <E1EDP01 SEGMENT="1">
                   <POSEX>0</POSEX>
                   <E1EDP02 SEGMENT="1">
                        <QUALF>001</QUALF>
                   </E1EDP02>
                   <E1EDP04 SEGMENT="1">
                        <MWSKZ></MWSKZ>
                        <MSATZ>22.00</MSATZ>
                        <MWSBT>6.660</MWSBT>
                   </E1EDP04>
                   <E1EDP04 SEGMENT="1">
                        <MWSKZ></MWSKZ>
                        <MSATZ>22.00</MSATZ>
                        <MWSBT>13.330</MWSBT>
                   </E1EDP04>
              </E1EDP01>
    But the expected result is as below:
                                <E1EDP01 SEGMENT="1">
                   <POSEX>0</POSEX>
                   <E1EDP02 SEGMENT="1">
                        <QUALF>001</QUALF>
                   </E1EDP02>
                   <E1EDP04 SEGMENT="1">
                        <MWSKZ></MWSKZ>
                        <MSATZ>22.00</MSATZ>
                        <MWSBT>6.660</MWSBT>
                   </E1EDP04>
              </E1EDP01>
              <E1EDP01 SEGMENT="1">
                   <POSEX>0</POSEX>
                   <E1EDP02 SEGMENT="1">
                        <QUALF>001</QUALF>
                   </E1EDP02>
                   <E1EDP04 SEGMENT="1">
                        <MWSKZ></MWSKZ>
                        <MSATZ>22.00</MSATZ>
                        <MWSBT>13.330</MWSBT>
                   </E1EDP04>
              </E1EDP01>
    ie For each E1EDP01 segment,there should be only one E1EDP04 segment.
    Please help me in this regard how to code the xslt map for this...
    Thank you
    Sam
    Edited by: Guest on Apr 4, 2008 1:00 PM

    Hello Ashish,
    Thanks for your reply.
    The third party system is th sender and sends XSD file which contains header detail (with multiple tax details in it) and multiple line Item details (which contains one tax details per lineitem).
    ie if there are two line items then each line item should have one tax details (1st tax detail in header should match with 1st tax details of linitem, and 2nd should match with second line item tax details..etc)
    <?xml version="1.0" encoding="UTF-8"?>
    <INVOIC01 xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <IDOC BEGIN="1">
              <E1EDK04 SEGMENT="1">
                   <MWSKZ>VAT</MWSKZ>
                   <MSATZ>22.00</MSATZ>
                   <MWSBT>6.660</MWSBT>
              </E1EDK04>
              <E1EDK04 SEGMENT="1">
                   <MWSKZ>VAT</MWSKZ>
                   <MSATZ>22.00</MSATZ>
                   <MWSBT>13.330</MWSBT>
              </E1EDK04>
              <E1EDP01 SEGMENT="1">
                   <POSEX>0</POSEX>
                   <E1EDP04 SEGMENT="1">
                        <MWSKZ>VAT</MWSKZ>
                        <MSATZ>22.00</MSATZ>
                        <MWSBT>6.660</MWSBT>
                   </E1EDP04>
              </E1EDP01>
              <E1EDP01 SEGMENT="1">
                   <POSEX>0</POSEX>
                   <E1EDP04 SEGMENT="1">
                                   <MWSKZ>VAT</MWSKZ>
                                   <MSATZ>22.00</MSATZ>
                                   <MWSBT>13.330</MWSBT>
                   </E1EDP04>
              </E1EDP01>
         </IDOC>
    </INVOIC01>
    I thinks this is like a copying th header segment details in the item details.
    Please help me in ths regard
    Thank you
    Sam

  • XSLT mapping code to replace ns1: tag as plm: in XML file in PI mapping

    Hi
    I am sending XML file to HTTP server as below format
    <?xml version="1.0" encoding="UTF-8" ?>
       - <ns1:Responses xmlns:ns1="http://">
    -    <ns1:Response Application="SAP">
        <ns1:field1>12345</ns1:field1>
        <ns1:field2>abc</ns1:field2>
       - <ns1:Items>
        <ns1:doc></ns1:doc>
      </ns1:Items>
      </ns1:Response>
      </ns1:Responses>
    i hve to replace <ns1: as <plm:, i could able to delete <ns1: tag uisng XSLT mapping(in sdn), but i dont know how to add tag with <plm:
    Hi XSLT experts/if any has come across this requirment, please send XSLT code to add tag in XML.
    Regards,
    Rajesh

    No need for XSLT, just use the XMLAnonymizerBean module in your receiver communication channel.
    http://help.sap.com/saphelp_nw70/helpdata/EN/45/d169186a29570ae10000000a114a6b/frameset.htm
    /people/stefan.grube/blog/2007/02/02/remove-namespace-prefix-or-change-xml-encoding-with-the-xmlanonymizerbean
    If your receiver CC cannot process modules (ABAP receiver, for example), in your XSLT just define the target namespace with the desired prefix.
    Regards,
    Henrique.

  • Xslt mapping in Imported archieves

    Hi all,
    The requirement is that I need to use XSLT mapping for this I created message mapping copied as a .xslt file and imported in the imported archeives and then I removed the message mapping .
    The problem is that when I try to use this XSLT mapping under the interface mapping as XSLT option I am getting a warning "message mapping name has no program"
    Please let me know why this is  happening.
    Thanks,
    Sri

    Hi,
    as you said:
    choose XSLT mapping
    then choose your XSLT mapping name
    save and activate
    Regards,
    michal

  • XSLT mapping sometimes throw ArrayOutOfBoundsException

    Hi
    I have a simple XSLT mapping that is supposed to group elements based on an identificator (number).
    My issue is that when testing message through PI, it sometimes throw ArrayOutOfBoundsException and sometimes not, with the same records involved..!!
    I have tested it all in XML Spy and there it always works.
    The XSLT looks like this:
         <xsl:for-each select="Invoice_KA49">
              <xsl:variable name="Ident">
                   <xsl:value-of select="Identificator"/>
              </xsl:variable>
              <GroupElement>
                   <xsl:copy-of select="../[Identificator=$Ident]"/><!--../-->
              </GroupElement>
         </xsl:for-each>
    Anyone knows why this happens? Any help would be appreciated!
    Thanks.
    regards Ole

    Hi Ole, looks like you produce a document with duplicate entries which have to be removed in a next step. Maybe the duplicate entries blow up the document. When you want to group Invoice_KA49 elements based on the key Identifikator, as Udo already suggest you should only select distinct values in the for-each loop, e.g.
    <xsl:for-each select="//Invoice_KA49[Identifikator=not(./Identifikator=preceding-sibling::Invoice_KA49/Identifikator)]">
    In this way you do not produce duplicate entries.
    Unfortunately we cannot use the function
    distinct-value(..)
    here since it's only available in xslt 2.0.
    Best regards, Martin

  • XSLT mapping for fixed values

    Hi,
    i am doing a XSLT mapping. i have a field which has fixed values(can be performed using graphical mapping). but the same i am not able to implement for XSLT. can anyone give me a idea about this
    <removed by moderator>
    Thanks
    Deepika
    Edited by: Mike Pokraka on Jul 24, 2008 12:57 PM

    Step u2013 By u2013 Step Simple Approach for XSLT Mapping                         
    Step – By – Step Simple Approach for XSLT Mapping                         
    generic xslt mapping part 1                                             
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/01a57f0b-0501-0010-3ca9-d2ea3bb983c1                                             
    generic xslt mapping part2                                   
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/9692eb84-0601-0010-5ca0-923b4fb8674a                                             
    xslt recursive templates                                             
    XSLT: Recursive Templates
    regards
    kummari

  • How to call external java functions in XSLT Mapping Programs

    Hi All,
    I am unable to call java programs in XSLT MAPPING.
    I tried by following the blog...but getting error :
    XSLT Mapping With JAVA Enhancement ( For Beginners)
    I need some input from you all.
    Waiting For quick reply.
    Rgds Somu.

    i wrote the code...
    and getting error in interface mapping..
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:MyLib="java:datetime.DateandTime">
         <xsl:template match="/">
              <Order DocType="OrderCreate" Version="2.0.2">
                   <Header>
                        <RequestingDocumentIdentifier>
                             <DocumentIdentifier>
                                  <xsl:value-of select="concat('IDOC',//EDI_DC40/DOCNUM)"/>
                             </DocumentIdentifier>
                        </RequestingDocumentIdentifier>
                        <RequestingDocumentDateTime>
                             <DateTime DateTimeQualifier="On">
                                            <xsl:if test="function-available('MyLib:getDateValue')">
                       <xsl:value-of select="MyLib:getDateValue()"/>                   
      </xsl:if>
                                        </DateTime>
                        </RequestingDocumentDateTime>
                        <From>
                             <PartnerInformation>
                                   <PartnerName>BASF SA</PartnerName>
                                    <PartnerIdentifier Agency="AssignedByBASF">
                                     <xsl:value-of select="//E1EDK14[QUALF='014']/ORGID"/>
                                    </PartnerIdentifier>
                             </PartnerInformation>
                        </From>
                        <To>
                        <PartnerInformation>
                             <PartnerName>BASF CORP CHEM DIV</PartnerName>
                             <PartnerIdentifier Agency="D-U-N-S">001307032</PartnerIdentifier>
                        </PartnerInformation>
                   </To>
                   </Header>
              </Order>
         </xsl:template>
    </xsl:stylesheet>

Maybe you are looking for

  • Youtube Constantly Buffering: Wired and Wireless, Please Help

    Hi All, Hoping someone can shed some light on my issue.  I have a FIOS triple play bundle with 35/35 speeds.  When I run a speed test I typically see 42/38.  The problem starts when I go to watch Youtube videos on any of my 3 consoles.  I have an Xbo

  • Drop shadow for invisible object

    Just an idle thought... If an object has neither stroke nor fill, is it possible to trick Illustrator into generating a drop shadow for it? Michael mhphillips at gmail dot com

  • REPOST(JDEV TEAM) Kindly respond!!!

    SUBJECT: Strange Behavior in TOMCAT although it runs OK in Jdeveloper. This is actually a repost and I am hoping that someone would answer: I am encountering some strange behavior when I deploy my application to TOMCAT. If I run in JDeveloper (webtog

  • SSH hangs when LSNRCTL start

    Hi, When i give ssh -l finmasd3 asgard '. ./.profile; lsnrctl start APPS_masd3' from remote machine with valid access to the server It hangs and doesnt return. BUt listener is started in the remote machine. i have tried giving & in the end, and gave

  • How do you record sound with Apple headphones Mac Pro?

    (2008 Mac Pro)  I'm trying to record a voice over on iMovie, and it won't record sound no matter what option I use for the sound input.  I'm plugging my apple headphones into the headphone jack like I do on my MacBook (which works).  I know  that the