Yes. You can do this in one step. I had done this in a project before: Here is the steps you can follow:
1. ws1 and ws2 are both have "endpoints" defined in the ESB.
2. In the ws1 proxy, define a target inSequence to point to a "sequence"
for example "ws1InSequence"
3. In the "ws1InSequence", you can use <filter> to make sure the value is exists.
Then you can <send> to the ws1 <endpoint> with "receive" attribute point to
a sequence for example "ws1ResultSequence"
4. In the ws1ResultSequence, you can again use the <filter> to make sure
it has the parameter/value you need. Then you can use param/value to format a request message.
<payloadFactory>
<format>
<ns1: ws2Operation
xmlns:ns1="ws2Namespace">
<element1 xmlns="">$1</element1>
<!-- Note $1 will have the //paramName value from the ws1 Result message -->
<element2 xmlns="">$2</element2>
<!-- Note $2 will have the //paramName2 value from the ws1 Result message -->
</format>
<args>
<arg expression="//paramName" />
<arg expression="//paramName2" />
</args>
</payloadFactory>
5. Still in ws1ResultSequence, after you create the request message,
you <send> it to the ws2 proxy. Then in the ws2 proxy, in the <outSequence>
you can juse use <send/> to send the response to the client.
Note, you may need to include exception(faultSequence) handling.
WSO2ESB use Apache Synapse for the configuration. You can find most of the syntax and example usages in their doc: http://synapse.apache.org/userguide/config.html
UPDATE: You can use this as an example. NOTE, this may not be the completed code as you need, and you may need to add exception handling.
<sequence xmlns="http://ws.apache.org/ns/synapse" name="ws1ResultSequence"
trace="enable" onError="ws1ResultSequenceErrorHandler">
<log level="custom">
<property name="sequence" value="INVOCATION START: ws1ResultSequence" />
</log>
<!-- record the original message for future reference -->
<enrich>
<source clone="true" type="envelope" />
<target action="replace" type="property" property="ORIGINAL" />
</enrich>
<!-- Check if the ws1 result message has the value -->
<property
xmlns:ns1="ws1Namespace"
name="valueExists" expression="//ns1:element1" />
<!--Note here, element1 is the element name which has the value: output1 -->
<filter xpath="fn:boolean( get-property('valueExists') )">
<then>
<!-- create the request message to invoke ws2 -->
<payloadFactory>
<format>
<ns1:ws2OperationName
xmlns:ns1="ws2Namespace">
<element2 xmlns="">$1</element2>
</ns1:ws2OperationName>
</format>
<args>
<arg expression="//ns1:element1" />
</args>
</payloadFactory>
<log level="custom">
<property name="inInvokeWS2" value="INVOCATION START: value from ws1 result exists" />
</log>
<send>
<endpoint key="ws2Sequence" />
</send>
<drop/>
</then>
</filter>
<!-- No result value found from the ws1 result message -->
<send>
<endpoint key="DoSomethingElseOrThrowError" />
</send>