【问题标题】:How to make pagination in XSLT如何在 XSLT 中进行分页
【发布时间】:2009-09-17 19:36:05
【问题描述】:

我有以下 XSLT:

<xsl:template match="/">        
  <div id="dokumentliste">
    <xsl:variable name="alleNyheder" select="$currentPage//node" />

    <xsl:for-each select="$alleNyheder">
    <xsl:sort data-type="text" select="@createDate" order="descending" />            

        <xsl:if test="./data[@alias='manchet'] != ''">
            <div class="newsitem">
                <h2>
                    <xsl:value-of select="./data[@alias='title']"/>
                </h2>

                <xsl:if test="./data[@alias = 'manchet'] != ''">
                    <div class="nyhedContent">
                        <p>
                            <span class="dokumentListeDato">
                                <xsl:choose>
                                    <xsl:when test="./data[@alias='date'] != ''">
                                        <xsl:value-of select="umbraco.library:FormatDateTime(./data[@alias='date'], 'dd. MMMM yyyy')"/>
                                    </xsl:when>
                                    <xsl:otherwise>
                                        <xsl:value-of select="umbraco.library:FormatDateTime(./@createDate, 'dd. MMMM yyyy')"/>
                                    </xsl:otherwise>
                                </xsl:choose>
                            </span>
                            <xsl:value-of select="./data[@alias = 'manchet']"/>
                        </p>
                    </div>
                </xsl:if>
                <div class="dokumentListe_laes_mere">
                    <a href="{umbraco.library:NiceUrl(@id)}">
                        Læs mere<img src="/frontend/images/macro/macro_laes_mere.png" alt="Læs mere"/>
                    </a>
                </div>
            </div>
            <!-- End newsitem -->
        </xsl:if>
      </xsl:for-each>
   </div> 
 </xsl:template>

我正在制作一个新闻列表,并且想做某种分页。几乎和谷歌上看到的一样。你知道“通常的”。

但我不知道该怎么做。

每页上的新闻站点数量并不重要,但假设每页有 10 个。当显示前 10 个新闻站点时,我希望显示分页。使用数字左右两侧的“下一个”和“上一个”按钮。

是否有可能做到这一点,我是否已经充分解释了我的问题?顺便说一句,我使用 Umbraco CMS :)

非常感谢。

-金

【问题讨论】:

    标签: xslt pagination umbraco


    【解决方案1】:

    类似这样的: 我也在那里留下了一些代码来处理您列表中的图像:-)

    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:param name="currentPage"/>
    <xsl:template match="/">
        <xsl:variable name="recordsPerPage" select="2"/>
        <xsl:variable name="pageNumber">
            <xsl:choose>
                <!-- first page -->
                <xsl:when test="umbraco.library:RequestQueryString('page') &lt;= 0 or string(umbraco.library:RequestQueryString('page')) = '' or string(umbraco.library:RequestQueryString('page')) = 'NaN'">0</xsl:when>
                <!-- what was passed in -->
                <xsl:otherwise>
                    <xsl:value-of select="umbraco.library:RequestQueryString('page')"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:variable name="numberOfRecords" select="count($currentPage/node)"/>
    
        <!-- The fun starts here -->
    
        <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>
    
    <ul class="listing self-clear">
            <xsl:for-each select="$currentPage/node [string(data [@alias='umbracoNaviHide']) != '1']">
                <xsl:sort order="descending" select="data[@alias='releasedOn']"></xsl:sort>
    
                <xsl:if test="position() &gt; $recordsPerPage * number($pageNumber) and position() &lt;= number($recordsPerPage * number($pageNumber) + $recordsPerPage )">
                    <li>
                        <xsl:attribute name="class">
                            <xsl:if test="data[@alias='image'] = ''">
                                no-img
                            </xsl:if>
                            <xsl:if test="position() = $recordsPerPage * (number($pageNumber) + 1)">
                                last
                            </xsl:if>
                        </xsl:attribute>
                        <h3>
                            <a href="{umbraco.library:NiceUrl(@id)}">
                                <xsl:value-of select="@nodeName"/>
                            </a>
                        </h3>
                        <xsl:if test="data[@alias='image'] != ''">
                            <img src="{data[@alias='image']}" class="drop-shadow" />
                        </xsl:if>
                        <p class="date"><xsl:value-of select="umbraco.library:LongDate(data[@alias='releasedOn'])"/></p>
                        <xsl:value-of select="data[@alias='abstract']" disable-output-escaping="yes"/>
                        <a href="{umbraco.library:NiceUrl(@id)}" class="read-more">Read More</a>
                    </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>
    
            <xsl:if test="$pageNumber &gt; 0">
                <a href="?page={$pageNumber -1}" class="prev">Prev</a>
            </xsl:if>
    
            <span class="page-nos">
            Page
            <xsl:call-template name="for.loop">
                <xsl:with-param name="i">1</xsl:with-param>
                <xsl:with-param name="page" select="$pageNumber +1"></xsl:with-param>
                <xsl:with-param name="count" select="ceiling(count($currentPage/node)div $recordsPerPage)"></xsl:with-param>
            </xsl:call-template>
            </span>
    
        </div>
        </div>
    </xsl:template>
    
    <xsl:template name="for.loop">
        <xsl:param name="i"/>
        <xsl:param name="count"/>
        <xsl:param name="page"/>
        <xsl:if test="$i &lt;= $count">
            <span>
            <xsl:if test="$page != $i">
                <a href="{umbraco.library:NiceUrl($currentPage/@id)}?page={$i - 1}" >
                    <xsl:value-of select="$i" />
                </a>
            </xsl:if>
            <xsl:if test="$page = $i">
                <xsl:value-of select="$i" />
            </xsl:if>
            </span>
        </xsl:if>
    
        <xsl:if test="$i &lt;= $count">
            <xsl:call-template name="for.loop">
                <xsl:with-param name="i">
                    <xsl:value-of select="$i + 1"/>
                </xsl:with-param>
                <xsl:with-param name="count">
                    <xsl:value-of select="$count"/>
                </xsl:with-param>
    
                <xsl:with-param name="page">
                    <xsl:value-of select="$page"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>
    

    【讨论】:

    • 它几乎可以工作 Myster,但不完全 :) 当我在第一页上时,它显示第 1 页,这很好。但是链接不显示。当我说链接时,我想到了数字和“下一步”按钮。我设置$recordsPerPage = 5,有12个newsitems,所以应该有第1、2、3页。
    • 如果您使用的是 Visual Studio 并设置了调试,您可以在 xsl:if 上放置一个断点,并围绕“下一步”按钮检查变量。我希望您的 NumberOfRecords 设置不正确。所有节点都发布了吗?确保从树中重新发布,并勾选发布所有子项
    【解决方案2】:

    我现在想出了这个。我可以看到您刚刚复制/粘贴了 Tim Geyssens 在此处制作的分页:http://www.nibble.be/?p=11

    而且代码也不错,但我更改了一些代码以使其正常工作。我不知道我是否应该接受我自己的答案作为正确的答案,Myster 的答案作为正确的答案,或者我是否可以删除此帖子?

    【讨论】:

    • 嘿,它被复制和粘贴了很多次,我不知道它来自蒂姆;-)蒂姆总是有很多好东西。如果我的回答有误,请告诉我,我认为我们在不同的网站上使用相同的 xslt。
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2018-07-22
    • 2014-08-07
    • 2011-02-15
    • 2019-04-23
    • 2019-08-17
    • 2017-10-03
    相关资源
    最近更新 更多