这个问题让我困惑了一段时间。我有一个带有段和标签标识符的平面文件。其中一个段是可选的。这很好,但我需要逻辑来确定这个段是否存在。如果它不存在,我需要做其他事情。如果该段存在,则所有工作都按计划进行。如果没有,BizTalk 似乎甚至无法识别或执行与该段相关的任何 functoid。
同样,如果段完全消失(意味着没有创建/翻译平面文件 xml 节点),则逻辑存在甚至不会执行。我试过脚本,functoids。我越来越相信这是映射器中的一个错误。任何帮助表示赞赏。
这个问题让我困惑了一段时间。我有一个带有段和标签标识符的平面文件。其中一个段是可选的。这很好,但我需要逻辑来确定这个段是否存在。如果它不存在,我需要做其他事情。如果该段存在,则所有工作都按计划进行。如果没有,BizTalk 似乎甚至无法识别或执行与该段相关的任何 functoid。
同样,如果段完全消失(意味着没有创建/翻译平面文件 xml 节点),则逻辑存在甚至不会执行。我试过脚本,functoids。我越来越相信这是映射器中的一个错误。任何帮助表示赞赏。
尝试使用Value Mapping
functoid 而不是Value Mapping (Flattening)
functoid。
还要确保值映射 functoid 的参数顺序正确。逻辑运算符必须是第一个参数。有时参数会出现故障,functoid 会按预期停止工作。
由于您的输入文件是平面文件,因此 FFDASM 正在创建一个空节点。运行的测试Logical Existence
在空节点上评估为真。 Logical String
应该在这里工作(我以前认为它会为空字符串返回true,但它不应该)。
但是,在这种情况下,我可能会将所有这些(包括值映射器)替换为 C# 脚本函数:
public string AllowIfNotEmpty(string test, string output)
{
if (!string.IsNullOrWhiteSpace(test))
return output;
return "";
}
给它当前链接到Logical String
第一个节点的输入,第二个输入给你的Value Mapping(flattening)
第二个,然后直接输出到你的目标节点。
如果它是您在多个地方使用的东西,您可以将其放入辅助程序集中。
如果您想将其保留为 XSLT,则可以执行自定义调用模板:
<xsl:template name="OutputIfNotEmpty">
<xsl:param name="test" />
<xsl:param name="output" />
<xsl:if test="normalize-space($test) != ''">
<xsl:element name="OutputElementName">
<xsl:value-of select="$output" />
</xsl:element>
</xsl:if>
</xsl:template>