Постраничная навигация в xml документах

Материал из razgovorov.ru
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Общая инструкция

Отображение документа с постраничной навигацией табличной части

Чем больше размер документа пересылаемого через ЭДО, тем больше времени необходимо на его визуализацию. Визуализация больших xml документов (>1Mb) в личном кабинете может занимать несколько некомфортных секунд. Чтобы сделать просмотр документов всегда быстрым и без задержек следует при разработке визуализаций документов, которые могут быть потенциально большими, применять технологию постраничного показа табличной части. В визуализацию документа добавляется анализ его размера. Если документ большой (например, количество строк табличной части больше 50), то табличная часть выводится постранично, а остальные части документа (шапка, подвал) показываются в зависимости от номера текущей страницы.

Данная технология касается только отображения документа на экране. При печати или при сохранении в PDF, документ в любом случае будет выведен в полном объеме без постраничной навигации.

Общая схема изменений в xslt:

  1. В xslt добавляются несколько глобальных служебных переменных, которые хранят в себе информацию о номере текущей отображаемой страницы, количестве записей таблицы, количестве страниц, которые будут показываться.
  2. В корневом темплейте добавляется вызов служебного div-а, который отвечает за постраничное отображение документа. Этот блок div имеет свой идентификатор и параметры, которые заданы разработчиками.
  3. Показ шапки и подвала документа настраивается в зависимости от номера текущей страницы. Информацию в шапке, например, показывать только на первой странице, а подвал – только на последней. Однако, рекомендуется показывать шапку и подвал всегда и сделать только навигацию по страницам.
  4. При отображении строк табличной части добавляются условия показа строк в зависимости от номера текущей страницы и количества записей на странице.

Подробная схема изменений в xslt

Глобальные переменные

В начале xslt необходимо объявить 4 глобальные переменные:

  1. РазмерСтраницы – будет содержать в себе количество записей, которое должно отображаться на странице. Значение по-умолчанию: 0. В момент отображения документа автоматически заполняется значением из поля «Размер страницы» в форме добавления способа представления.
  2. Страница – хранит в себе текущую отображаемую страницу. Значение по-умолчанию: 0. Значение этой переменной меняется автоматически.
  3. КоличествоЗаписей – в эту переменную необходимо записать общее количество строк табличной части документа которые будут разнесены по страницам.
  4. КоличествоСтраниц – результат деления общего количества записей на размер страницы, округленный в большую сторону, или 1, если документ всегда должен отображаться на одной странице.

Пример записи переменных:

  <xsl:param name="РазмерСтраницы">0</xsl:param>
  <xsl:param name="Страница">0</xsl:param>
  <xsl:variable name="КоличествоЗаписей" select="count(//СвТов)"/>
  <xsl:variable name="КоличествоСтраниц">
    <xsl:choose>
      <xsl:when test="$РазмерСтраницы > 0">
        <xsl:value-of select="ceiling($КоличествоЗаписей div $РазмерСтраницы)"/>
      </xsl:when>
      <xsl:otherwise>1</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

Добавление служебного div

В корневом темплейте (<xsl:template match="/">) перед строкой <xsl:apply-templates/> необходимо добавить условие вывода служебного div-а, который при отображении документа позволит добавить постраничную навигацию:

<xsl:if test="$РазмерСтраницы>0">
        <div id="sds-presentation-paging" sds-presentation-pagesize="{$РазмерСтраницы}" sds-presentation-recordcount="{$КоличествоЗаписей}" sds-presentation-pagecurrent="{$Страница}"/>
</xsl:if>

Вывод общей информации документа

Если какую либо информацию необходимо выводить только на первой странице, то перед темплейтом (-ами) необходимо добавить условие:

<xsl:if test="$Страница=0"> 
		……. вызов Вашего темплейта или группы темплейтов….
</xsl:if>

Если какую либо информацию необходимо выводить только на последней странице, то перед темплейтом (-ами) необходимо добавить условие:

<xsl:if test="$Страница = $КоличествоСтраниц - 1"> 
		……. вызов Вашего темплейта или группы темплейтов….
</xsl:if>

Если перед темплейтом, который что-то показывает, нет условий указанных выше, то результат работы темплейта будет выводится на каждой странице.

Вывод табличной части с навигацией по страницам

Перед отображением табличной части необходимо добавить условие, которое будет показывать строки в зависимости от того какой размер страницы: Если размер страницы больше 0 то запускается логика показа строк постранично. Если размер страницы 0, то показываем все строки на одной странице.

      <xsl:choose>
        <xsl:when test="$РазмерСтраницы > 0"> 
		….. постранично….
        <xsl:otherwise>
               <xsl:apply-templates select="Таблица/СтрокаТаблицы"/>
        </xsl:otherwise>
      </xsl:choose>

В первом случае для того чтобы на странице выводить необходимое количество записей, учитывая при этом смещение (например, при размере страницы 20, на второй странице должны показываться строки с 21 по 40) необходимо: Добавить переменную в которой будет хранится порядковый номер первой строки на странице:

<xsl:variable name="startPosition" select="$Страница * $РазмерСтраницы + 1"/>

Добавить переменную в которой будет хранится порядковый номер последней строки на странице:

<xsl:variable name="endPosition" select="$startPosition + $РазмерСтраницы"/>

При вызове темплейта строки в условие отбора добавить отбор по позиции. Т.е. темплейт показа строки должен работать на те строки у которых текущая позиция больше или равна переменной startPosition и меньше endPosition:

<xsl:apply-templates select="Таблица/СвТов[position()>=$startPosition and $endPosition > position()]"/>

Пример:

      <xsl:choose>
        <xsl:when test="$РазмерСтраницы > 0">
          <xsl:variable name="startPosition" select="$Страница * $РазмерСтраницы + 1"/>
          <xsl:variable name="endPosition" select="$startPosition + $РазмерСтраницы"/>
          <xsl:apply-templates select="Таблица/СвТов[position()>=$startPosition and $endPosition > position()]"/>
        </xsl:when>
        <xsl:otherwise>
          <!--Обычным образом по старинке весь список-->
          <xsl:apply-templates select="Таблица/СвТов"/>
        </xsl:otherwise>
      </xsl:choose>