2016-06-16 5 views
0

У меня есть большое количество файлов HTML со следующей структурой:XSLT, если родитель = а ребенок = Ь, то движение братьев и сестер б в б

<html> 
    <head> 
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> 
    <title>t</title> 
    </head> 
    <body> 
    <div class="a"> 
     <div class="i">i</div> 
     <div class="b">b1 
     <div class="b1">b11</div> 
     <div class="b2">b12</div> 
     </div> 
     <div class="j">j</div> 
     <div class="b">b2 
     <div class="b1">b21</div> 
     <div class="b2">b22</div> 
     </div> 
     <div class="k">k</div> 
    </div> 
    <div class="x"> 
     <div class="i">i3</div> 
     <div class="b">b3 
     <div class="b1">b31</div> 
     <div class="b2">b32</div> 
     </div> 
     <div class="j">j3</div> 
    </div> 
    </body> 
</html> 

Я хотел бы:

  1. переместить все братья и сестры из Ь в Ь
  2. удалить родителю, но держать его содержание

Пожалуйста, обратите внимание, что:

  1. класса деления = «а» не имеет текст()
  2. класса деления = «б» может иметь другие родитель отдельно от сНа класса = «а», например сОн класса = «х»
  3. DIV класс = «а» может содержать 1: N Div класс = «Ъ»

Результат должен быть примерно следующее:

<html> 
    <head> 
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> 
    <title>t</title> 
    </head> 
    <body> 
    <div class="b">b1 
     <div class="b1">b11</div> 
     <div class="b2">b12</div> 
     <div class="i">i</div> 
     <div class="j">j</div> 
     <div class="k">k</div> 
    </div> 
    <div class="b">b2 
     <div class="b1">b21</div> 
     <div class="b2">b22</div> 
     <div class="i">i</div> 
     <div class="j">j</div> 
     <div class="k">k</div> 
    </div> 
    <div class="x"> 
     <div class="i">i3</div> 
     <div class="b">b3 
     <div class="b1">b31</div> 
     <div class="b2">b32</div> 
     </div> 
     <div class="j">j3</div> 
    </div> 
    </body> 
</html> 

Я использую скрипт подобный следующему:

xsltproc a.xslt a.html > b.html 

где a.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()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="div[@class='a']/div[@class='b']"> 
    <xsl:apply-templates select="@*|preceding-sibling()[not(self::div[@class='b'])]"/> 
    <xsl:apply-templates select="@*|following-sibling()[not(self::div[@class='b'])]"/> 
    <xsl:copy-of select="div[@class='b']"/> 
</xsl:template> 

</xsl:stylesheet> 

Однако я получаю сообщение об ошибке, вероятно, потому, что я не использую предшествующую-родственный и следующее-родственный правильно:

xmlXPathCompOpEval: function preceding-sibling not found 

Не могли бы вы посоветовать мне, как распутать этот xslt, пожалуйста?

ответ

1

Я считаю, что это следует за вашими инструкциями:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- remove parent a but keep its content --> 
<xsl:template match="div[@class='a']"> 
    <xsl:apply-templates/> 
</xsl:template> 

<!-- move all siblings of b inside b --> 
<xsl:template match="div[@class='b']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:copy-of select="../node()[not(self::div[@class='b'])]"/> 
    </xsl:copy> 
</xsl:template> 

<!-- do not process siblings of b --> 
<xsl:template match="node()[../div[@class='b']][not(self::div[@class='b'])]"/> 

</xsl:stylesheet> 

Однако результат не то, что вы показываете:

<html> 
    <head> 
     <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/> 
     <title>t</title> 
    </head> 
    <body> 
     <div class="b">b1 
     <div class="b1">b11</div> 
     <div class="b2">b12</div> 
     <div class="i">i</div> 
     <div class="j">j</div> 
     <div class="k">k</div> 
     </div> 
     <div class="b">b2 
     <div class="b1">b21</div> 
     <div class="b2">b22</div> 
     <div class="i">i</div> 
     <div class="j">j</div> 
     <div class="k">k</div> 
     </div> 
     <div class="x"> 
     <div class="b">b3 
     <div class="b1">b31</div> 
      <div class="b2">b32</div> 
      <div class="i">i3</div> 
      <div class="j">j3</div> 
     </div> 
     </div> 
    </body> 
</html> 
+0

Спасибо Майкл. Теперь я вижу, что я брал неправильный подход, чтобы получить братьев и сестер. Вы правы, я исправил свой результат в исходном посте. – Yalmar