2016-03-26 79 views
0

我有这样大量的HTML文件如下:XSLT重命名根据节点的属性值对祖先的属性值

<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> 

的类X,Y,Z和W可以发生任何次数,并用任何div在整个HTML。

有一个且只有一个DIV CLASS = “似曾相识”

我想:

  1. 重命名类X,Y,Z和W至B1,B2,B3,和B4分别当且仅当该节点的任何祖先是DIV类= “VU”
  2. 重命名的div类= “VU” 到的div类= “b”

结果随后将被:

<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> 

我曾尝试下面的XSLT,不给我预期的结果:

<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> 

我想我明白为什么它不给我正确的结果,但我似乎没有找到正确的解决方案。

回答

2

而不是所有那些<xsl:copy-of select="node()" />您需要使用<xsl:apply-templates/><xsl:apply-templates select="node()"/>保持基于模板的处理活着。

+0

就是这样。谢谢你,马丁。 – Yalmar