Прогрессивная загрузка XML страниц

?v=1
Прогрессивная загрузка XML страниц — это загрузка с одновременным показом уже загруженных и обработанных частей XML страницы пока XSLT шаблон всё ещё обрабатывает остальные части.

У нас есть очень большой XML. Это статья с очень большим количеством комментариев. На медленном и нестабильном мобильном интернете её загрузки можно и не дождаться. Во время загрузки случается обрыв связи и XML остаётся не догруженным. Казалось бы можно просто обновить страницу и браузер бы просто догрузил недостающую часть. Но нет. Браузер грузит страницу заново и снова это не удаётся и мы видим ошибку вместо страницы.

Но выход из этой ситуации есть. Мы разделим XML на маленькие кусочки которые будут успевать загрузиться на медленном канале и попадут в кеш. Бонусом мы получаем защиту от недогруза и прогрессивную загрузку.


С чем мы будем работать


Статья в XML

Этот файл содержит заголовок, описание, текст статьи и много много комментариев. Если быть точнее, то 5962 комментария.

У каждого комментария есть атрибут 'индекс'. Этот индекс используется другими комментариями в атрибуте 'на' для того чтобы указать что комментарий является ответом на комментарий, индекс которого указан.


lorem-ipsum.xml


<статья>
    Lorem Ipsum
    
    <текст>Quisque sollicitudin malesuada urna, id tincidunt quam. Pellentesque luctus, sem vel posuere efficitur, est enim pulvinar orci, et vulputate orci dui a libero. Nam eget mauris sed diam pretium fermentum. Proin euismod ultrices justo, non aliquet ipsum bibendum at. Duis eget laoreet mauris. Morbi tristique arcu libero, quis pharetra justo bibendum eget. In at quam sed lacus vestibulum tincidunt quis ut ex.
    <комментарий индекс="1">
Nunc sit amet ligula mauris. Integer vel nisi ac turpis rhoncus suscipit. Fusce elementum ut elit quis rutrum. Nulla bibendum placerat ex pulvinar accumsan. Praesent vestibulum hendrerit accumsan. Sed quis ligula pretium, condimentum enim in, cursus elit. Phasellus quis mauris arcu. Integer congue ex et ante porttitor vestibulum. Donec vel mauris venenatis, ultrices leo in, dapibus metus. Morbi pharetra eleifend libero nec efficitur. Fusce efficitur et ligula quis scelerisque. Curabitur eget nibh at nunc lacinia fringilla et eget quam. Praesent malesuada, odio in pulvinar semper, libero nunc consectetur lorem, vel egestas erat tellus nec ipsum.


    <комментарий на="1" индекс="4">
Praesent varius vitae arcu sed imperdiet. Proin pulvinar a augue blandit scelerisque. Pellentesque lectus erat, gravida lobortis lorem ut, dignissim tempor felis. Nunc porttitor libero quis est sodales, non ornare metus eleifend. Cras orci lacus, auctor non sollicitudin lacinia, ultricies vitae diam. Fusce eu leo varius, interdum sapien ac, vestibulum orci. Sed placerat feugiat odio, vitae tempor tellus volutpat tincidunt. Cras dapibus est et mi euismod ornare. Vestibulum accumsan justo non volutpat dictum. Curabitur porttitor, magna id euismod tincidunt, metus nisl fermentum tellus, id pulvinar leo nibh vel velit. Sed gravida gravida sapien et porttitor. Nam volutpat, ex id faucibus commodo, arcu arcu fringilla mi, et volutpat nunc turpis at ligula. Pellentesque et vulputate ligula, lobortis dignissim ligula. Nulla laoreet auctor ultricies. Interdum et malesuada fames ac ante ipsum primis in faucibus.



Основной XSLT шаблон

Это небольшой XSLT шаблон, который преобразует XML в полноценный xHTML и собирает из списка ветки комментариев.


статья.xslt

    

    
    

    
    
        
            
        
    

    
    
        
            
                
                
                

                
            
            
                
                
                

