Выборка position() с помощью xsl:if

Мне необходимо выбрать первые 10 позиций с максимальным количеством голосов из файла xml

<generals>
<person>
    <id>1</id>
    <votes>7150204</votes>
    <name>Олег Вещий</name>
    <group>1</group>
    <lifedates>?–912</lifedates>
    <smstel>9999</smstel>
    <smscode>1</smscode>
</person>
<person>
    <id>2</id>
    <votes>9160842</votes>
    <name>Добрыня Никитыч (прообраз богатыря)</name>
    <group>1</group>
    <lifedates></lifedates>
    <smstel>9999</smstel>
    <smscode>2</smscode>
</person>
<person>
    <id>3</id>
    <votes>8687189</votes>
    <name>Князь Святослав</name>
    <group>1</group>
    <lifedates>942–972</lifedates>
    <smstel>9999</smstel>
    <smscode>3</smscode>
</person>
<person>
    <id>4</id>
    <votes>7365251</votes>
    <name>Мстислав Владимирович Тмутараканский</name>
    <group>1</group>
    <lifedates>ок. 983–1036</lifedates>
    <smstel>9999</smstel>
    <smscode>4</smscode>
</person>

таких позиций всего сто, надо выбрать и вывести на экран 10 максимальных из них. Вот что я написала:

      <h2>Князь</h2>
   <table border="1">
     <tr bgcolor="#9acd32">
       <th>Имя</th>
       <th>Годы жизни</th>
    <th>Количество голосов</th>
    <th>Позиция</th>
     </tr>
    <xsl:for-each select="generals/person">
    <xsl:sort order="descending" select="number(votes)" data-type="number"/>
        <tr>
                <td><xsl:value-of select="name"/></td>
                <td><xsl:value-of select="lifedates"/></td>
            <td><xsl:value-of select="votes"/></td>
            </tr>
    </xsl:for-each>
   </table>

Я отсортировала их по параметру number, т.е. самое большое количество голосов у меня наверху, минимальное - внизу. Я пытаюсь с помощью xsl:if выбрать из этих данных 10 наибольших. Но я не могу понять как. В задании сказано делать через xsl:if и position(), но у меня не получается и все слетает. Xsl:if я писала так:

<xsl:for-each select="generals/person">
    <xsl:sort order="descending" select="number(votes)" data-type="number"/>
    <xsl:if test="position()<11">
        <tr>
                <td><xsl:value-of select="name"/></td>
                <td><xsl:value-of select="lifedates"/></td>
            <td><xsl:value-of select="votes"/></td>
            </tr>
    </xsl:if>
    </xsl:for-each>

Прошу помощи разобраться, облазяла все что можно, не нашла подобных примеров


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Попробуйте следующее решение.

Оно основано на выражении предиката XPath:

<xsl:for-each select="person[position() &lt;= 10]">

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="html"/>

    <xsl:template match="/generals">
        <html>
            <h2>Князь</h2>
            <table border="1">
                <thead>
                    <tr bgcolor="#9acd32">
                        <th>Имя</th>
                        <th>Годы жизни</th>
                        <th>Количество голосов</th>
                        <th>Позиция</th>
                    </tr>
                </thead>
                <tbody>
                    <xsl:for-each select="person[position() &lt;= 10]">
                        <xsl:sort order="descending" select="number(votes)" data-type="number"/>
                        <tr>
                            <td>
                                <xsl:value-of select="name"/>
                            </td>
                            <td>
                                <xsl:value-of select="lifedates"/>
                            </td>
                            <td align="center">
                                <xsl:value-of select="votes"/>
                            </td>
                            <td align="center">
                                <xsl:value-of select="position()"/>
                            </td>
                        </tr>
                    </xsl:for-each>
                </tbody>
            </table>
        </html>
    </xsl:template>
</xsl:stylesheet>

Результат введите сюда описание изображения

→ Ссылка