xslt нумерация записей в таблице xml - PullRequest
0 голосов
/ 01 мая 2019

Я очень простая 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>

Этот стиль на самом деле не работает.как это «частично» делает.Весь процесс не завершен и неправильно отображается как таковой.

Мне нужно, чтобы это решение работало:

первая предыдущая страница х / у следующая последняя

Здесь я просто положил несколько рабочихПример скрипки, позволяющий понять, что я (действительно) имею в виду:

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

1 Ответ

1 голос
/ 01 мая 2019

Если я угадываю (!) Правильно, вы хотите разделить элементы на группы одинакового размера.Это может быть достигнуто довольно просто:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...