xml - Rename and add new elements using XSLT 1.0 -
i have following issue when trying modify xml file. i'm trying apply 3 transformations input below:
<sheet> <row> <column_1>11</column_1> <column_2></column_2> <column_3></column_3> </row> <row> <column_1></column_1> <column_2></column_2> <column_3></column_3> </row> <row> <column_1></column_1> <column_2></column_2> <column_3></column_3> </row> </sheet>
1) shift/rename columns 4, able using following xslt:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output indent="yes"/> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <xsl:template match="row/*"> <xsl:element name="column_{substring(name(),8,string-length(name())-7)+4}"> <xsl:apply-templates select="@* | node()" /> </xsl:element> </xsl:stylesheet>
output received:
<sheet> <row> <column_5>11</column_5> <column_6></column_6> <column_7></column_7> </row> <row> <column_5></column_5> <column_6></column_6> <column_7></column_7> </row> <row> <column_5></column_5> <column_6></column_6> <column_7></column_7> </row> </sheet>
2) add elements before existing ones below output received: have i'm lost here have no ideas how make work.
<sheet> <row> <column_1></column_1> <column_2></column_2> <column_3></column_3> <column_4></column_4> <column_5>11</column_5> <column_6></column_6> <column_7></column_7> </row> <row> <column_1></column_1> <column_2></column_2> <column_3></column_3> <column_4></column_4> <column_5></column_5> <column_6></column_6> <column_7></column_7> </row> <row> <column_1></column_1> <column_2></column_2> <column_3></column_3> <column_4></column_4> <column_5></column_5> <column_6></column_6> <column_7></column_7> </row> </sheet>
3) incorporate following xslt using propagate data, works if applied on own when merged point 1) got no result pint 1 being applied
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output indent="yes"/> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <xsl:template match="column_5"> <xsl:copy> <xsl:choose> <xsl:when test=".=''"> <xsl:value-of select="preceding::column_5[. != ''][1]"/> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="node() | @*"/> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:template> </xsl:stylesheet>
my expected result be:
<sheet> <row> <column_1></column_1> <column_2></column_2> <column_3></column_3> <column_4></column_4> <column_5>11</column_5> <column_6></column_6> <column_7></column_7> </row> <row> <column_1></column_1> <column_2></column_2> <column_3></column_3> <column_4></column_4> <column_5>11</column_5> <column_6></column_6> <column_7></column_7> </row> <row> <column_1></column_1> <column_2></column_2> <column_3></column_3> <column_4></column_4> <column_5>11</column_5> <column_6></column_6> <column_7></column_7> </row> </sheet>
thanks, lehu
it's not pretty, here go.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:output indent="yes" /> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <xsl:template match="row"> <xsl:copy> <column_1 /> <column_2 /> <column_3 /> <column_4 /> <xsl:apply-templates select="*" /> </xsl:copy> </xsl:template> <xsl:template match="row/*"> <xsl:element name="column_{substring-after(name(), 'column_') + 4}"> <xsl:apply-templates select="@* | node()" /> </xsl:element> </xsl:template> <xsl:template match="column_1[. = '']"> <column_5> <xsl:value-of select="preceding::column_1[. != ''][1]/text()" /> </column_5> </xsl:template> </xsl:stylesheet>
Comments
Post a Comment