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:
- verschieben Sie alle Geschwister von b innerhalb b
- Elternteil entfernen, aber halten ihren Inhalt
Bitte beachten Sie, dass:
- div class = "a" nicht text()
- div class = "b" können andere Eltern haben abgesehen von div class = "a", zum Beispiel div class = "x"
- 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?
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