Stepan0v писал(а):
Как посчитать количество уже выведенных элементов?
position()
всегда возвращает номер текущего элемента в выборкенапример
<xsl:if test="position() > 5">Мы вывели уже, как минимум, 5 элементов</xsl:if>
Stepan0v писал(а):
Элементы выводятся через шаблон, но не подряд.
Тогда два варианта -
- неправильный это учитывать "вывод не подряд" в условии, при этом у вас position() будет равен номеру текущего элемента в выборке, но не обязательно равен кол-ву выведенных элементов,
- и правильный, это передавать в темплейт только те элементы, которые надо выводить.
И пару примеров, для наглядности.
Задача по выводу только четных элементов:
Допустим, у нас есть xml (кстати, от облака тегов в магазине), в котором есть некоторое количество узлов tag:
<?xml version="1.0"?>
<shop id="1">
<shop_dir_id>0</shop_dir_id>
<shop_company_id>1</shop_company_id>
<site_id>1</site_id>
...
<tag id="69">
<tag_dir_id>0</tag_dir_id>
<name>Ardo</name>
<path>Ardo</path>
<user_id>0</user_id>
<description></description>
<urlencode>Ardo</urlencode>
<count>2</count>
</tag>
<tag id="65">
<tag_dir_id>0</tag_dir_id>
<name>Ariston</name>
<path>Ariston</path>
<user_id>0</user_id>
<description></description>
<urlencode>Ariston</urlencode>
<count>2</count>
</tag>
<tag id="87">
<tag_dir_id>0</tag_dir_id>
<name>Ballu</name>
<path>Ballu</path>
<user_id>0</user_id>
<description></description>
<urlencode>Ballu</urlencode>
<count>1</count>
</tag>
...
</shop>
И мы хотим вывести только четные узлы.
По первому способу это будет так:
<xsl:template match="/shop">
<ol>
<xsl:apply-templates select="tag"/>
</ol>
</xsl:template>
<xsl:template match="tag">
<xsl:if test="position() mod 2 = 0">
<li>Уже выведено <xsl:value-of select="position()"/> тегов -
<xsl:value-of select="name"/>
</li>
</xsl:if>
</xsl:template>
и в результате получится:
Цитата:
1. Уже выведено 2 тегов - Ariston
2. Уже выведено 4 тегов - BBK
3. Уже выведено 6 тегов - Bosch
4. Уже выведено 8 тегов - Cowon
5. Уже выведено 10 тегов - Electrolux
6. Уже выведено 12 тегов - Indesit
7. Уже выведено 14 тегов - JVC Everio
8. Уже выведено 16 тегов - LG
9. Уже выведено 18 тегов - Nexx
10. Уже выведено 20 тегов - Noirot
11. Уже выведено 22 тегов - Panasonic
12. Уже выведено 24 тегов - Polaris
13. Уже выведено 26 тегов - Sony
14. Уже выведено 28 тегов - Timberk
15. Уже выведено 30 тегов - Whirlpool
16. Уже выведено 32 тегов - Атлант
17. Уже выведено 34 тегов - Гефест
18. Уже выведено 36 тегов - плита
19. Уже выведено 38 тегов - телевизор
20. Уже выведено 40 тегов - холодильник
И при этом мы создадим паразитную нагрузку на сервер, потому что обработаем все 40 узлов, даром, что выведем только 20 из них.
Вторым, правильным способом, это будет так:
<xsl:template match="/shop">
<ol>
<xsl:apply-templates select="tag[position() mod 2 = 0]"/>
</ol>
</xsl:template>
<xsl:template match="tag">
<li>Уже выведено <xsl:value-of select="position()"/> тегов -
<xsl:value-of select="name"/>
</li>
</xsl:template>
и в результате получим полное соответствие
Цитата:
1. Уже выведено 1 тегов - Ariston
2. Уже выведено 2 тегов - BBK
3. Уже выведено 3 тегов - Bosch
4. Уже выведено 4 тегов - Cowon
5. Уже выведено 5 тегов - Electrolux
6. Уже выведено 6 тегов - Indesit
7. Уже выведено 7 тегов - JVC Everio
8. Уже выведено 8 тегов - LG
9. Уже выведено 9 тегов - Nexx
10. Уже выведено 10 тегов - Noirot
11. Уже выведено 11 тегов - Panasonic
12. Уже выведено 12 тегов - Polaris
13. Уже выведено 13 тегов - Sony
14. Уже выведено 14 тегов - Timberk
15. Уже выведено 15 тегов - Whirlpool
16. Уже выведено 16 тегов - Атлант
17. Уже выведено 17 тегов - Гефест
18. Уже выведено 18 тегов - плита
19. Уже выведено 19 тегов - телевизор
20. Уже выведено 20 тегов - холодильник
и сэкономим на нагрузке сервера
P.S. Кстати, возможно вам еще понадобится функция
last()
- она возвращает общее число элементов в выборке. Для первого из приведенных примеров она вернет 40, а для второго - 20.
<xsl:if test="position() = last()">
- проверка, что текущий обрабатываемый элемент - последний.