如何使用xslt增加值

时间:2014-06-19 14:27:17

标签: xml xslt-1.0

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执行此操作?

非常感谢您的协助!

1 个答案:

答案 0 :(得分:1)

您需要先使用Muenchian grouping method 分组您的记录。然后,您可以使用它们在组中的位置顺序编号每个组的成员:

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