Мне кажется, проблема в том, что при выборе для каждого position()
оценивается в несортированном порядке записи.Таким образом, вы получаете первые 3 в исходном (документном) порядке, а не в ранжированном порядке.Если вы покажете больше своих входных данных, мы можем сказать наверняка.
Если это так, попробуйте:
<xsl:for-each select="data/activity-feed/entry[recommended = 'Yes']">
<xsl:sort select="activity-rank" data-type="number" order="ascending" />
<xsl:if test="position() < 4">
<a href="{$root}/items">
<p>
<xsl:value-of select="activity-name"/>
<xsl:call-template name="description">
</p>
</a>
</xsl:if>
</xsl:for-each>
Исправление состоит в том, что мы проверяем на position()
внутри отсортированный цикл for-each
, а не "снаружи" сортировки.