xml - How to increment values using xslt -
i have next xml has been generated 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>
notice field_3 in first 2 elements has same number (110st20) , field_3 in lastly 3 elements has same number (11cst32). number of times field_3 may repeated unpredictable.
i want number unique adding suffix of 01, 02, , on - number of times number repeated, final result should this:
<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"> here 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> and result follows:
<?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> how can using xslt?
thanks much in advance assistance!
you need start grouping records, using muenchian grouping method. can number members of each grouping sequentially, using position within group:
<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> xml xslt-1.0
No comments:
Post a Comment