XSLTでのページナビゲーション

親愛なるハブロフチャン。 最近、XSLTテクノロジーを使用してページネーションを表示するタスクが満たされました。 インターネットでの標準ソリューションの検索に失敗した後、自転車を発明することが決定されました。



指定:GETリクエストから受信した現在のページの番号。 同じタイプのネストされた要素が多数あるルート要素で構成されるXMLファイル。 簡潔にするために、ファイルをこのタイプに減らします。



Nav.xmlデータファイル

<?xml version="1.0" encoding="UTF-8"?> <root> <item id="1"/><item id="2"/><item id="3"/><item id="4"/><item id="5"/><item id="6"/><item id="7"/><item id="8"/><item id="9"/><item id="10"/><item id="11"/><item id="12"/><item id="13"/><item id="14"/><item id="15"/><item id="16"/><item id="17"/><item id="18"/><item id="19"/><item id="20"/><item id="21"/><item id="22"/><item id="23"/><item id="24"/><item id="25"/><item id="26"/><item id="27"/><item id="28"/><item id="29"/><item id="30"/><item id="31"/><item id="32"/><item id="33"/> </root>
      
      





必要なこと:ページナビゲーションを提供する。 ページが最初でない場合、最初に戻されました。 ページが最後に表示されない場合は、最後に表示されます。 ページ上の要素の数、現在のページの前後のページ数を変更できます。



数時間の作業の後、次のことが明らかになりました。



Nav.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" encoding="utf-8" omit-xml-declaration="yes" indent="no" doctype-system="about:legacy-compat"/> <!--    --> <xsl:param name="page" select="1"/> <!--   --> <xsl:template match="/"> <!--     --> <xsl:variable name="pageItems" select="5"/> <!--    --> <xsl:variable name="pageCurrent"> <xsl:choose> <!--      --> <xsl:when test="number($page) < 1"> <xsl:text>1</xsl:text> </xsl:when> <!--       --> <xsl:when test="number($page) > ceiling(count(/root/*) div $pageItems)"> <xsl:value-of select="ceiling(count(/root/*) div $pageItems)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="number($page)"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <html lang="ru"> <head> <title><xsl:value-of select="concat(' № ',$pageCurrent)"/></title> <!--     --> <style> #nav li{float:left;list-style:none;} #nav a{text-decoration:none;padding:4px;color:#333} #nav a.on, #nav a:hover{background:#bbb;} </style> </head> <body> <h1><xsl:value-of select="concat(' № ',$pageCurrent)"/></h1> <ul> <xsl:for-each select="/root/*[position() > ($pageCurrent * $pageItems - $pageItems) and position() <= ($pageCurrent * $pageItems)]"> <li><xsl:value-of select="@id"/></li> </xsl:for-each> </ul> <hr/> <!--     --> <xsl:call-template name="pageNav"> <xsl:with-param name="items" select="/root/*"/> <xsl:with-param name="pageCurrent" select="$page"/> <xsl:with-param name="pageItems" select="$pageItems"/> <xsl:with-param name="pageParty" select="4"/> </xsl:call-template> </body> </html> </xsl:template> <!--     --> <xsl:template name="pageNav"> <!--  --> <xsl:param name="items"/> <!--   --> <xsl:param name="pageCurrent"/> <!--     --> <xsl:param name="pageItems"/> <!--      --> <xsl:param name="pageParty"/> <!--   --> <xsl:variable name="count" select="ceiling(count($items) div $pageItems)"/> <ul id="nav"> <!--     --> <xsl:if test="$pageCurrent > 1"> <li><a href="?page=1"><<</a></li> <li><a href="?page={$pageCurrent - 1}"><</a></li> </xsl:if> <!--  --> <xsl:for-each select="$items[(position() - 1) mod $pageItems = 0]"> <xsl:if test="($pageCurrent - $pageParty) <= position() and ($pageCurrent + $pageParty) >= position()"> <li><a href="?page={position()}"> <xsl:if test="$pageCurrent=position()"> <xsl:attribute name="class">on</xsl:attribute> </xsl:if> <xsl:value-of select="position()"/> </a></li> </xsl:if> </xsl:for-each> <!--     --> <xsl:if test="$pageCurrent < $count"> <li><a href="?page={$pageCurrent + 1}">></a> </li> <li><a href="?page={$count}">>></a></li> </xsl:if> </ul> </xsl:template> </xsl:stylesheet>
      
      





少し長くなりましたが、難しくはありませんでした。 テーブルは2つの部分に分かれています。 最初は、ページに応じて基本的なHTMLマークアップとコンテンツを表示します。 第二に、ナビゲーション自体。



ページナビゲーションテンプレートは名前で呼び出され、4つのパラメーターを取ります。 これらは、表示されるアイテム、現在のページの数、ページに表示されるアイテムの数、および前後のナビゲーションページの数です。



ここで、PHPでハンドラーを作成しますが、他の言語も使用できます。



Nav.php処理ファイル

 <?php //      $data = new DOMDocument('1.0', 'UTF-8'); $data->load('nav.xml'); $view = new DOMDocument('1.0', 'UTF-8'); $view->load('nav.xsl'); //  XSLT  $xsl = new XSLTProcessor(); //    $xsl->importStyleSheet($view); //      ,     if (isset($_GET['page'])) { $xsl->setParameter('', 'page', $_GET['page']); } //       echo $xsl->transformToXML($data); ?>
      
      





ここではすべてが簡単です。 データとスタイルシートをロードします。 XSLTプロセッサを作成します。 ページ番号がある場合は、テーブルに渡します。 変換の結果を画面に表示します。




All Articles