2016-03-26 13 views
0

I eine große Anzahl von HTML-Dateien wie die haben folgende:Xslt Umbenennen abhängig Attributwert des Knotens auf Vorfahren Attributwert

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

Die Klassen x, y, z und w beliebig oft auftreten können, und mit irgendein div im HTML.

ist es eine und nur eine div class = "vu"

ich möchte:

  1. den Klassen x Umbenennen, y, z und w auf b1, b2, b3, und b4 jeweils, wenn und nur wenn eine Vorfahren dieses Knotens ist div class = "vu"
  2. Rename div class = "vu" zu div class = "b"

Das Ergebnis wäre dann:

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

Ich habe folgende Xslt versucht, das gibt mir nicht das erwartete Ergebnis:

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

Ich glaube, ich verstehe, warum es nicht ist mir das richtige Ergebnis zu geben, aber ich scheine nicht zu finde die richtige Lösung.

Antwort

2

Anstelle all dieser <xsl:copy-of select="node()" /> müssen Sie <xsl:apply-templates/> oder <xsl:apply-templates select="node()"/> verwenden, um die auf Vorlagen basierende Verarbeitung am Leben zu erhalten.

+0

Das war es. Danke Martin. – Yalmar