Выборка 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() <= 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() <= 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>
