2013-05-29 16 views
5

Nel servizio WSO2 ESB Proxy, come posso iterare in base al valore intero da qualche risposta webservice, proprio come "foreach":funzione foreach WSO2 ESB

Per esempio come messaggio di risposta:

<Response> 
    <noOfcustomers>10</noOfCustomers> 
</Response> 

I necessità di iterare 10 volte (in base al numero di clienti)

È possibile? Come posso raggiungere questo obiettivo?

Grazie per il vostro aiuto!

risposta

0

È possibile iterate basato su xpath. Ma al momento non abbiamo controsupporto. Qual è il tuo attuale caso?

+0

Grazie per la risposta. Devo inviare una richiesta di credito con un determinato numero di commissioni (ad esempio 10 mesi), quindi se la richiesta di credito è approvata per il servizio web esterno, devo inviare 10 messaggi per creare ogni informazione di pagamento: data di pagamento, pagamento minimo, pagamento scadenza, ecc. – user2400243

+0

Ratha qualche idea? – user2400243

+0

È necessario utilizzare il mediatore del clone? http://docs.wso2.org/wiki/display/ESB451/Clone+Mediator – Ratha

2

Non ho trovato un modo pulito per farlo, ma ecco una soluzione disordinata.

Per prima cosa è necessaria una trasformazione XSLT.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="xsl xsi"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:param name="iterations"/> 
    <xsl:template name="for.loop"> 
     <xsl:param name="i"/> 
     <xsl:param name="count"/> 
     <!--begin_: Line_by_Line_Output --> 
     <xsl:if test="$i &lt;= $count"> 
      <iteration> 
       <xsl:value-of select="$i"/> 
      </iteration> 
     </xsl:if> 
     <!--begin_: RepeatTheLoopUntilFinished--> 
     <xsl:if test="$i &lt;= $count"> 
      <xsl:call-template name="for.loop"> 
       <xsl:with-param name="i"> 
        <xsl:value-of select="$i + 1"/> 
       </xsl:with-param> 
       <xsl:with-param name="count"> 
        <xsl:value-of select="$count"/> 
       </xsl:with-param> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 
    <xsl:template match="/"> 
     <iterations> 
      <xsl:call-template name="for.loop"> 
       <xsl:with-param name="i">1</xsl:with-param> 
       <xsl:with-param name="count"><xsl:value-of select="$iterations"/></xsl:with-param> 
      </xsl:call-template> 
     </iterations> 
    </xsl:template> 
</xsl:stylesheet> 

quindi si utilizza la trasformazione in sequenza come questa:

<inSequence> 
    <xslt key="conf:/repository/test/iterations.xslt"> 
     <property name="iterations" expression="//noOfcustomers"/> 
    </xslt> 
    <iterate expression="//iterations/iteration" sequential="true"> 
     <target> 
      <sequence> 

      </sequence> 
     </target> 
    </iterate> 
</inSequence> 

La sequenza il mediatore iterata avrà una durata di ogni elemento in "iterazioni". Lo svantaggio di questo approccio è che si sta sostituendo il corpo del messaggio con l'XML di iterazione, quindi è necessario utilizzare il mediatore di arricchimento prima della trasformazione per salvare il messaggio originale in una proprietà se si desidera riutilizzarlo.

+0

Grazie Chris !! fammi provare questa soluzione! – user2400243

+0

Questo è in realtà un modo molto intelligente per farlo. – zygimantus

0

Questo è supportato con il mediatore ForEach da ESB 4.9 in poi

+0

Ne dubito. ForEach ha anche bisogno di un'espressione xpath per funzionare. – zygimantus

+0

Sì, non esiste alcun modo per iterare sul contatore nel payload. Tuttavia c'è FOREACH_COUNTER che ti aiuterà a tenere traccia del numero di iterazioni che stanno accadendo. – maheeka