У меня есть большое количество файлов 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>
Я хотел бы:
- переместить все братья и сестры из Ь в Ь
- удалить родителю, но держать его содержание
Пожалуйста, обратите внимание, что:
- класса деления = «а» не имеет текст()
- класса деления = «б» может иметь другие родитель отдельно от сНа класса = «а», например сОн класса = «х»
- 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, пожалуйста?
Спасибо Майкл. Теперь я вижу, что я брал неправильный подход, чтобы получить братьев и сестер. Вы правы, я исправил свой результат в исходном посте. – Yalmar