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

Multiple launch iterator functoid in Biztalk mapping

源文件在字段 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,我会得到这样的结果:

<?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>

迭代器 functoid 获取当前节点的迭代 - 它根本不查看文本。要实现您想要做的事情,使用 C# Scripting functoid(它将替换您当前的迭代器 functoid)和 Dictionary<string, int> 来跟踪您看到特定名称的次数可能是最简单的;这将是 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";
    }
}

如果您要在多个地图中使用它(或仅用于 debugging/maintenance 目的),将其放入外部组件中可能是个好主意。

在纯 XSLT 中执行此操作需要某种 grouping/counting,这可能会低得多。