【问题标题】:Accumulating Date Elements Across Hierarchies In A BizTalk Map在 BizTalk 映射中跨层次结构累积日期元素
【发布时间】:2016-09-05 15:46:16
【问题描述】:

(在标记我之前,请检查我在此问题底部的弹出说明。谢谢!)

我在 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 地图中的日期元素执行最小值和最大值函数的最佳方法是什么?

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

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

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

【问题讨论】:

  • 首先,这是一个完全合法的 BizTalk 问题。其次,我认为你在某些事情上想得太多了。请确认一件事,您要做的就是合并 Title 和 FirstPublished 数据,使用 ISBN 作为键?
  • 嗨,Johns,是的,完全正确。而且很可能我想多了,或者遗漏了一些非常明显的东西,因为我的直觉告诉我这应该是 BizTalk 地图的“面包和黄油”。

标签: date dictionary biztalk accumulate


【解决方案1】:

您的整体解决方案没有任何问题。有一件事我会做不同的事情。

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

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

您可能可以在一张地图中完成,但这需要一些内联 Xslt 模板。这也没什么不好。但是,Two Map 解决方案只允许您使用内置的 Functoid。

除非您能证明自己需要,否则不要担心“性能”。一两个地图之间的性能差异几乎无法衡量。

【讨论】:

    【解决方案2】:

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

    日期元素的累积最小值

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

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

    跨层级执行累积函数

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

    我非常笨拙的解决方法是使用一个临时消息架构,其中 &lt;Revisions&gt; 节点作为每个 &lt;Book&gt; 节点的子节点。

    在第 1 步中,我从源架构映射到临时架构,将 &lt;revisions&gt; 节点数据复制到每个 &lt;Book&gt; 节点(为方便起见,我还将计算出的数字区间存储在这里)。

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

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

    【讨论】:

    • 可能不重要,但您的 拼写不一致。不同的外壳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    相关资源
    最近更新 更多