I have the following XML that has been generated from a Spreadsheet:
<DocumentElement>
<Sheet1>
<FIELD_1>100</FIELD_1>
<FIELD_2>TWO</FIELD_2>
<FIELD_3>110ST20</FIELD_3>
</Sheet1>
<Sheet1>
<FIELD_1>100</FIELD_1>
<FIELD_2>TWO</FIELD_2>
<FIELD_3>110ST20</FIELD_3>
</Sheet1>
<Sheet1>
<FIELD_1>100</FIELD_1>
<FIELD_2>TWO</FIELD_2>
<FIELD_3>11CST32</FIELD_3>
</Sheet1>
<Sheet1>
<FIELD_1>100</FIELD_1>
<FIELD_2>TWO</FIELD_2>
<FIELD_3>11CST32</FIELD_3>
</Sheet1>
<Sheet1>
<FIELD_1>100</FIELD_1>
<FIELD_2>TWO</FIELD_2>
<FIELD_3>11CST32</FIELD_3>
</Sheet1>
</DocumentElement>
注意前两个元素中的FIELD_3具有相同的编号(110ST20),最后3个元素中的FIELD_3也具有相同的编号(11CST32)。FIELD_3可能重复的次数是不可预测的。
我希望通过添加01、02等后缀来使数字唯一——直到数字重复的次数,这样最终的结果应该看起来像这样:
<details Number="100" Position="TWO" Value="110ST2001">
<details Number="100" Position="TWO" Value="110ST2002">
<details Number="100" Position="TWO" Value="11CST3201">
<details Number="100" Position="TWO" Value="11CST3202">
<details Number="100" Position="TWO" Value="11CST3203">
下面是我的xslt:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:strip-space elements="*" />
<xsl:output method="xml" indent="yes"/>
<xsl:template match="DocumentElement">
<DocumentElement>
<xsl:for-each select ="/DocumentElement/Sheet1">
<details>
<xsl:attribute name="Number" >
<xsl:value-of select="FIELD_1"/>
</xsl:attribute>
<xsl:attribute name="Position" >
<xsl:value-of select="FIELD_2"/>
</xsl:attribute>
<xsl:attribute name="Value" >
<xsl:value-of select="FIELD_3"/>
</xsl:attribute>
</details>
</xsl:for-each>
</DocumentElement>
</xsl:template>
</xsl:stylesheet>
和我的结果如下:
<?xml version="1.0"?>
<DocumentElement>
<details Value="110ST20" Position="TWO" Number="100"/>
<details Value="110ST20" Position="TWO" Number="100"/>
<details Value="11CST32" Position="TWO" Number="100"/>
<details Value="11CST32" Position="TWO" Number="100"/>
<details Value="11CST32" Position="TWO" Number="100"/>
</DocumentElement>
我如何使用xslt做到这一点?
提前感谢您的协助!
您需要首先使用Muenchian分组方法对记录进行分组。然后,您可以按顺序编号每个组的成员,使用他们在组中的位置:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="sheet-by-f3" match="Sheet1" use="FIELD_3" />
<xsl:template match="/">
<DocumentElement>
<xsl:for-each select="DocumentElement/Sheet1[count(. | key('sheet-by-f3', FIELD_3)[1]) = 1]">
<xsl:for-each select="key('sheet-by-f3', FIELD_3)">
<details Number="{FIELD_1}" Position="{FIELD_2}">
<xsl:attribute name="Value" >
<xsl:value-of select="FIELD_3"/>
<xsl:value-of select="format-number(position(), '00')"/>
</xsl:attribute>
</details>
</xsl:for-each>
</xsl:for-each>
</DocumentElement>
</xsl:template>
</xsl:stylesheet>