xslt Rename node's attribute value depending on ancestor's attribute value -


i have large number of html files following:

<html>   <body>     <div class="a">aaa       <div class="a1">a1a1a1</div>       <div class="a2">a2a2a2</div>       <div class="a2">a3a3a3</div>     </div>     <div class="v u">bbb       <div class="x">xxx</div>       <div class="y">yyy</div>       <div class="z">z1z1z1         <div class="w">www1</div>         <div class="w">www2</div>         <div class="w">www3</div>       </div>       <div class="z">z2z2z2         <div class="w">www4</div>         <div class="w">www5</div>         <div class="w">www6</div>       </div>     </div>     <div class="i">       <div class="j">jjj</div>       <div class="x">         <div class="k">           <div class="w">www7</div>           <div class="w">www8</div>         </div>       </div>     </div>   </body> </html> 

the classes x, y, z, , w can occur number of times , div throughout html.

there 1 , 1 div class="v u"

i to:

  1. rename classes x, y, z, , w b1, b2, b3, , b4 respectively if , if ancestor of node div class="v u"
  2. rename div class="v u" div class="b"

the result be:

<html>   <body>     <div class="a">aaa       <div class="a1">a1a1a1</div>       <div class="a2">a2a2a2</div>       <div class="a2">a3a3a3</div>     </div>     <div class="b">bbb       <div class="b1">xxx</div>       <div class="b2">yyy</div>       <div class="b3">z1z1z1         <div class="b4">www1</div>         <div class="b4">www2</div>         <div class="b4">www3</div>       </div>       <div class="b3">z2z2z2         <div class="b4">www4</div>         <div class="b4">www5</div>         <div class="b4">www6</div>       </div>     </div>     <div class="i">       <div class="j">jjj</div>       <div class="x">         <div class="k">           <div class="w">www7</div>           <div class="w">www8</div>         </div>       </div>     </div>   </body> </html> 

i have tried following xslt, doesn't give me expected result:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" >  <xsl:output omit-xml-declaration="yes" indent="yes" />  <xsl:strip-space elements="*" />   <xsl:template match="@*|node()" >   <xsl:copy>    <xsl:apply-templates select="@*|node()" />   </xsl:copy>  </xsl:template>   <xsl:template match="div[@class='v u']">    <div class="b">    <xsl:copy-of select="node()" />   </div>  </xsl:template>   <xsl:template match="div[@class='v u']/div[@class='x']">    <div class="b1">    <xsl:copy-of select="node()" />   </div>  </xsl:template>   <xsl:template match="div[@class='v u']/div[@class='y']">    <div class="b2">    <xsl:copy-of select="node()" />   </div>  </xsl:template>   <xsl:template match="div[@class='v u']/div[@class='z']">    <div class="b3">    <xsl:copy-of select="node()" />   </div>  </xsl:template>   <xsl:template match="div[@class='v u']/div[@class='z']/div[@class='w']">    <div class="b4">    <xsl:copy-of select="node()" />   </div>  </xsl:template>  </xsl:stylesheet>  

i think understand why not giving me correct result, not seem find correct solution.

instead of <xsl:copy-of select="node()" /> need use <xsl:apply-templates/> or <xsl:apply-templates select="node()"/> keep template based processing alive.


Comments