Я очень простая XML-таблица с множеством строк, которые требуют постраничного отображения.Я знаю, что этот вопрос задавался ранее (так или иначе), но ему никогда не давали реального, хорошего решения.
И для справки, я думаю, что один из реальных примеров, когда xslt очень пригодится, - это разбиение на страницы xslt, для которого - я не знаю причину - на самом деле нигде подробно не объяснялосьвеб.Были приведены только неполные, неработающие или некоторые лапидарные примеры.Совершенно неудовлетворительно и ни полезно.
Вот почему я снова затронул этот вопрос.Я начну с некоторого довольно простого примера .xml, который каким-то образом соответствует этому примеру подкачки .xsl, который я приведу ниже.
.xml пример:
<group>
<item> 01 </item>
<item> 02 </item>
<item> 03 </item>
<item> 04 </item>
<item> 05 </item>
<item> 06 </item>
<item> 07 </item>
<item> 08 </item>
<item> 09 </item>
<item> 10 </item>
<item> 11 </item>
<item> 12 </item>
<item> 13 </item>
<item> 14 </item>
<item> 15 </item>
<item> 16 </item>
<item> 17 </item>
<item> 18 </item>
<item> 19 </item>
<item> 20 </item>
<item> 21 </item>
<item> 22 </item>
<item> 23 </item>
<item> 24 </item>
<item> 25 </item>
<item> 26 </item>
</group>
и соответствующий.xsl (взято с какого-то сайта, но части для краткости усечены):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<xsl:template match="/">
<xsl:variable name="recordsPerPage" select="5"/>
<xsl:variable name="pageNumber">
<xsl:choose>
<!-- first page -->
<xsl:when test="$currentPage <= 0 or $currentPage = '' or $currentPage = 'NaN'">0</xsl:when>
<!-- what was passed in -->
<xsl:otherwise>
<xsl:value-of select="$currentPage"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="numberOfRecords" select="count(/group/item)"/>
<!-- The fun starts here -->
<ul class="listing self-clear">
<xsl:for-each select="//item">
<xsl:if test="position() > $recordsPerPage * number($pageNumber) and position() <= number($recordsPerPage * number($pageNumber) + $recordsPerPage )">
<li>
<xsl:attribute name="class">
<xsl:if test="position() = $recordsPerPage * (number($pageNumber) + 1)">last</xsl:if>
</xsl:attribute>
<h4> <xsl:value-of select="text()"/> </h4>
</li>
</xsl:if>
</xsl:for-each>
</ul>
<xsl:call-template name="pagination">
<xsl:with-param name="pageNumber" select="$pageNumber"/>
<xsl:with-param name="recordsPerPage" select="$recordsPerPage"/>
<xsl:with-param name="numberOfRecords" select="$numberOfRecords"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="pagination">
<xsl:param name="pageNumber"/>
<xsl:param name="recordsPerPage"/>
<xsl:param name="numberOfRecords"/>
<div class="pagination">
<div class="wrapper">
<xsl:if test="(($pageNumber +1) * $recordsPerPage) < ($numberOfRecords)">
<a href="?page={$pageNumber + 1}" class="next">Next</a>
</xsl:if>
<span class="page-nos">Page </span>
<xsl:if test="$pageNumber > 0">
<a href="?page={$pageNumber - 1}" class="prev">Prev</a>
</xsl:if>
</div>
</div>
</xsl:template>
</xsl:stylesheet>
Этот стиль на самом деле не работает.как это «частично» делает.Весь процесс не завершен и неправильно отображается как таковой.
Мне нужно, чтобы это решение работало:
первая предыдущая страница х / у следующая последняя
Здесь я просто положил несколько рабочихПример скрипки, позволяющий понять, что я (действительно) имею в виду:
https://jsfiddle.net/MrcaS48/2e9kq3v0/