cancel
Showing results for 
Search instead for 
Did you mean: 

Soap Header data using XSLT

suchitatomar
Participant
0 Kudos

Dear Scn Guys,


I have requirement to add data to below in the Soap header part using a XSLT file.


Can somebody help me with the requirement.


<SOAP-ENV:Header xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:#### ="http://www.####.ca/fw/serviceHeaders">

      <wsa:To/>

   <wsa:From>

  <wsa:Address/>

   </wsa:From>

   <wsa:ReplyTo>

  <wsa:Address/>

   </wsa:ReplyTo>

   <wsa:FaultTo>

  <wsa:Address/>

   </wsa:FaultTo>

   <wsa:Action/>

   <wsa:MessageID/>

      <wsse:Security xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

         <wsu:Timestamp>

            <wsu:Created>2016-3-4T11:49:7</wsu:Created>

  <wsu:Expires/>

         </wsu:Timestamp>

  <wsse:UsernameToken>

  <wsse:Username/>

  <wsse:Password/>

  <wsse:Nonce/>

  </wsse:UsernameToken>

      </wsse:Security>

   <nbfgh:serviceContext>

  <clientCode/>

  <partnerCode/>

  <userProfile/>

  <locale/>

  <prevMsgId/>

   </nbfgh:serviceContext>

   <nbfgh:executionMode>

  <mockWhere/>

  <mockType/>

   </nbfgh:executionMode>

   </SOAP-ENV:Header>

Regards

S Tomar

Accepted Solutions (1)

Accepted Solutions (1)

bhavesh_kantilal
Active Contributor
0 Kudos

This looks like a ws security soap header.

This can be natively inserted using the soap adapter. No need to write a xslt mapping for the same.

Security Settings for the Receiver SOAP Adapter - Integration Directory - SAP Library

Regards

Bhavesh

Message was edited by: Bhavesh Kantilal- typo error fixed

suchitatomar
Participant
0 Kudos

Hi SCN Guys,

still not abe to resolve the problem  as getting mapping error in XSLT Transformation when i had  added below code for header part to my existing XSL.

Note : This is an receiver JMS adapter and header values are dynamically fetched at runtime for which I need a piece of XSL code( Header part only) rest my code is giving the expected outputs.

Code used in mapping to fetch values at runtime (PFB snap shot) so i need to call somehow this function library output in XSL code.

Could some please help....!! 😞 to resolve my query

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:strip-space elements="*"/>

  <xsl:template match="/">

  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

<xsl:template match="/*[local-name()='Envelope']/*[local-name()='Header']">

  <SOAP-ENV:Header>

   <xsl:call-template name="ESBHeader"></xsl:call-template>

   <xsl:call-template name="ContextHeader"></xsl:call-template>

  </SOAP-ENV:Header>

  </xsl:template>

  <xsl:template name="ESBHeader">

  <xsl:variable name="Headeradfad">

   <head:ESBHeader >

  <head:ESBProps>

  <head:Property>

  <head:name/>

  <head:value/>

  </head:Property>

  </head:ESBProps>

  </head:ESBHeader>

  </xsl:variable>

    <xsl:copy-of select="$Headeradfad"></xsl:copy-of>

  </xsl:template>

  <xsl:template name="ContextHeader">

  <con:Context >

  <con:CtxProps>

  <con:Property>

  <con:name/>

  <con:value/>

  </con:Property>

  </con:CtxProps>

  </con:Context>

  </xsl:template>

</xsl:stylesheet>

       <SOAP-ENV:Body>

  <xsl:copy-of select="." />

  </SOAP-ENV:Body>

  </SOAP-ENV:Envelope>

  </xsl:template>

</xsl:stylesheet>

suchitatomar
Participant
0 Kudos

Hi Guys,

Can someone provide some inputs or helpful links for above.

Your quick response on same shall be appreciated.

Regards

S Tomar

iaki_vila
Active Contributor
0 Kudos

Hi Tomar,

If you provide an example from the source and target, we can help you better.

Regards.

suchitatomar
Participant
0 Kudos

Hi Inki,

Thanks for your prompt response 🙂

Note:  User-defined function in Message Mapping to access header information for Receiver JMS adapter  is accessible through the Global Container object ( Screen shot already shared above)

Please find below  structure.

Output

former_member186851
Active Contributor
0 Kudos

Tomar I didnt understand one thing.

You are using an UDF or XSLT?

am seeing functional library screenshot.

suchitatomar
Participant
0 Kudos

Hey Ragu,

