xslt xml表记录分页

时间:2019-04-30 21:24:23

标签: xml xslt

我是一个非常简单的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 &lt;= 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() &gt; $recordsPerPage * number($pageNumber) and position() &lt;= 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) &lt; ($numberOfRecords)">
  <a href="?page={$pageNumber + 1}" class="next">Next</a>
 </xsl:if>
 <span class="page-nos">Page </span>
  <xsl:if test="$pageNumber &gt; 0">
   <a href="?page={$pageNumber - 1}" class="prev">Prev</a>
  </xsl:if>
 </div>
</div>
</xsl:template>
</xsl:stylesheet>

此样式实际上无效。就像它“部分地”那样。 整个过程不完整,因此显示错误。

我需要这种解决方案:

第一页上一页x / y下一页末页

在这里,我只是举了一个可行的小提琴示例,以确切地理解我(真正)的意思:

https://jsfiddle.net/MrcaS48/2e9kq3v0/

1 个答案:

答案 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() &lt; $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>