循环使用BizTalk中的脚本functoid

时间:2018-03-01 09:31:26

标签: .net loops split biztalk biztalk-mapper

我有一个字符串值列表,如 select t1.ID, t1.FEEDBACK_VALUE, ifnull( my_count,0) feedback_receive from table1 t1 left join ( select FEEDBACK_ID, count(*) as my_count from table 2 group by FEEDBACK_ID ) t on t1.ID = t.FEEDBACK_ID 等等。这个列表可能很长,有几千个项目。所以我必须将它分成最大块。 750项。
一个想法是编写一个自己的functoid,它分裂并返回一个loopable列表。也许它有点容易,我可以在脚本functoid中直接做。但是我得到了信息

'123','456','789'


所以我不认为这是可能的。是否有可能在Scripting functoid中进行,或者我是否需要自己的functoid?

我一方面需要分割值来创建多个结果行(通过循环),还需要每行中的值本身。

BizTalk Map

提前致谢。

2 个答案:

答案 0 :(得分:0)

在Scripting functoid中使用内联XSLT调用模板,您可以执行以下操作。

Functoid 1(独立):

<xsl:template name="SplitValues">
  <xsl:param name="value" />

  <xsl:variable name="part" select="substring-before($value, ',')" />

  <xsl:if test="$part != ''">
    <v><xsl:value-of select="$part" /></v>

    <xsl:call-template name="SplitValues">
      <xsl:with-param name="value" select="substring-after($value, ',')" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>

Functoid 2:            

  <xsl:variable name="split">
    <xsl:call-template name="SplitValues">
      <xsl:with-param name="value" select="$value" />
    </xsl:call-template>
  </xsl:variable>

  <xsl:variable name="set" select="msxsl:node-set($split)" />
  <xsl:variable name="size" select="750" />

  <xsl:for-each select="$set/v[position() mod $size = 1]">
    <xsl:variable name="start" select="(position() - 1) * $size + 1" />

    <LineValue>
      <xsl:value-of select="text()" />

      <xsl:for-each select="$set/v[position() &gt; $start and position() &lt; $start + $size]">
        <xsl:text>,</xsl:text>
        <xsl:value-of select="text()" />
      </xsl:for-each>
    </LineValue>
  </xsl:for-each>
</xsl:template>
  

输入[0]:'123','456','789'节点

答案 1 :(得分:0)

我会使用不同的方法。我没有尝试在Xsl中进行限制循环,而是在C#函数中生成所有Xml,这非常简单。

步骤1,编写一些创建所需Xml输出的C#:

<LineValue>'1','2','3',...,'749','750'</LineValue>
<LineValue>'751','752','753',...,'1499','1500'</LineValue>
<LineValue>'1501','1502','1503',...,'2249','2250'</LineValue>

外部装配通常是首选,但内联工作也一样。但是,它确实没关系,只需将此Xml作为字符串返回。

第2步,你需要的唯一'技巧'是通过Xslt模板传递C#输出,因此它被视为Xml,而不是String内容。

<xsl:template name="MyXsltConcatTemplate">
     <xsl:param name="param1" />
     <xsl:element name="field">
          <xsl:value-of select="$param1" disable-output-escaping="yes" />
     </xsl:element>
</xsl:template>

disable-output-escaping =“yes”是让这项工作的原因。