Scenario is WS(Sender) Channel ----> JMS (Receiver) [Create Soap Envelope Functionality in ESR ]

we are introducing XSL code just after message mapping to Create Soap envelope structure, wherein to get below output for header tag we need to call the User-defined function somehow of  Message Mapping to access header information for Receiver JMS adapter which is accessible through the Global Container object (Already it was previously coded in existing message mapping)

<SOAP-ENV:Header xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:#### ="http://www.####.ca/fw/serviceHeaders">

      <wsa:To/>

   <wsa:From>

  <wsa:Address/>

   </wsa:From>

   <wsa:ReplyTo>

  <wsa:Address/>

   </wsa:ReplyTo>

   <wsa:FaultTo>

  <wsa:Address/>

   </wsa:FaultTo>

   <wsa:Action/>

   <wsa:MessageID/>

      <wsse:Security xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

         <wsu:Timestamp>

            <wsu:Created>2016-3-4T11:49:7</wsu:Created>

  <wsu:Expires/>

         </wsu:Timestamp>

  <wsse:UsernameToken>

  <wsse:Username/>

  <wsse:Password/>

  <wsse:Nonce/>

  </wsse:UsernameToken>

      </wsse:Security>

   <nbfgh:serviceContext>

  <clientCode/>

  <partnerCode/>

  <userProfile/>

  <locale/>

  <prevMsgId/>

   </nbfgh:serviceContext>

   <nbfgh:executionMode>

  <mockWhere/>

  <mockType/>

   </nbfgh:executionMode>

   </SOAP-ENV:Header>

former_member186851
Active Contributor
0 Kudos

Hello Tomar,

I guess you have some dyanmic parameter which needs to be added in the XSLT Header?

If am correct refer the below link and check if it works

suchitatomar
Participant
0 Kudos

Hi Ragu,

Thanks for your input 🙂

but is there is no way to do it by XSL code ??  like i read some threads to change dynamic config values and get session ID in Soap header (refer Snap shot)

So can we do same for SOAP header output tags <wsa>,<<wsse>  for which below set and get functions are already written and present in global containers and called during message mapping .

setDynConfStatus

setJmsAsma

setGenericAsma

setSOAPheaderAttr

getSOAPheaderAttr

suppressNode

cleanUp

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
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="/">

<!-- change dynamic configuration -->
<xsl:variable name="dynamic-conf"
select="map:get($inputparam, 'DynamicConfiguration')" />
<xsl:variable name="dynamic-key"
select="key:create('http://sap.com/xi/XI/System/File', 'Directory')" />
<xsl:variable name="dynamic-value"
select="dyn:get($dynamic-conf, $dynamic-key)" />
<xsl:variable name="new-value"
select="concat($dynamic-value, 'subfolder\')" />
<xsl:variable name="dummy"
select="dyn:put($dynamic-conf, $dynamic-key, $new-value)" />

<!-- copy payload -->
<xsl:copy-of select="." />
</xsl:template>

</xsl:stylesheet>


__________________________________________________________________


Code to get Session ID in Soap Header

####################################




<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>

former_member186851
Active Contributor
0 Kudos

Hello Tomar,

some values are possible using XSL.Some or not.

suchitatomar
Participant
0 Kudos

Hi All experts,

Special vote of thanks to Inaki,Ragu,Bhavesh for providing helpful links and inputs.

I had solved below query with  XSLT  for Soap header as it was easy doing this way..!!

Regards

Suchita Tomar

suchitatomar
Participant
0 Kudos

Below is the code ... sharing it so that it can be helpful for others too as i tested it and it's showing the results..

