Использование метода Мюнхена для группировки детей по document
по их первому предшествующему Br
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="byPosition" match="/document/*[not(self::Br)]"
use="generate-id(preceding-sibling::Br[1])"/>
<xsl:template match="@*|node()" name="identity" priority="-5">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/document/*[not(self::Br) and
generate-id()=generate-id(key('byPosition',
generate-id(preceding-sibling::Br[1]))[1])]">
<p><xsl:copy-of
select="key('byPosition',
generate-id(preceding-sibling::Br[1]))"/></p>
</xsl:template>
<xsl:template match="/document/*" priority="-3"/>
</xsl:stylesheet>
Объяснение: Сначала элементы группируются по key
в их первом предшествующем элементе Br
:
<xsl:key name="byPosition" match="/document/*[not(self::Br)]"
use="generate-id(preceding-sibling::Br[1])"/>
Преобразование идентичности используется для копирования большинства узлов без изменений:
<xsl:template match="@*|node()" name="identity" priority="-5">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Затем мы сопоставляем все дочерние элементы document
, которыепервый такой элемент для их key
:
<xsl:template match="document/*[not(self::Br) and
generate-id()=generate-id(key('byPosition',
generate-id(preceding-sibling::Br[1]))[1])]">
... и использовать его как точку, в которой можно скопировать все элементы, сгруппированные по этому key
:
<xsl:copy-of select="key('byPosition',
generate-id(preceding-sibling::Br[1]))"/>