我有一个字符串值列表,如'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?
我需要一方面分割值来创建多个结果行(通过循环),还需要每行中的值本身。
提前致谢。
在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() > $start and position() < $start + $size]">
<xsl:text>,</xsl:text>
<xsl:value-of select="text()" />
</xsl:for-each>
</LineValue>
</xsl:for-each>
</xsl:template>
输入[0]:
'123','456','789'
节点
我会用另一种方法。我没有尝试在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”是使这项工作的原因。