начинается с шаблона идентификации:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
далее, соответствует узлу div
, который содержит целевой h1
узел
<xsl:template match="div[h1='Example']">
<!-- apply child nodes except h1 -->
<xsl:apply-templates select="node()[not(self::h1)]"/>
</xsl:template>
и шаблон для div
узлы, которые не содержат целевой h1
узел
<xsl:template match="div[not(h1='Example')]">
<section>
<!-- set the attribute if the immediate preceding-sibling node is h1 -->
<xsl:if test="preceding-sibling::*[1][self::h1[.='Example']]">
<xsl:attribute name="class">example</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="node()[not(self::div)]"/>
</section>
<xsl:apply-templates select="node()[self::div]"/>
</xsl:template>
и шаблон для h1
узла
<xsl:template match="div/h1">
<title>
<xsl:apply-templates/>
</title>
</xsl:template>
Вся таблица стилей выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="div[h1='Example']">
<xsl:apply-templates select="node()[not(self::h1)]"/>
</xsl:template>
<xsl:template match="div/h1">
<title>
<xsl:apply-templates/>
</title>
</xsl:template>
<xsl:template match="div[not(h1='Example')]">
<section>
<xsl:if test="preceding-sibling::*[1][self::h1[.='Example']]">
<xsl:attribute name="class">example</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="node()[not(self::div)]"/>
</section>
<xsl:apply-templates select="node()[self::div]"/>
</xsl:template>
</xsl:stylesheet>
увидеть его в действии (https://xsltfiddle.liberty -development.net / pPzifpb / 3 )