我是一个非常简单的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>
此样式实际上无效。就像它“部分地”那样。 整个过程不完整,因此显示错误。
我需要这种解决方案:
第一页上一页x / y下一页末页
在这里,我只是举了一个可行的小提琴示例,以确切地理解我(真正)的意思:
答案 0 :(得分:1)
如果我猜对了(!),则要将项目分成相等大小的组。可以很简单地做到这一点:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="groupSize" select="5" />
<xsl:template match="/group">
<html>
<body>
<!-- select every first item in a group -->
<xsl:apply-templates select="item[position() mod $groupSize = 1]" />
</body>
</html>
</xsl:template>
<xsl:template match="item">
<div id="set{position()}">
<ul>
<!-- list self and following siblings within this group -->
<xsl:apply-templates select=". | following-sibling::item[position() < $groupSize]" mode="item" />
</ul>
</div>
</xsl:template>
<xsl:template match="item" mode="item">
<li>
<xsl:value-of select="."/>
</li>
</xsl:template>
</xsl:stylesheet>
应用于您的输入示例,结果将是:
结果
<html>
<body>
<div id="set1">
<ul>
<li> 01 </li>
<li> 02 </li>
<li> 03 </li>
<li> 04 </li>
<li> 05 </li>
</ul>
</div>
<div id="set2">
<ul>
<li> 06 </li>
<li> 07 </li>
<li> 08 </li>
<li> 09 </li>
<li> 10 </li>
</ul>
</div>
<div id="set3">
<ul>
<li> 11 </li>
<li> 12 </li>
<li> 13 </li>
<li> 14 </li>
<li> 15 </li>
</ul>
</div>
<div id="set4">
<ul>
<li> 16 </li>
<li> 17 </li>
<li> 18 </li>
<li> 19 </li>
<li> 20 </li>
</ul>
</div>
<div id="set5">
<ul>
<li> 21 </li>
<li> 22 </li>
<li> 23 </li>
<li> 24 </li>
<li> 25 </li>
</ul>
</div>
<div id="set6">
<ul>
<li> 26 </li>
</ul>
</div>
</body>
</html>