Biztalk映射中的多个启动迭代器functoid

时间:2016-03-03 07:59:37

标签: xml iterator biztalk biztalk-mapper

源文件在字段name中具有标识值。

<?xml version="1.0"?>
<root>
    <line>
        <name>Test1</name>
        <data>data1</data>
    </line>
    <line>
        <name>Test1</name>
        <data>data2</data>
    </line>
    <line>
        <name>Test2</name>
        <data>data3</data>
    </line>
    <line>
        <name>Test1</name>
        <data>data4</data>
    </line>
</root>

如果我直接使用迭代器functoid,我会得到这样的结果:

Biztalk Mapping

<?xml version="1.0"?>
<root>
    <line>
        <sequence>1</sequence>
        <name>Test1</name>
        <data>data1</data>
    </line>
    <line>
        <sequence>2</sequence>
        <name>Test1</name>
        <data>data2</data>
    </line>
    <line>
        <sequence>3</sequence>
        <name>Test2</name>
        <data>data3</data>
    </line>
    <line>
        <sequence>4</sequence>
        <name>Test1</name>
        <data>data4</data>
    </line>
</root>

如果字段1中的每个新值从name开始,如何填充序列字段,如果满足任何出现的值,则从最后一个值继续排序? 我期望输出文件中有这样的结果:

<?xml version="1.0"?>
<root>
    <line>
        <sequence>1</sequence>
        <name>Test1</name>
        <data>data1</data>
    </line>
    <line>
        <sequence>2</sequence>
        <name>Test1</name>
        <data>data2</data>
    </line>
    <line>
        <sequence>1</sequence>
        <name>Test2</name>
        <data>data3</data>
    </line>
    <line>
        <sequence>3</sequence>
        <name>Test1</name>
        <data>data4</data>
    </line>
</root>

1 个答案:

答案 0 :(得分:1)

迭代器functoid获取当前节点的迭代 - 它根本不查看文本。为了实现您想要做的事情,最简单的方法是使用C#Scripting functoid(它将取代您当前的迭代器functoid)和Dictionary<string, int>来跟踪您和#39的次数。我看到了一个特别的名字;这将是functoid的内容:

System.Collections.Generic.Dictionary<string, int> tracker = new System.Collections.Generic.Dictionary<string, int>();

public string GetNameCount(string name)
{
    int ct;
    if (tracker.TryGetValue(name, out ct))
    {
        ct++;
        tracker[name] = ct;
        return ct.ToString();
    }
    else
    {
        tracker.Add(name, 1);
        return "1";
    }
}

如果您在多个地图中使用它(或仅用于调试/维护目的),最好将它放在外部程序集中。

在纯XSLT中执行此操作需要进行某种分组/计数,效率可能会低得多。