Постраничная навигация в xml документах — различия между версиями
м (Чугунов Дмитрий переименовал страницу Визуализация XML документов в Постраничная навигация в xml документах) |
|
(нет различий)
|
Версия 13:21, 20 марта 2017
Содержание
Отображение документа с постраничной навигацией табличной части
Чем больше размер документа пересылаемого через ЭДО, тем больше времени необходимо на его визуализацию. Визуализация больших xml документов (>1Mb) в личном кабинете может занимать несколько некомфортных секунд. Чтобы сделать просмотр документов всегда быстрым и без задержек следует при разработке визуализаций документов, которые могут быть потенциально большими, применять технологию постраничного показа табличной части. В визуализацию документа добавляется анализ его размера. Если документ большой (например, количество строк табличной части больше 50), то табличная часть выводится постранично, а остальные части документа (шапка, подвал) показываются в зависимости от номера текущей страницы.
Данная технология касается только отображения документа на экране. При печати или при сохранении в PDF, документ в любом случае будет выведен в полном объеме без постраничной навигации.
Общая схема изменений в xslt:
- В xslt добавляются несколько глобальных служебных переменных, которые хранят в себе информацию о номере текущей отображаемой страницы, количестве записей таблицы, количестве страниц, которые будут показываться.
- В корневом темплейте добавляется вызов служебного div-а, который отвечает за постраничное отображение документа. Этот блок div имеет свой идентификатор и параметры, которые заданы разработчиками.
- Показ шапки и подвала документа настраивается в зависимости от номера текущей страницы. Информацию в шапке, например, показывать только на первой странице, а подвал – только на последней. Однако, рекомендуется показывать шапку и подвал всегда и сделать только навигацию по страницам.
- При отображении строк табличной части добавляются условия показа строк в зависимости от номера текущей страницы и количества записей на странице.
Подробная схема изменений в xslt
Глобальные переменные
В начале xslt необходимо объявить 4 глобальные переменные:
- РазмерСтраницы – будет содержать в себе количество записей, которое должно отображаться на странице. Значение по-умолчанию: 0. В момент отображения документа автоматически заполняется значением из поля «Размер страницы» в форме добавления способа представления.
- Страница – хранит в себе текущую отображаемую страницу. Значение по-умолчанию: 0. Значение этой переменной меняется автоматически.
- КоличествоЗаписей – в эту переменную необходимо записать общее количество строк табличной части документа которые будут разнесены по страницам.
- КоличествоСтраниц – результат деления общего количества записей на размер страницы, округленный в большую сторону, или 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>