Я думаю, вам нужно определить второй ключ для h2
группировки
<xsl:key name="h2-group" match="xhtml:div/*[not(self::xhtml:h2)]" use="generate-id(preceding-sibling::xhtml:h2[1])"/>
И затем есть второй шаблон, который соответствует h1
элементам, которые содержат h2
элементов в группе
<xsl:template match="xhtml:h1[key('h1-group', generate-id())[self::xhtml:h2]]">
<xsl:apply-templates select="key('h1-group', generate-id())[self::xhtml:h2]" />
</xsl:template>
А в шаблоне соответствия h2
вы бы сделали группировку
<xsl:template match="xhtml:h2">
<xsl:variable name="h1Group" select="key('h1-group', generate-id(preceding-sibling::xhtml:h1[1]))" />
<Section name="{.}">
<Description>
<xsl:apply-templates select="key('h2-group', generate-id())[count(. | $h1Group) = count($h1Group)]"/>
</Description>
</Section>
</xsl:template>
Использование count
здесь позволяет убедиться, что вы выбираете только элементы, следующие за h2
, которые входят в текущую группу h1
.
Попробуйте это XSLT
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="xhtml exsl"
version="1.0">
<xsl:import href="http://lenzconsulting.com/xml-to-string/xml-to-string.xsl"/>
<xsl:output method="xml" indent="yes" cdata-section-elements="MainDescription KeyConsideration"/>
<xsl:strip-space elements="*"/>
<xsl:key name="h1-group" match="xhtml:div/*[not(self::xhtml:h1)]" use="generate-id(preceding-sibling::xhtml:h1[1])"/>
<xsl:key name="h2-group" match="xhtml:div/*[not(self::xhtml:h2)]" use="generate-id(preceding-sibling::xhtml:h2[1])"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xhtml:div[xhtml:h1]">
<xsl:apply-templates select="xhtml:h1"/>
</xsl:template>
<xsl:template match="xhtml:h1">
<xsl:element name="{translate(., ' ', '')}">
<xsl:choose>
<xsl:when test=". = 'Main Description'">
<xsl:variable name="rtf-with-xhtml-ns-stripped">
<xsl:apply-templates select="key('h1-group', generate-id())"/>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($rtf-with-xhtml-ns-stripped)/node()" mode="xml-to-string"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="key('h1-group', generate-id())"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<xsl:template match="xhtml:h1[key('h1-group', generate-id())[self::xhtml:h2]]">
<xsl:apply-templates select="key('h1-group', generate-id())[self::xhtml:h2]" />
</xsl:template>
<xsl:template match="xhtml:h2">
<xsl:variable name="h1Group" select="key('h1-group', generate-id(preceding-sibling::xhtml:h1[1]))" />
<Section name="{.}">
<Description>
<xsl:apply-templates select="key('h2-group', generate-id())[count(. | $h1Group) = count($h1Group)]"/>
</Description>
</Section>
</xsl:template>
<xsl:template match="xhtml:p|xhtml:ul|xhtml:li">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>