在WSO2 ESB代理服务中,我如何根据某些webservice响应中的整数值进行迭代,就像“foreach”一样:
例如此类响应消息:
<Response>
<noOfcustomers>10</noOfCustomers>
</Response>
我需要迭代10次(根据客户数量)
这可能吗?我怎样才能做到这一点?
感谢您的帮助!
答案 0 :(得分:2)
我没有找到一个干净的方法来做到这一点,但这是一个混乱的解决方案。
首先,您需要进行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 <= $count">
<iteration>
<xsl:value-of select="$i"/>
</iteration>
</xsl:if>
<!--begin_: RepeatTheLoopUntilFinished-->
<xsl:if test="$i <= $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>
然后你在序列中使用这样的变换:
<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>
迭代介体中的序列将针对“迭代”中的每个元素运行。这种方法的缺点是您正在使用迭代XML替换消息体,因此您必须在转换之前使用enrich meditor,以便在您希望重用它时将原始消息保存到属性。
答案 1 :(得分:0)
您可以基于xpath iterate。但目前我们没有反支持。你的实际用例是什么?
答案 2 :(得分:0)
ESB 4.9以后的ForEach调解员支持