避免目标架构中的重复项

Avoid duplicates in the destination schema

我有个小问题。我想将每个明细行映射到一个 OrderInfo。目标模式不能有任何重复的 OrderInfo。所有详细信息行都应在目标订单信息中,但 SuppliersOrderNo 和 BuyersOrderNo 不应重复。

知道如何做到这一点吗,是否可以使用 XSL 或内联脚本?

<inv:OrderInfo>
    <inv:SuppliersOrderNo>123456</inv:SuppliersOrderNo>
    <inv:BuyersOrderNo>6789</inv:BuyersOrderNo>
    <inv:DetailLines>
        <inv:DetailLine>
            <inv:InvoiceDetailLineNo>1</inv:InvoiceDetailLineNo>
                <inv:Item>
                    <inv:SuppliersArticleNo>article2</inv:SuppliersArticleNo>
                    <inv:SuppliersDescription>BestArticle</inv:SuppliersDescription>
                </inv:Item>
        </inv:DetailLine>
        <inv:DetailLine>
            <inv:InvoiceDetailLineNo>2</inv:InvoiceDetailLineNo>
                <inv:Item>
                    <inv:SuppliersArticleNo>article3</inv:SuppliersArticleNo>
                    <inv:SuppliersDescription>AlmostBestArticle</inv:SuppliersDescription>
                </inv:Item>
        </inv:DetailLine>
    </inv:DetailLines>
</inv:OrderInfo>
<inv:OrderInfo>
    <inv:SuppliersOrderNo>123456</inv:SuppliersOrderNo>
    <inv:BuyersOrderNo>6789</inv:BuyersOrderNo>
    <inv:DetailLines>
        <inv:DetailLine>
            <inv:InvoiceDetailLineNo>1</inv:InvoiceDetailLineNo>
                <inv:Item>
                    <inv:SuppliersArticleNo>article1337</inv:SuppliersArticleNo>
                    <inv:SuppliersDescription>WOW</inv:SuppliersDescription>
                </inv:Item>
        </inv:DetailLine>
    </inv:DetailLines>
</inv:OrderInfo>

如果您想纯粹在 XSLT 中执行此操作,则必须使用 Muenchian grouping。我写了一篇博客,链接到其他一些关于如何在 BizTalk 中执行此操作的博客:https://blog.tallan.com/2014/12/09/muenchian-grouping-in-biztalk-while-keeping-mapper-functionality/

总结一下博客:如果你追求这个,你将需要一个完全自定义 XSLT 的地图,但如果你仍然希望能够使用,你可以将它放入自定义管道组件中 "regular" 没有任何其他警告的映射功能(在我的博客中,我描述了一种在管道组件中执行此操作的方法,以便 "regular" BizTalk 映射仍可用于预处理输出)。那里有很多关于 Muenchian 分组的资源(包括在 Whosebug 上),所以我不会在这个答案中重复所有这些。

您也可以尝试在 C# 组件中序列化消息并使用一些 LINQ 方法 group/sort/order/etc,或者如果您在某个时候将内容插入 SQL,您可以这样做in SQL(这将能够更自然地处理这种任务)。