循环使用BizTalk中的脚本functoid

问题描述 投票:0回答:2

我有一个字符串值列表,如'123','456','789'等。这个列表可能很长,有几千个项目。所以我必须将它分成最大块。 750项。 一个想法是编写一个自己的functoid,它分裂并返回一个loopable列表。也许它有点容易,我可以在脚本functoid中直接做。但是我收到了消息

`error btm1090: The "Looping" functoid has place holders. Replace these with appropriate links or constants.`

所以我不认为这是可能的。是否有可能在Scripting functoid中执行此操作,还是需要我自己的functoid?

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

BizTalk Map

提前致谢。

.net loops split biztalk biztalk-mapper
2个回答
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'节点


0
投票

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

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

<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”是使这项工作的原因。

© www.soinside.com 2019 - 2024. All rights reserved.