源文件在字段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>
答案 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中执行此操作需要进行某种分组/计数,效率可能会低得多。