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

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -