在 BizTalk 映射中跨层次结构累积日期元素

Accumulating Date Elements Across Hierarchies In A BizTalk Map

(请在标记我之前检查此问题底部的弹出式注释。谢谢!)

我在 BizTalk 中遇到问题,我只能通过多个步骤实现我想要的映射,并希望使用单个映射实现输出。

我输入的一个例子XML如下:-

<Books>
    <Book><Title>The BFG</Title><ISBN>0-224-02040-4</ISBN></Book>
    <Book><Title>The Hobbit</Title><ISBN>978-0261102217</ISBN></Book>
    <Book><Title>BizTalk Server 2010 Unleashed</Title><ISBN>978-0-672-33118-7</ISBN></Book> 
</Books>
<Revisions>
    <Revision><ISBN>0-224-02040-4</ISBN><Version>1</Version><Published>1970-08-22T00:00:00</Published></Revision>
    <Revision><ISBN>0-224-02040-4</ISBN><Version>2</Version><Published>1975-09-25T00:00:00</Published></Revision>
    <Revision><ISBN>0-224-02040-4</ISBN><Version>3</Version><Published>1990-09-16T00:00:00</Published></Revision>
    <Revision><ISBN>978-0-672-33118-7</ISBN><Version>1</Version><Published>2010-03-28T00:00:00</Published></Revision>
    <Revision><ISBN>978-0261102217</ISBN><Version>1</Version><Published>1960-09-25T00:00:00</Published></Revision>
    <Revision><ISBN>978-0-672-33118-7</ISBN><Version>2</Version><Published>2011-09-16T00:00:00</Published></Revision>
<Revisions>

对于此示例,我想要的输出 XML 是:-

<HistoricBooks>
    <FirstIssue><ISBN>0-224-02040-4</ISBN><Title>The BFG</Title><FirstPublished>1970-08-22T00:00:00</FirstPublished><FirstIssue>
    <FirstIssue><ISBN>978-0261102217</ISBN><Title>The Hobbit</Title><FirstPublished>1960-09-25T00:00:00</FirstPublished><FirstIssue>
    <FirstIssue><ISBN>978-0-672-33118-7</ISBN><Title>BizTalk Server 2010 Unleashed</Title><FirstPublished>2010-03-28T00:00:00</FirstPublished><FirstIssue>
</HistoricBooks>

我遇到的第一个问题是 BizTalk Minimum 和 CumulativeMinimum functoid 都需要数字输入并且不能使用日期。因此我的问题的第一部分是...

对 BizTalk 映射中的日期元素执行最小和最大函数的最佳方法是什么?

我遇到的第二个问题是累积 functoid 理解范围的方式。 scope 参数指示累积的深度(整个文档、父文档、祖父文档等),但在这种情况下,简单地取 <revisions> 的所有子项中的最小值是不合适的。我需要更有选择性。因此我的问题的第二部分是...

我应该使用哪个 functoid 来在我的 XML 层次结构中有选择地执行日期累积,我应该如何实现它?

我知道这是一个双重问题。我也知道有很多方法可以得到答案,但许多方法会导致代码复杂、不整洁和性能不佳。我希望避免这种情况。我还知道这可以通过修改源或目标架构或不使用 BizTalk 轻松实现。这些路线不对我开放。因此,这个问题要求示例显示一个简单、优雅的 BizTalk 解决问题的方法。如果您不想提供答案,请不要惩罚一个想要提高知识和技能的人。

作为参考,我已经解决了我的问题的两个部分,但整体解决方案并不理想,我不建议将此作为一个好的答案。

日期元素的累计最小值

您可以将使用内联 C# 的脚本 functoid 添加到 return 日期元素和固定日期之间的间隔。以天为单位表示此间隔,并且您有一个可以通过管道传输到您的累积最小 functoid 中的数值。然后只需使用另一个脚本 functoid 将最小间隔添加回您的固定日期。

例如,如果我们选择固定日期 2016-01-01 并且我们的日期元素包含 2016-01-03、2016-01-04 和 2016-01-05,那么我们的间隔将为 2、3和 4 天。累计最小值将是 2,如果我们将 2 天加回我们的固定日期 2016-01-01,那么我们的累计最小日期将为 2016-01-03。

跨层次执行累积函数

这是一个没有完全回答问题但我帮助其他 Whosebug 读者的作弊!

我的非常笨拙的解决方法涉及使用 <Revisions> 节点作为每个 <Book> 节点的子节点的临时消息模式。

在第 1 步中,我从我的源模式映射到我的临时模式,将 <revisions> 节点数据复制到每个 <Book> 节点(为方便起见,我还将计算的数字间隔存储在此处)。

然后在第 2 步中,我使用我的最小 functoid 和我的脚本 functoid 从我的时间间隔转换回日期,从我的临时模式映射到我的输出模式。

注意:这两个步骤的解决方案意味着我无法使用 DateTime.Today 作为我的固定日期,因为存在两个步骤可能在不同日期执行的风险!

你的整体方案没有问题。有一件事我会做不同的事情。

是的,使用 Script Functoid 来转换日期,但不是差值,只是将 DateTime 的 .Ticks 属性 作为 Cumulative Minimum 的输入。这作为 Long 返回。然后,您不依赖于任何日期并且输出是确定性的。

重要,使用双地图解决方案绝对没有错。这是 BizTalk Dev 中完全可以接受的模式。

您或许可以在一张地图中完成,但这需要一些内联 Xslt 模板。这也没有错。但是,Two Map 解决方案让您仅使用内置的 Functoids。

不用担心 'performance' 除非你能证明你需要这样做。一个或两个地图之间的性能差异几乎无法衡量。