Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Что еще можно сделать с XML + XSLT + XSL

Ответить
Настройки темы
Что еще можно сделать с XML + XSLT + XSL

Старожил


Сообщения: 236
Благодарности: 0

Профиль | Отправить PM | Цитировать


приступил к изучению, но вот только не как не пойму, как это все работает)

IE 6 какуето несоурядицу показывает, может надо какойто можуль устонавливать дополнительно?

не в плом, наваяйте простенький рабочий пример XSL XHTML чтобы работал в IE 6, чтонибудь типа hello world с красивастями показывающие возможности.

спасибо.

Отправлено: 07:42, 12-09-2004

 

Пользователь


Сообщения: 101
Благодарности: 1

Профиль | Отправить PM | Цитировать


benya, да, thnx. я уже нашёл примерчик. в XSL нужно ещё создавать DomDocument`ы. это и сбило с толку поначалу. спасибо php.net за наше счастливое детство

-------
Suum cuique


Отправлено: 12:27, 04-08-2006 | #171



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 101
Благодарности: 1

Профиль | Отправить PM | Цитировать


господа, помогайте. уже два часа кручу-верчу никак сообразить не хочу
задача тривиальная: нужно построить pager. есть общее кол-во страниц и номер текущей страницы. как с помощью xslt выдать пейджер а-ля на этом форуме (т.е. активная страница, а справа и слева, если нужно, по n ссылок) ?

Отправлено: 17:50, 04-08-2006 | #172


Аватара для benya

Старожил


Сообщения: 302
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


3kLiN
А я как раз несколько месяцев назад делал тоже самое. Сделал нечто такого:

PHP код: Выделить весь код

<!-- СТРАНИЦЫ -->

<
xsl:template match="pages" mode="pages">
        <
xsl:variable name="count" select="3"/>
        <
xsl:variable name="sel" select="@sel"/>
        <
xsl:variable name="item" select="item[position() = $sel]"/>
        <
xsl:variable name="items" select="$item/preceding-sibling::item[position() <= $count]| $item | $item/following-sibling::item[position() <= $count]"/>
        <
xsl:variable name="last" select="count(item)"/>
        <
xsl:variable name="allmess" select="@allmess"/>
        <
xsl:variable name="mess" select="@mess"/>
        <
xsl:if test="$last > 1">
            <
table border="0" cellspacing="1" cellpadding="0">
                <
tr>
                    <
td>
                        <
span class="lang_link1">
                            <
xsl:value-of select="concat('Страница',' ',$sel,' ','из',' ',$last)"/>
                            <
xsl:text> </xsl:text>
                        </
span>
                    </
td>
                    <
xsl:if test="not($sel = '1')">
                        <
td>
                            <
a href="page.html" class="page" title="На первую страницу">««</a>
                        </
td>
                    </
xsl:if>
                    <
xsl:if test="not($sel = '1')">
                        <
td>
                            <
a href="page{$sel - 1}.html" class="page" title="Предыдущая страница ({$sel - 1})">«</a>
                        </
td>
                    </
xsl:if>
                    <
xsl:for-each select="$items">
                        <
xsl:variable name="pos">
                            <
xsl:number/>
                        </
xsl:variable>
                        <
xsl:variable name="to" select="($pos * $mess) - $mess"/>
                        <
xsl:variable name="a" select="($sel * $mess) div $mess + 1"/>
                        <
xsl:variable name="psst" select="$to + 1"/>
                        <
xsl:variable name="psend" select="$psst + ($mess - 1)"/>
                        <
td>
                            <
a>
                                <
xsl:attribute name="title"><xsl:choose><xsl:when test="$a != $pos"><xsl:choose><xsl:when test="$allmess = $psst"><xsl:value-of select="concat('Страница',' ',$pos,' ','(',$allmess,' ','из',' ',$allmess,')')"/></xsl:when><xsl:when test="$psend > $allmess"><xsl:value-of select="concat('Страница',' ',$pos,' ','(','с',' ',$psst,' ','по',' ',$allmess,' ','из',' ',$allmess,')')"/></xsl:when><xsl:otherwise><xsl:value-of select="concat('Страница',' ',$pos,' ','(','с',' ',$psst,' ','по',' ',$psend,' ','из',' ',$allmess,')')"/></xsl:otherwise></xsl:choose></xsl:when><xsl:when test="$allmess = $psst"><xsl:value-of select="concat('Страница',' ',$pos,' ','(',$allmess,' ','из',' ',$allmess,')')"/></xsl:when><xsl:when test="$psend > $allmess"><xsl:value-of select="concat('Страница',' ',$pos,' ','(','с',' ',$psst,' ','по',' ',$allmess,' ','из',' ',$allmess,')')"/></xsl:when><xsl:otherwise><xsl:value-of select="concat('Страница',' ',$pos,' ','(','с',' ',$psst,' ','по',' ',$psend,' ','из',' ',$allmess,')')"/></xsl:otherwise></xsl:choose></xsl:attribute>
                                <
xsl:attribute name="href"><xsl:value-of select="concat('page',$pos,'.html')"/></xsl:attribute>
                                <
xsl:attribute name="class"><xsl:choose><xsl:when test="$pos = $sel">page-a</xsl:when><xsl:otherwise>page</xsl:otherwise></xsl:choose></xsl:attribute>
                                <
xsl:value-of select="$pos"/>
                            </
a>
                        </
td>
                    </
xsl:for-each>
                    <
xsl:if test="not($sel = $last)">
                        <
td>
                            <
a href="page{$sel + 1}.html" class="page" title="Следующая страница ({$sel + 1})">»</a>
                        </
td>
                    </
xsl:if>
                    <
xsl:if test="not($sel = $last)">
                        <
td>
                            <
a href="page{$last}.html" class="page" title="Последняя страница ({$last})">»»</a>
                        </
td>
                    </
xsl:if>
                </
tr>
            </
table>
        </
xsl:if>
    </
xsl:template>
<!-- 
СТРАНИЦЫ --> 

Лишнюю HTML разметку можно выкинуть

На вход нужно подать вот такую структуру XML:
PHP код: Выделить весь код

<pages sel="1" allmess="41" mess="5">

        <
item/>
        <
item/>
        <
item/>
        <
item/>
        <
item/>
        <
item/>
        <
item/>
        <
item/>
        <
item/>
    </
pages


Вызывается как-то так:
PHP код: Выделить весь код

<xsl:apply-templates select="pages" mode="pages"/> 


Не факт что мой пример правильный с точки зрения производительности, правильности и тд. Наша профессура из форума может начинать критиковать
Можно было и XML попроще передать. Но...пример работает и я не заморачивался.
Результат: тоже самое - список пейджей как на этом форуме.

Последний раз редактировалось Vlad Drakula, 12-08-2006 в 23:29.


Отправлено: 17:11, 12-08-2006 | #173


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


чтож представлю свой вариант решения этой задачи...

на входе:
PHP код: Выделить весь код

<pages sel="2" mess="2">

    <
item/>
    <
item/>
    <
item/>
    <
item/>
    <
item/>
    <
item/>
    <
item/>
    <
item/>
    <
item/>
</
pages

шаблон:
PHP код: Выделить весь код

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <
xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <
xsl:template match="/">
        <
xsl:call-template name="nav"/>
    </
xsl:template>
    <
xsl:template name="nav">
        <
xsl:apply-templates select="//pages" mode="nav"/>
    </
xsl:template>
    <
xsl:template match="pages" mode="nav">
        <
xsl:variable name="start" select="@sel - @mess"/>
        <
xsl:variable name="end" select="@sel + @mess"/>
        <
xsl:variable name="prev" select="@sel - 1"/>        
        <
xsl:variable name="next" select="@sel + 1"/>        
        <
xsl:variable name="all" select="count(item)"/>
        <
table border="1">
            <
tbody>
            <
tr>
                <
td>
                    <
xsl:value-of select="concat(@sel, ' of ', $all)"/>
                </
td>
                <
xsl:if test="@sel != 1">
                    <
xsl:apply-templates select="item[1]" mode="nav_f" />                    
                    <
xsl:apply-templates select="item[$prev]" mode="nav_p" />                    
                </
xsl:if>
                <
xsl:apply-templates select="item[position() >= $start and position() <= $end]" mode="nav" />
                <
xsl:if test="$end < $all">
                    <
xsl:apply-templates select="item[$next]" mode="nav_n" />                    
                    <
xsl:apply-templates select="item[$all]" mode="nav_l" />                    
                </
xsl:if>
            </
tr>
            </
tbody>
        </
table>
    </
xsl:template>
    <
xsl:template match="item" mode="nav">
        <
td>
            <
xsl:value-of select="position()"/>
        </
td>
    </
xsl:template>
    <
xsl:template match="item" mode="nav_f">
        <
td>
            <
xsl:text>f</xsl:text>
        </
td>
    </
xsl:template>
    <
xsl:template match="item" mode="nav_l">
        <
td>
            <
xsl:text>last</xsl:text>
        </
td>
    </
xsl:template>
    <
xsl:template match="item" mode="nav_p">
        <
td>
            <
xsl:text>&lt;</xsl:text>
        </
td>
    </
xsl:template>
    <
xsl:template match="item" mode="nav_n">
        <
td>
            <
xsl:text>&gt;</xsl:text>
        </
td>
    </
xsl:template>
</
xsl:stylesheet

benya
вы бы хоть предупредели что ваш шаблон использует XSL2.0

<xsl:variable name="item" select="item[position() = $sel]"/> - этого в XSL1.0 вроде как нету... там переменные только текстовые...

benya
я наложил структирирование на ваш пример и пофиксил пару багов(очевидных) в шаблоне.

Отправлено: 23:26, 12-08-2006 | #174


Аватара для E-mail

Ветеран


Сообщения: 640
Благодарности: 2

Профиль | Сайт | Отправить PM | Цитировать


http://tex.msu.ru/works/mmlbrowsers/
http://tex.msu.ru/works/mmlbrowsers/test.xhtml

попробЫвал я в фаерфоксе 1506 открыть, отображает только исходный код, непойму откуда взялись эти скриншоты, или надо произвести какието настройки браузеру? плагины?

В ie sp2 хоть выдает ошибку The XML page cannot be displayed

opera 901 аналагично лисице(

хотя наверное все дело в content-type.

-------
Основы HTML | Конференции


Отправлено: 23:52, 12-08-2006 | #175


Пользователь


Сообщения: 101
Благодарности: 1

Профиль | Отправить PM | Цитировать


benya, Vlad Drakula, спасибо за примеры, но я уже решил с помощью рекурсивных вызовов <xsl:call-template ... />

-------
Suum cuique


Отправлено: 00:08, 13-08-2006 | #176


Аватара для benya

Старожил


Сообщения: 302
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


Vlad Drakula,
XSL2.0 вроде как нету, а с библиотекой LibXSLT 1.0 вроде как работает

И что за очевидные баги ты заметил?

Отправлено: 12:31, 13-08-2006 | #177


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


benya
Цитата:
И что за очевидные баги ты заметил?
а... у тебя были не заменены "<" на "<"

Цитата:
XSL2.0 вроде как нету, а с библиотекой LibXSLT 1.0 вроде как работает
а к примеру MSXml наверное не скушает...
ноды как параметры передавать может но как переменные нет... поддержка полноценных переменных появилось лишь в XSLT2.0 (в стандарте)

просто мне пришлось как то проводить сравнения меджу возможностями XSLT1.0 и XSLT2.0

3kLiN
рекурсия это в принцепе хорошо... при использовании XSLT ей нужно хорошо владеть иначе никак... но для такой задачи по моему это как из пушки по воробьям... нужно еще задумываться и о перфомансе приложения!


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

<xsl:template name="pages">

        <
xsl:param name="pages" select="ceiling(count(//news) div 15)"/>
        <
xsl:param name="page" select="2"/>
        <
xsl:text>&#160;| </xsl:text>
        
<a href="./news{$page}.html">
            <
xsl:value-of select="$page"/>
        </
a>
        <
xsl:if test="$page < $pages">
            <
xsl:call-template name="pages">
                <
xsl:with-param name="pages" select="$pages"/>
                <
xsl:with-param name="page" select="$page + 1"/>
            </
xsl:call-template>
        </
xsl:if>
    </
xsl:template

вот к приму у вас есть набор новостей вам их нужно разбирать на страницы по 15 новостей на страницу...

вызывается шаблон следующим образом:

PHP код: Выделить весь код

<fieldset>

                                    <
legend>Страницы:</legend>
                                    <
a href="./index.html">
                                        <
b>1</b>
                                    </
a>
                                    <
xsl:call-template name="pages"/>
                                </
fieldset

E-mail
Цитата:
Решением этой проблемы может служить использование специальных XSLT-стилей "XSLT stylesheets for MathML". Такой подход возможен, так как поддержка XSLT-трансформаций встроена в браузер. Для этого надо скачать набор XSLT-стилей и в первой строчке нашей страницы указать ссылку на заглавный файл mathml.xsl:

<?xml-stylesheet type="text/xsl" href="mathml.xsl"?>

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 23:11, 14-08-2006 | #178


Аватара для benya

Старожил


Сообщения: 302
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


Vlad Drakula,
Кстати, я тоже как-то хотел так сделать, но вызывание теплейта из самого темплейта у меня вызывает ошибку, хотя в книгах это широко используют. Поэтому пришлось от такого метода отказаться.

Отправлено: 19:54, 15-08-2006 | #179


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


benya
Цитата:
Кстати, я тоже как-то хотел так сделать, но вызывание теплейта из самого темплейта у меня вызывает ошибку, хотя в книгах это широко используют. Поэтому пришлось от такого метода отказаться.
либо вы что то не так делали либо у вас совсем не правильный XSLT процессор!

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 10:35, 16-08-2006 | #180



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Что еще можно сделать с XML + XSLT + XSL

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Что можно сделать с ЖК монитором? STINGER85 Прочее железо 5 16-01-2009 23:52
Реабилитация XML/XSLT технологий Vlad Drakula Вебмастеру 8 30-03-2008 01:47
xsl проверка существования тега в xml FADE Вебмастеру 3 23-04-2007 11:29
XML + XSL + PHP => HTML, Как передать бинарный код рисунка ? Lexxx_HU Вебмастеру 5 02-03-2007 17:55
[решено] Как вывести XML аттрибуты через XSL hasherfrog Вебмастеру 1 08-11-2006 16:06




 
Переход