Итак, вы хотите сгруппировать по имени узла.Не самая лучшая идея для хранения в узлах XML больше, чем фактическая информация о структуре , но здесь вы идете:
<siteMenu>
<Pages>
<title>page1</title>
</Pages>
<Pages>
<title>page2</title>
</Pages>
<Links>
<title>link1</title>
</Links>
<Links>
<title>link2</title>
</Links>
<Sites>
<title>site1</title>
</Sites>
<Sites>
<title>site2</title>
</Sites>
</siteMenu>
и это преобразование XSLT 2.0 (только соответствующий фрагмент):
<xsl:template match="siteMenu">
<xsl:for-each-group select="*" group-by="name()">
<xsl:sort select="name()" />
<div>
<h1><xsl:value-of-select="current-grouping-key()" /></h1>
<ul>
<xsl:for-each select="current-group()">
<li><xsl:value-of select="title" /></li>
</xsl:for-each>
</ul>
</div>
</xsl:for-each-group>
</xsl:template>
или это преобразование XSLT 1.0 (только соответствующий фрагмент):
<xsl:key name="kMenu" match="siteMenu/*" use="name()" />
<xsl:template match="siteMenu">
<xsl:for-each select="*[
generate-id() = generate-id(key('kMenu', name())[1])
]">
<xsl:sort select="name()" />
<div>
<h1><xsl:value-of-select="name()" /></h1>
<ul>
<xsl:for-each select="key('kMenu', name())">
<li><xsl:value-of select="title" /></li>
</xsl:for-each>
</ul>
</div>
</xsl:for-each-group>
</xsl:template>
Подсказка: вы можете подумать об использовании такого XML вместо этого, это, очевидно, лучше соответствует структуре вашего сайта, и вам нужнонет группировки для правильного вывода.
<siteMenu>
<section name="Pages">
<title>page1</title>
<title>page2</title>
</section>
<section name="Links">
<title>link1</title>
<title>link2</title>
</section>
<section name="Sites">
<title>site1</title>
<title>site2</title>
</section>
</siteMenu>