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,这可能会低得多。
源文件在字段 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,这可能会低得多。