2016-06-16 8 views
0

Ich habe eine große Anzahl von HTML-Dateien mit folgenden Struktur:XSLT wenn parent = a und Kind = b dann Geschwister von b innerhalb b bewegen

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

Ich mag:

  1. verschieben Sie alle Geschwister von b innerhalb b
  2. Elternteil entfernen, aber halten ihren Inhalt

Bitte beachten Sie, dass:

  1. div class = "a" nicht text()
  2. div class = "b" können andere Eltern haben abgesehen von div class = "a", zum Beispiel div class = "x"
  3. div class = "a" 1 enthalten: N div class = "b"

die Ausgabe wie folgt sein sollte:

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

ich ähnlich bin mit einem Shell-Skript auf die folgenden:

xsltproc a.xslt a.html > b.html 

wo a.xslt sich wie folgt:

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

Jedoch habe ich einen Fehler, wahrscheinlich, weil ich nicht mit preceding-sibling und following-sibling richtig:

xmlXPathCompOpEval: function preceding-sibling not found 

Könntest du mir raten, wie ich dieses xslt bitte entwirren kann?

Antwort

1

Ich glaube, das Ihre Anweisungen folgt:

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> 

jedoch das Ergebnis ist nicht das, was Sie zeigen:

<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

Danke Michael. Ich sehe jetzt, dass ich die falsche Annäherung nahm, um die Geschwister zu bekommen. Du hast Recht, ich habe meine Ausgabe im ursprünglichen Beitrag korrigiert. – Yalmar

Verwandte Themen