Так как вам не нужно перечислять членов каждой категории, и если ваши наборы данных не очень велики, а производительность не является существенным фактором, вы можете отказаться от группировки Мюнхена для чего-то немного менее элегантного. Просто измените ваш <xsl:if test>
на:
<xsl:if test="./@Category_x0020_name !='' and
not(./@Category_x0020_name = preceding::Row/@Category_x0020_name)">
Другими словами, выводите имя категории только в первый раз.
Кстати, вы можете удалить ./
, где бы он ни находился в начале выражения XPath. Это избыточно. Это означает «начиная с узла контекста», но вы уже начинаете с узла контекста. Если вы хотите оставить его для удобства чтения, то ничего страшного.
Затем с вводом, как
<Root>...
<Data ItemCount="1">
<Row Category_x0020_name="foo" LinkTitle="Foo" />
<Row Category_x0020_name="bar" LinkTitle="Bar" />
<Row Category_x0020_name="foo" LinkTitle="Foo" />
</Data>
</Root>
Вы получите этот вывод:
<table border="0" cellpadding="0" cellspacing="0">
<h3>Categories</h3>
<tr valign="top">
<td><a href="/catFoo.aspx">foo</a></td>
</tr>
<tr valign="top">
<td><a href="/catBar.aspx">bar</a></td>
</tr>
</table>