Как с помощью "XSLT" сделать разбиение на страницы?

evgkuz

Новичок
Как с помощью "XSLT" сделать разбиение на страницы?

Как с помощью "XSLT" сделать разбиение на страницы?
Есть news.xml файл с новостями их надо разбить по 10 на одной стринице.
Как это можно сделать?

На PHP+MySQL это просто, а как это сделать на "XSLT"? Ведь там нет языка запросов, и вообще кроме "if", я там ничего не нашёл.
Как вывести все записи я знаю, а как разбить по страницам - нет.

Может кто-нибудь подкинет простой примерчик?
 

slach

Новичок
ну то что ты там кроме if ничего не нашел это еще ничего не значит...
XPath самый натуральный язык запросов =)
ты просто не въезжаешь в технологию =)

попробуем помочь...

1) у тебя есть XML примерно такой структуры
<news>
<item id="...">
<title>заголовок</title>
<text>текст новости</text>
</item>
...
</news>

2) тебе надо разбить все news/item по 10 в зависимости от входящего параметра $_GET['page']

3) тебе надо научиться передавать параметры из PHP в XSLT шаблон
через Sablotron это делается так
PHP:
$arguments = array('/_xml'=>$xml_content, '/_xsl'=>$xsl_template);

      $xh = xslt_create();
      $output = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', null, $arguments,$_GET);
      xslt_free($xh);
      echo $output;
вместо $_GET можешь формировать свой ассоциативный массив

4) теперь надо научить XSLT шаблон понимать что же ему передали из PHP и вывести нужную часть контента, плюс сделать разбивку по страницам,делается это так
PHP:
<xsl:styleesheet ...>
<xsl:param name="page"/>
<xsl:param name="pg_size">10</xsl:param>

<xsl:template match="/">
....
<xsl:apply-templates select="news/item">
..
<xsl:call-template name="pager"/>
</xsl:template>

<xsl:template match="item">
title=<xsl:value-of select="title"/>
...
</xsl:template>

<xsl:template name="pager">
<xsl:param name="pg_current">1</xsl:param>
<xsl:variable name="pg_count" select="round(/news/item div $pg_size)"/>

<xsl:choose>

 <xsl:when test="$pg_current=$page">
  <b><xsl:value-of select="$pg_current"/></b>
 </xsl:when>
 <xsl:otherwise>
  <a href="/news/?page={$pg_current}" ><xsl:value-of select="$pg_current"/></a>
 </xsl:otherwise>

</xsl:choose>

<xsl:if test="$pg_current &lt; $pg_count">
 &#160;|&#160;
 <xsl:call-template name="pager">
  <xsl:with-param name="pg_current" select="$pg_current+1"/>
 </xsl:call-template>
</xsl:if>

<xsl:if test="($page &lt; $pg_count) and ($pg_current = $page)">
 &#160;|&#160;
 <a href="/news/?page={$pg_current+1}"> &gt;&gt;</a>
</xsl:if>

</xsl:template>

</xsl:stylesheet>
P.S.
описанный порядок действий имеет смысл, в том случае, если ты НЕ контроллируешь XML с новостями и он у тебя лежит в отдельном файле, сгенерированном не тобой ;) если контроллируешь, то не тупи делай SELECT ... LIMIT ... и выводи в XML только то, что нужно =)
 

marat

Guest
Пример не работает (((

-~{}~ 14.07.04 15:55:

У меня есть вариант попроще.... Он разбивает на страницы но не выводит линейку с их номерами

XML: news.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by maratis (vcp) -->
<news>
<item>
<title>mysql-3.23.58.tar.gz</title>
<text>версия для UNIX (11.5M)</text>
</item>
<item>
<title>mysql-3.23.58-win.zip</title>
<text>версия для Windows 95/98/NT/2000/XP/2003 (12.8M)</text>
</item>
<item>
<title>mysql-4.0.18-win.zip</title>
<text>версия для Windows 95/98/NT/2000/XP/2003 (23.1M)</text>
</item>
<item>
<title>mysql-4.0.20.tar.gz</title>
<text>версия для UNIX (13.2M)</text>
</item>
<item>
<title>mysql-4.1.1a-alpha-win.zip</title>
<text>версия для Windows 95/98/NT/2000/XP/2003 (21.3M)</text>
</item>
<item>
<title>mysql-4.1.1-alpha.tar.gz</title>
<text>версия для UNIX (14.9M)</text>
</item>
<item>
<title>mysql-5.0.0a-alpha-win.zip</title>
<text>версия для Windows 95/98/NT/2000/XP/2003 (26.7M)</text>
</item>
<item>
<title>mysql-5.0.0-alpha.tar.gz</title>
<text>версия для UNIX (15.6M)</text>
</item>
<item>
<title>DBI-1.42</title>
<text>Perl DBI module</text>
</item>
<item>
<title>Net-MySQL-0.08</title>
<text>Pure Perl MySQL network protocol interface</text>
</item>
<item>
<title>Data-Dumper-2.101</title>
<text>Perl Data-Dumper module. Useful with DBI DBD support for older perl installations</text>
</item>
<item>
<title>Data-ShowTable-3.3</title>
<text>Perl Data-ShowTable module. Useful with DBI/DBD support</text>
</item>
<item>
<title>mysql_snap10_rus.exe</title>
<text>MySQL Snap /Rus/ Cоздание резервных копий MySQL, а также их перенос с одного сервера на другой</text>
</item>
<item>
<title>mysqlgui-win32-static-1.7.5-2.zip</title>
<text>MySQLGUI вебинтерфейс для Windows</text>
</item>
</news>

XSL: transform.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="page"/>
<xsl:param name="pg_size">10</xsl:param>
<xsl:eek:utput method="html" encoding="windows-1251"/>
<xsl:template match="/">
<html>
<head>
<title/>
</head>
<body>
<xsl:apply-templates select="news/item"/>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<xsl:if test="ceiling(position() div number($pg_size)) = number($page)">
<p>
<b>
<xsl:value-of select="position()"/> - <xsl:value-of select="title"/>
</b>
<br/>
<xsl:value-of select="text"/>
</p>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
 

lucas

Guest
marat

Имеет смысл хотя бы иногда смотреть на дату последнего поста.
Тех, кто это не делает, называют диггерами.
 

marat

Guest
ненужно стёба :)

Когда в мануалах мало примеров, люди идут на форум и очень часто находят ответы, даже не задавая вопросов
 

slach

Новичок
марат, пример РАБОТАЕТ =))

если не заметил, там куча кода опущена, просто я из своего проекта выдергивал.... мог чтото и пропустить
 
Сверху