sergm87, ну как вы условие записали, так оно и выводится )
Если вам надо всегда выводить по три товара в строке, то общее количество товаров на странице тут вообще не при чем, проверять надо остаток от деления текущей позиции на три, и вставлять разырв строки когда он равен нулю:
<xsl:if test="position() mod 3 = 0 and position() != last()">
<xsl:text disable-output-escaping="yes">
</div>
<div class="column p_l">
</xsl:text>
</xsl:if>
В случае если кратный трем товар является последним на странице, вставлять разрыв не надо, для чего в условие добавлена вторая часть.