Комментарии
:
Ответы


Тестируем

Ставим в браузере ограничение скорости GPRS. Открываем страницу и уходим пить чай. На экране будет предыдущая страница, до тех пор, пока не загрузится полностью XML файл и отработает XSLT шаблон.

lorem-ipsum.xml

Полная загрузка: 10,77 мин


Обрабатываем и делим XML файл

Нам надо разделить статью на часть с текстом статьи и несколько частей которые буду содержать комментарии.

В браузере пользователя сразу будет отображена часть с текстом с статьи и по мерере загрузки частей комментариев будут появлятся и они.

Поскольку работать мы будем с XML файлом, то почему бы операции с ним не доверить также XSLT шаблонам.


Задаём межстраничные связи комментариев

Шаблону задаётся количество комментариев на один XML файл и он комментариям дописывает атрибут 'страницы-ответов', в котором перечисляются индексы XML файлов, в которых будут находится ответы на этот комментарий.

xslt\задать-страницы-ответов.xslt:


    

     

    
    

    
    
        
            
        
    

    
    

        
        

        
        

        
        
            
            

            
            
                
                
                    
                    

                        
                        

                    
                
            

            
            
        
    

    
        
        

        
        

        
        

        
        

        
        
            
             

            
            
                
                
            
        
    


Определяем индекс последнего XML файла с комментариями

Шаблон просто делит количество комментариев всего на количество комментариев на страницу и выводит целое число меньшее или равное результату.

xslt\индекс-последней-страницы.xslt:



    
    

    
    

    
        
        
    


Делим комметирии на диапазоны

Шаблон выбирает из статьи комментарии для заданного индекса ('страница') XML файла.

xslt\выделить-диапазон.xslt:


    

    

    
    

    
    

    
        
        href="../сборка-статьи.xslt" type="text/xsl"

        
        
    

    
        <статья путь="{$путь}">
            
            

            
            
        
    


Оставляем только текст статьи

Шаблон удаляет все комментарии, оставляя только текст статьи.

xslt\убрать-комментарии.xslt:


    

    
    
        
            
        
    

    
        
        href="../прогрессивная-загрузка.xslt" type="text/xsl"

        
        
    

    
    


Скачиваем msxsl.exe

Для использования шаблонов в коммандной строке нам понадобится простая утилита msxsl.exe. Ей мы можем задать XML документ и XSLT шаблон и получить результат в stdout или в заданный файл.


CMD файл

Теперь нам необходимо применить эти все шаблоны к XML файлу статьи.

progressive.cmd lorem-ipsum.xml 100

progressive.cmd:

chcp 65001

rem Создаём дирректорию с именем исходного XML файла без расширения
md "%~dpn1"

rem Задаём межстраничные связи комментариев
msxsl.exe %1 "%~dp0xslt\задать-страницы-ответов.xslt" -xw -o "%~dpn1\index.xml" комментариев=%2

rem Определяем индекс последнего XML файла с комментариями
for /f "delims=" %%a in ('msxsl.exe %1 ^"%~dp0xslt\индекс-последней-страницы.xslt^" комментариев^=%2') do set последняя=%%a

rem Делим комметирии на диапазоны
for /l %%i in (0,1,%последняя%) do msxsl.exe -o "%~dpn1\%%i.xml" "%~dpn1\index.xml" "%~dp0xslt\выделить-диапазон.xslt" комментариев=%2 страница=%%i путь="%~n1"

rem Оставляем только текст статьи
msxsl.exe "%~dpn1\index.xml" "%~dp0xslt\убрать-комментарии.xslt" -o "%~dpn1\index.xml"


Собираем в браузере


Прогрессивная загрузка

Этот шаблон отображает текст статьи, а в фрейме запускает загрузку статьи с комментариями. Как только блок комментариев появляется во фрейме он переносится на основную страницу. Второй шаблон в это время продожает подгружать комментарии и они появляются на основной странице сразу как только тот обработает очередную порцию.

прогрессивная-загрузка.xslt