我是BRE的新手,对整个BizTalk来说还是个新手,所以这可能很简单,只是回避我......
我想要做的是:在BRE中创建一个业务规则,将传入消息作为输入,并检查消息中包含的值是否与指定值集中的任何值匹配。示例消息如下。然后会相应地更新<isFound>
字段。
<n1:DocumentTemplate xmlns:n1="mynamespace">
<rootOid>2.16.840.1.113883.3.51.60.2.5</rootOid>
<isFound>false</isFound>
</n1:DocumentTemplate>
基本上我想将<rootOid>
节点与值列表进行匹配。我已经创建了一个将<rootOid>
与业务规则条件中的硬编码值相匹配的业务...作为概念证明,了解如何使用BRE并调用规则的基础知识在编排中。
除了在业务规则的“条件”中执行大量硬编码OR列表之外,我没有找到匹配值列表的方法。接受的值列表足够大,以至于无法执行大量的OR。
理想情况下,我希望在业务规则中检查一个可维护的XML文件,其中包含可接受的<rootOid>
值。
我也意识到有一种方法可以调用数据库并从表/列中读取值以进行匹配,但我宁愿将SQL排除在等式之外,以便这可以更加自包含。
答案 0 :(得分:1)
一个“平等”表达就足够了。您的RHS事实应该是另一个词汇项目。在XML类型的情况下,正确的路径将逐个拉出所有值并导致多个评估,并且如果匹配则分别触发动作。要记住的关键:BRE是模式匹配引擎。
词汇表只是事实定义的一个方便的别名。假设您创建了一个具有以下结构的XML文件:
<options>
<value>A</value>
<value>B</value>
<value>C</value>
</options>
为此事实定义词汇表 名称:PossibleValues XPath选择器:/ options / value XPath字段:。
然后将规则定义为IF currentValue == PossibleValues将导致三个条件评估,因为RHS将三个事实产生到工作记忆中。因此,只有那些真实的才会触发规则(行动)。将此与BRE从XML模式中选择一个节点时创建的默认定义进行比较,该模式仅断言一个(第一个)事实:
XPath选择器:/ options / XPath字段:值
(为简洁省略了名称空间)
在运行时将此XML文档作为参数传递给BRE(无论是在业务流程中还是在.Net组件中,具体取决于BRE调用上下文)。在设计时进行测试,您必须实现Fact Creator组件(实现IFactCreator)以提供必需参数的实例。
使用自定义事实检索器可以更好地管理长期事实(如问题中的那些事实)。事实检索器是一个实现IFactRetriever的.Net组件。有关详细信息,请参阅documentation。内部事实检索器实现加载XML(从磁盘)并将其作为TypedXmlDocument断言到工作内存中。