Я знаю, что люди отклоняют макеты на основе таблиц HTML, но какого черта. Они работают. Если вы тщеславны, вы можете пройти лишнюю милю и найти способ, основанный исключительно на CSS. : -)
Итак, решение XSLT.
<xml>
<item id="1">Item 1</item>
<item id="2">Item 2</item>
<item id="3">Item 3</item>
<item id="4">Item 4</item>
<item id="5">Item 5</item>
<item id="6">Item 6</item>
<item id="7">Item 7</item>
<item id="8">Item 8</item>
<item id="9">Item 9</item>
</xml>
С этим шаблоном XSL 1.0 (количество столбцов можно настраивать):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/xml">
<xsl:variable name="vCols" select="2" />
<xsl:variable name="vCount" select="count(item)" />
<xsl:variable name="vRows" select="ceiling($vCount div $vCols)" />
<xsl:variable name="vIterC" select="item[position() <= $vCols]" />
<xsl:variable name="vIterR" select="item[position() <= $vRows]" />
<xsl:variable name="vSelf" select="." />
<table>
<xsl:for-each select="$vIterR">
<xsl:variable name="vRowIdx" select="position()" />
<tr>
<xsl:for-each select="$vIterC">
<xsl:variable name="vOffset" select="$vRows * (position() - 1)" />
<td>
<xsl:value-of select="$vSelf/item[$vRowIdx + $vOffset]" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Урожайность:
<table>
<tr>
<td>Item 1</td>
<td>Item 6</td>
</tr>
<tr>
<td>Item 2</td>
<td>Item 7</td>
</tr>
<tr>
<td>Item 3</td>
<td>Item 8</td>
</tr>
<tr>
<td>Item 4</td>
<td>Item 9</td>
</tr>
<tr>
<td>Item 5</td>
<td></td>
</tr>
</table>
Если есть только один предмет, он производит:
<table>
<tr>
<td>Item 1</td>
</tr>
</table>
Так что в этой ситуации нет двух столбцов.
В любом случае таблица всегда будет правильно сформирована (например, без зубчатых строк). Единственное, что не делает это решение - это сортировка результатов. Вывод всегда будет в порядке документа. Похоже, вы правильно отсортировали предметы, так что это не должно быть большой проблемой.