Лучше решить эту проблему, используя группировку, чем любую из родственных осей:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:key name="bySectionType" match="section" use="@type" />
<xsl:template match="/">
<xsl:apply-templates select="units/unit/lesson/sections/section" />
</xsl:template>
<xsl:template match="section" />
<xsl:template
match="section[generate-id()=
generate-id(key('bySectionType', @type)[1])]">
<xsl:value-of select="concat(@type, ':
')" />
<xsl:apply-templates select="key('bySectionType', @type)" mode="out" />
</xsl:template>
<xsl:template match="section" mode="out">
<xsl:value-of select="concat(normalize-space(title), '
')" />
</xsl:template>
</xsl:stylesheet>
Выход:
IN:
Sample Title 1
Sample Title 3
Sample Title 5
OF:
Sample Title 2
AS:
Sample Title 4
Для полноты, следующая таблица стилей достигает того же результата, используя оси preceding
и following
:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:apply-templates select="units/unit/lesson/sections/section" />
</xsl:template>
<xsl:template match="section" />
<xsl:template
match="section[not(preceding::section[@type=current()/@type])]">
<xsl:value-of select="concat(@type, ':
')" />
<xsl:apply-templates select=".|following::section[@type=current()/@type]"
mode="out" />
</xsl:template>
<xsl:template match="section" mode="out">
<xsl:value-of select="concat(normalize-space(title), '
')" />
</xsl:template>
</xsl:stylesheet>
Это гораздо менее эффективное решение. Обычный способ решить эту проблему - использовать метод группировки Мюнхена, как показано выше.