(请在标记我之前检查此问题底部的弹出式提示。谢谢!)
我在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 functoids都需要数字输入,不适用于日期。因此,我的问题的第一部分是......
在BizTalk地图中对日期元素执行最小和最大函数的最佳方法是什么?
我遇到的第二个问题是累积的functoid了解范围的方式。 scope参数指示累积的深度(整个文档,父级,祖父级等),但在这种情况下,仅在<revisions>
的所有子级中采用最小值是不合适的。我需要更有选择性。因此我的问题的第二部分是......
我应该使用哪个functoid在我的XML层次结构中有选择地执行日期的累积,我应该如何实现呢?
我知道这是双重问题。我也知道有很多方法可以实现答案,但很多方法会导致复杂,不整洁和性能不佳的代码。我希望避免这种情况。我也知道这可以通过修改源或目标模式或不使用BizTalk来轻松实现。这些路线不对我开放。因此,这个问题是要求示例显示一个简单,优雅的BizTalk解决方案的问题。如果您不想提供答案,请不要惩罚希望提高其知识和技能的人。
答案 0 :(得分:2)
您的整体解决方案没有任何问题。有一件事我会做不同的事情。
是的,使用Script Functoid转换日期,但不要使用差异,只需将DateTime的.Ticks属性作为累积最小值的输入。这是一个Long。然后,您不依赖于任何日期,输出是确定性的。
重要的是,使用双地图解决方案绝对没有错。这是BizTalk Dev中完全可以接受的模式。
您可以在一个Map中执行此操作,但这需要一些内联Xslt模板。这也没什么不对。但是,Two Map解决方案允许您仅使用内置的Functoid。
除非你能证明你需要,否则不要担心'表现'。一个或两个地图之间的性能差异几乎无法衡量。
答案 1 :(得分:1)
作为参考,我已经解决了我的问题的两个部分,但整体解决方案并不理想,我不建议将其作为一个好的答案。
日期元素的累积最低值
您可以添加脚本功能,它使用内联C#返回日期元素和固定日期之间的间隔。在一天中表示此间隔,您有一个数字值,可以通过管道输入您的累积最小functoid。然后只需使用另一个脚本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读者!
我非常笨重的解决方法是将临时消息架构与<Revisions>
个节点作为每个<Book>
节点的子节点。
在第1步中,我将源模式映射到临时模式,将<revisions>
节点数据复制到每个<Book>
节点(为方便起见,我还在此处存储计算出的数字间隔)。
然后在第2步中,我从我的临时架构映射到我的输出架构,使用我的最小functoid和我的脚本functoid从我的间隔转换回日期。
注意:这两步解决方案意味着我无法使用DateTime.Today作为我的固定日期,因为存在两个步骤可能在不同日期执行的风险!