Reputation: 163
Input is in the following format :
<imageLink>
<url colNumber="1">aa</url>
<imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode colNumber="3">en</languageCode>
<languageCode colNumber="3">fr</languageCode>
</imageLink>
<imageLink>
<url colNumber="1">bb</url>
<imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode colNumber="3">fr</languageCode>
</imageLink>
Output format is as follows:
<imageLink rowNum="1">
<url rowNum="1" colNumber="1">aa</url>
<imageTypeCode rowNum="1" colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode rowNum="1" colNumber="3">en</languageCode>
<languageCode rowNum="2" colNumber="3">en1</languageCode>
</imageLink>
<imageLink rowNum="3">
<url rowNum="3" colNumber="1">bb</url>
<imageTypeCode rowNum="3" colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode rowNum="3" colNumber="3">fr</languageCode>
</imageLink>
This output is further then added to Excel format. How do I retrieve the row numbers exactly as shown in the output format?
Upvotes: 0
Views: 537
Reputation: 167696
I think one way is to compute the attribute rowNum
for the first imageLink
and its children and then to take the maximum + 1 as the start value for the next sibling:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="*[1]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/*">
<xsl:param name="row" select="1"/>
<xsl:variable name="copy" as="element()">
<xsl:copy>
<xsl:attribute name="rowNum" select="$row"/>
<xsl:apply-templates>
<xsl:with-param name="row" select="$row"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:variable>
<xsl:copy-of select="$copy"/>
<xsl:apply-templates select="following-sibling::*[1]">
<xsl:with-param name="row" select="max($copy/*/@rowNum) + 1"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="root/*/*">
<xsl:param name="row"/>
<xsl:copy>
<xsl:variable name="index" as="xs:integer">
<xsl:number/>
</xsl:variable>
<xsl:attribute name="rowNum" select="$row - 1 + $index"/>
<xsl:copy-of select="@*, node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
That transforms
<root>
<imageLink>
<url colNumber="1">aa</url>
<imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode colNumber="3">en</languageCode>
<languageCode colNumber="3">fr</languageCode>
</imageLink>
<imageLink>
<url colNumber="1">bb</url>
<imageTypeCode colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode colNumber="3">fr</languageCode>
</imageLink>
</root>
into
<root>
<imageLink rowNum="1">
<url rowNum="1" colNumber="1">aa</url>
<imageTypeCode rowNum="1" colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode rowNum="1" colNumber="3">en</languageCode>
<languageCode rowNum="2" colNumber="3">fr</languageCode>
</imageLink>
<imageLink rowNum="3">
<url rowNum="3" colNumber="1">bb</url>
<imageTypeCode rowNum="3" colNumber="2">PRODUCT_IMAGE</imageTypeCode>
<languageCode rowNum="3" colNumber="3">fr</languageCode>
</imageLink>
</root>
Upvotes: 1