Closing the thread..!!

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

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 method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:param name="inputparam"/>

  <xsl:template match="/">

  <xsl:variable name="dynamic-conf" select="map:get($inputparam, 'DynamicConfiguration')" />

  <xsl:variable name="config-namespace" select="'http://www.nbfg.ca/pi/async/soapHeader/dynamic/config'" />

  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

  <SOAP-ENV:Header xmlns:nbfgh="http://www.nbfg.ca/fw/serviceHeaders" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsa:To')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <wsa:To>

  <xsl:value-of select="$dynamic-value"/>

  </wsa:To>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsa:From')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <wsa:From>

  <wsa:Address>

  <xsl:value-of select="$dynamic-value"/>

  </wsa:Address>

  </wsa:From>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsa:ReplyTo')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <wsa:ReplyTo>

  <wsa:Address>

  <xsl:value-of select="$dynamic-value"/>

  </wsa:Address>

  </wsa:ReplyTo>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsa:FaultTo')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <wsa:FaultTo>

  <wsa:Address>

  <xsl:value-of select="$dynamic-value"/>

  </wsa:Address>

  </wsa:FaultTo>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsa:Action')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <wsa:Action>

  <xsl:value-of select="$dynamic-value"/>

  </wsa:Action>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsa:MessageID')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <wsa:MessageID>

  <xsl:value-of select="$dynamic-value"/>

  </wsa:MessageID>

  <wsse:Security xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

  <wsu:Timestamp>

  <wsu:Created></wsu:Created>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsu:Expires')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <wsu:Expires>

  <xsl:value-of select="$dynamic-value"/>

  </wsu:Expires>

  </xsl:if>

  </wsu:Timestamp>

  <wsse:UsernameToken>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsse:Username')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <wsse:Username>

  <xsl:value-of select="$dynamic-value"/>

  </wsse:Username>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsse:Password')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <wsse:Password>

  <xsl:value-of select="$dynamic-value"/>

  </wsse:Password>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'wsse:Nonce')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <wsse:Nonce>

  <xsl:value-of select="$dynamic-value"/>

  </wsse:Nonce>

  </xsl:if>

  </wsse:UsernameToken>

  </wsse:Security>

  <nbfgh:serviceContext>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'nbfgh:clientCode')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <clientCode>

  <xsl:value-of select="$dynamic-value"/>

  </clientCode>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'nbfgh:partnerCode')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <partnerCode>

  <xsl:value-of select="$dynamic-value"/>

  </partnerCode>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'nbfgh:userProfile')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <userProfile>

  <xsl:value-of select="$dynamic-value"/>

  </userProfile>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'nbfgh:locale')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <locale>

  <xsl:value-of select="$dynamic-value"/>

  </locale>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'nbfgh:prevMsgId')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <prevMsgId>

  <xsl:value-of select="$dynamic-value"/>

  </prevMsgId>

  </xsl:if>

  </nbfgh:serviceContext>

  <nbfgh:executionMode>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'nbfgh:mockWhere')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <mockWhere>

  <xsl:value-of select="$dynamic-value"/>

  </mockWhere>

  </xsl:if>

  <xsl:variable name="dynamic-key" select="key:create($config-namespace, 'nbfgh:mockType')" />

  <xsl:variable name="dynamic-value" select="dyn:get($dynamic-conf, $dynamic-key)" />

  <xsl:if test="$dynamic-value != ''">

  <mockType>

  <xsl:value-of select="$dynamic-value"/>

  </mockType>

  </xsl:if>

  </nbfgh:executionMode>

  </SOAP-ENV:Header>

  <SOAP-ENV:Body>

  <xsl:copy-of select="." />

  </SOAP-ENV:Body>

  </SOAP-ENV:Envelope>

  </xsl:template>

</xsl:stylesheet>

former_member186851
Active Contributor
0 Kudos

Great Tomar.

Please close the thread.

iaki_vila
Active Contributor
0 Kudos

Hi Tomar,

Thank you for sharing your final XSLT, with this behaviour we will have a better and more helpful community.

Regards.

Answers (2)

Answers (2)

iaki_vila
Active Contributor
0 Kudos

Hi Tomar,

First of all you should mark the checkbox do not use SOAP envelope, then you can construct manually the SOAP tags. If you have a tag that you don't need to map anything simply set the tag in the XSLT and the XSLT processor will write it.

Check these links to know more:

Regards.

suchitatomar
Participant
0 Kudos

Hi Thanks Inaki for sharing link ,seems to me they will be helpful i"ll go through and hopefully requirement will be fulfilled.

former_member186851
Active Contributor
0 Kudos

Tomar to can add in that code as well.

I guess you got additional links as well from Inaki.Let us know if you face any issues.

iaki_vila
Active Contributor
0 Kudos

Hi,

We will expect your feedback if you can solve your scenario or not.

Regards.

former_member186851
Active Contributor
0 Kudos
suchitatomar
Participant
0 Kudos

Hi Raghu,

Thanks for your prompt reply 🙂 , but I want to insert code for header(in below) such that above tags and its data is there in the output xml ,once the xslt is executed

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>

<xsl:strip-space elements="*"/>

  <xsl:template match="/">

  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

  <SOAP-ENV:Header>

  </SOAP-ENV:Header>

  <SOAP-ENV:Body>

  <xsl:copy-of select="." />

  </SOAP-ENV:Body>

  </SOAP-ENV:Envelope>

  </xsl:template>

</xsl:stylesheet>