постраничная разборка xml
Есть задача - разместить на страници товары из некоторого xml-файла. Использую xlst-преобразования и получаю на выходе табличку со всеми товарами. Вопрос - как одним запросом извлечь определенное количество записей из xml-файла, а не все записи сразу? Как передавать параметры xlst-процессору, чтобы можно было одним xsl-файлом выбирать товары с различными значениями атрибута.
читал... не помогло. Я разобрался с технологией, создал сложное преобразование... но вот как выбрать часть записей не могу додуматься. Поможите кто может
Решение влоб: берешь и в for-each весь вывод строк фильтруешь с помощью функции position(). Эта функция возвращает порядковый номер текущей итерации. То есть добавив что-то типа <xsl:if test="position()<11">вывод строки</xsl:if> получишь первые 10 строк своего списка.
Цитата: GHopper
Здраствуйте!
Есть задача - разместить на страници товары из некоторого xml-файла. Использую xlst-преобразования и получаю на выходе табличку со всеми товарами. Вопрос - как одним запросом извлечь определенное количество записей из xml-файла, а не все записи сразу? Как передавать параметры xlst-процессору, чтобы можно было одним xsl-файлом выбирать товары с различными значениями атрибута.
Есть задача - разместить на страници товары из некоторого xml-файла. Использую xlst-преобразования и получаю на выходе табличку со всеми товарами. Вопрос - как одним запросом извлечь определенное количество записей из xml-файла, а не все записи сразу? Как передавать параметры xlst-процессору, чтобы можно было одним xsl-файлом выбирать товары с различными значениями атрибута.
А ты думал, что увидят те пользователи, к которых браузер не поддерживает XSLT?
Лично я для похожей задачи (http://alekciy.ru/freelance/IIImeJIb/index.php?menu=price) решил генерить для клиента HTML без всяких XSLT.
Ипользуя DOM функции из PHP5 + возможность работы с XPath я вот из этого: http://alekciy.ru/freelance/IIImeJIb/price.xml и получаю то, что видишь в первом линке.
как один из вариантов! работает. Только вот как теперь передать парамерты в xslt-процессору, чтобы позиция в одном случае была меньше 11, а в другом больше 11-22. Не заводить ведь для каждой страници отдельный xsl-файл?
"А ты думал, что увидят те пользователи, к которых браузер не поддерживает XSLT?" - я тоже генерирую для клиентов html без всяких xslt. Просто у меня XSLT занимается той самой генерацией html-файла, а не огномная процедура на DOM+XPath+PHP. Попробуй сам - у этой технологии есть право на жизнь.
Цитата: GHopper
Только вот как теперь передать парамерты в xslt-процессору, чтобы позиция в одном случае была меньше 11, а в другом больше 11-22. Не заводить ведь для каждой страници отдельный xsl-файл?
Конечно все нужно делать в одном файле. Есть возможность передавать в xslt-процессор параметры. В php5 это выглядит так:
Код:
$proc = new XsltProcessor();
$proc->registerPhpFunctions();
$proc->importStylesheet($xsl);
$proc->setParameter('', 'conference', $conf_id);
$result = $proc->transformToXML($inputdom);
$proc->registerPhpFunctions();
$proc->importStylesheet($xsl);
$proc->setParameter('', 'conference', $conf_id);
$result = $proc->transformToXML($inputdom);
Тогда потом в xsl-скрипте можно объявить эти значения как аргументы и использовать как обычные переменные(xsl:variable):
[HTML]
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:param name="conference"/>
........
<xsl:value-of select="$conference"/>
[/HTML]
Ты можешь передавать в качестве таких параметров номер первой и последней записи которые хочешь выводить пользователю и использовать эти номера в фильтре при выводе записей.
Цитата: GHopper
Просто у меня XSLT занимается той самой генерацией html-файла, а не огномная процедура на DOM+XPath+PHP. Попробуй сам - у этой технологии есть право на жизнь.
А кто спорит? А насчет огромной процедуры... ну это уже как ты сам напишешь...
Для потомков:
#index.php
$xml = new DOMDocument('1.0', 'windows-1251');
$xsl_proc = new XSLTProcessor();
$xsl = new DOMDocument('1.0', 'windows-1251');
$xsl_proc->registerPhpFunctions();
$xsl_proc->setParameter('', 'begin', 1);
$xsl_proc->setParameter('', 'end', 25);
$xml->load('test_main.xml');
$xsl->load('test_main.xsl');
$xsl_proc->importStyleSheet($xsl);
echo $xsl_proc->transformToXML($xml);
#test_main.xsl
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="html" encoding="windows-1251" indent="no"/>
<xsl:param name="begin"/>
<xsl:param name="end"/>
...
<xsl:if test="(position() > $begin) and (position() < $end)">
...