2016-03-26 1 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> 

классов х, у, г и ш может произойти любое число раз, и с любой div по всему html.

Существует один и только один DIV класс = "вю"

Я хотел бы:

  1. Переименование классов х, у, г, а вес до b1, b2, b3, и b4, соответственно, если и только если предок этого узла DIV класс = «вю»
  2. Переименовать DIV класс = «Vu», чтобы сОн класса = «б»

результат будет затем:

<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

Смежные вопросы