Как вариант - свой кастом, а так можно и на xslt разрулить весьма красиво. Я кастом делал, не могу вспомнить где :)
На xslt нужно так:
1. Выполняем content/menu. Получаем ID разделов
2. Выполняем catalog/getObjectsList/notemplate/(ID_раздела меню)/100500/0 - получаем объекты каталога.
3. Нам нужно проверить есть ли в разделе объекты. Конкретно getObjectsList возвращает total - "Общее количество объектов в указанном разделе." В других случаях можно через count()
Итого:
вызываем меню:
<xsl:apply-templates select="document('udata://content/menu/')/udata/items/item" mode="menu_catalog"/>
Описываем шаблон для обработки результата вызова макросов
<xsl:template match="item" mode="menu_catalog">
<xsl:variable name="total" select="document(concat('udata://catalog/getObjectsList/notemplate/(',@id,')/100500/0'))/udata/total"/>
<xsl:if test="$total > 0">
<li><a href="@link"><xsl:value-of select="."/></a></li>
</xsl:if>
</xsl:template>
Код не проверял, писал так