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

Материал из razgovorov.ru
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
[http://inside.sbis.ru/doc/_layouts/WordViewer.aspx?id=/doc/3%20%20%20%20%20%20%20%203/09.%20%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B/%D0%9E%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20xml-%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2/%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8%20%D0%BF%D0%BE%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5%20xslt%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2.docx Общая инструкция]
 
[http://inside.sbis.ru/doc/_layouts/WordViewer.aspx?id=/doc/3%20%20%20%20%20%20%20%203/09.%20%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B/%D0%9E%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20xml-%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2/%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8%20%D0%BF%D0%BE%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5%20xslt%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2.docx Общая инструкция]
  
==Отображения документа с постраничной навигацией табличной части==
+
==Отображение документа с постраничной навигацией табличной части==
  
 
Чем больше размер документа пересылаемого через ЭДО, тем больше времени необходимо на его визуализацию. Визуализация больших xml документов (>1Mb) в личном кабинете может занимать несколько некомфортных секунд. Чтобы сделать просмотр документов всегда быстрым и без задержек следует при разработке визуализаций документов, которые могут быть потенциально большими,  применять технологию постраничного показа табличной части.
 
Чем больше размер документа пересылаемого через ЭДО, тем больше времени необходимо на его визуализацию. Визуализация больших xml документов (>1Mb) в личном кабинете может занимать несколько некомфортных секунд. Чтобы сделать просмотр документов всегда быстрым и без задержек следует при разработке визуализаций документов, которые могут быть потенциально большими,  применять технологию постраничного показа табличной части.

Версия 13:20, 20 марта 2017

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

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

Чем больше размер документа пересылаемого через ЭДО, тем больше времени необходимо на его визуализацию. Визуализация больших 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>