Показать полную графическую версию : Что еще можно сделать с XML + XSLT + XSL
Страниц :
1
2
3
4
5
6
7
8
9
[
10]
11
12
13
Vlad Drakula,
Как не правильный? LibXSLT какая-то последняя версия ;) А примеры переписывал из книги. Даже простой пример пробовал сгенерировать количество элментов в зависимости от от количества в переменной (практически тоже самое что и твой последний пример со страницами). Не катит!
На днях попробую еще раз, и напишу что за ошибка.
Vlad Drakula,
а... у тебя были не заменены "<" на "<"
Форум подрезал ;)
Кста, а что бы последний пример работал, во входном XML должны быть ВСЕ новости? А если их там 100? Или как?
Vlad Drakula
17-08-2006, 13:31
benya
да... чтобы последний пример работал там должны быть все новости...
у меня из около 70 и ничего работает... правда у меня генерится статический HTML с помощью C++...
Vlad Drakula,
Там легко его приспособить ;) Странно, но работает, раньше что-то не так делал наверное. Так или иначе, мой первый вариант устраивает меня больше.
рекурсия это в принцепе хорошо... при использовании XSLT ей нужно хорошо владеть иначе никак... но для такой задачи по моему это как из пушки по воробьям... нужно еще задумываться и о перфомансе приложения!
свою задачу с пейджингом решил так:
<xsl:template name="pager">
<xsl:param name="i" />
<xsl:param name="n" />
<xsl:param name="max" />
<xsl:if test="$i > 0 and $i <= $n and $i <= $max">
<xsl:choose>
<xsl:when test="$i = pagenum">
<xsl:value-of select="$i" />
</xsl:when>
<xsl:otherwise>
<a href="?p={$i}">
<xsl:value-of select="$i" />
</a>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:if test="$i < $n">
<xsl:call-template name="pager">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="n" select="$n"/>
<xsl:with-param name="max" select="$max"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
имеем исходный xml:
<pagenum>2</pagenum>
<item-per-page>20</item-per-page>
<items>400</items>
тогда вызываем так:
<xsl:text>Страницы: </xsl:text>
<xsl:call-template name="pager">
<xsl:with-param name="i" select="pagenum - 5"/>
<xsl:with-param name="n" select="pagenum + 5"/>
<xsl:with-param name="max" select="ceiling(items div item-per-page)"/>
</xsl:call-template>
может с рекурсией не самое элегантное решение. кто подскажет лучше - с удовольствием изменю :)
Vlad Drakula
18-08-2006, 22:07
3kLiN
на мой взгля очень не оптимально... на вскидку могу сказать что можно избавиться от трех сравнений на каждую итерацию!
а если еще подумать то и еще одно ставнение можно выкинуть... но это уже не так криточно...
так что поробуйте еще подумать... может появятся идеи о более эффективных алгоритмах.
есть известный узел содержащий имя искомого узла. как вывести содержание искомого узла?
пока ничего красивее
<xsl:value-of select="* [ name(.) = node1 ]" />
не придумал. может есть элегантнее решение?
Vlad Drakula
19-11-2006, 18:23
3kLiN
мне вот кажется что приведенный вами код не работает...
Vlad Drakula
у меня работает. а что с ним не так? я от более простого варианта не отказался бы :)
У меня такой вопрос:
Есть следующая задача:
Работа с базой данных. Хранимые процедуры возвращают XML. С помощью XSLT я его преобразую в HTML. Вопрос такой: каким образом в страницу можно добавить динамику (пейджинг, фильтры поиска и.т.д.)
Надо чтобы работало как минимум под FF и IE.
Можете посоветовать, в каком направлении копать. А то я чегото в полной растерянности.
PS: Предположительн все это нужно организовать через Ajax. Исходная тнформация поcтупает c сервера через XMLHTTPRequest.
Vlad Drakula
14-12-2006, 13:57
sen1983
С помощью XSLT я его преобразую в HTML
на стороне сервера или на стороне клиента.
Предположительн все это нужно организовать через Ajax
а это как минимум 30к JS кода в качестве библиотек.
Вопрос такой: каким образом в страницу можно добавить динамику (пейджинг, фильтры поиска и.т.д.)
каков предполагаемый объем данных?
собственно здесь: soft.oszone.net выборки идут в XML а потом трансформятся с помощью XSL но юзер этого в принцепе и не замечает.
ЗЫ
честно говоря я непонимаю в чем суть вопроса.
Vlad Drakula
Вопрос я решил.
С сервера зачитывалось два XML документа - один - XSL , другой - исходные данные. "Склеивал" их на клиенте.
Не скажу, что потребовалось очень много Javascript кода для работы через XMLHTTPRequest. Тестировал только для FF и IE. Работает нормально.
Суть вопроса была в том, что я думал, что получится написать такую хитрую XSL табличку, которая будет через переданные ей параметры отсекать ненужные результаты из исходного XML документа и формировать пейджинг. Но мне показалось, что это будет долговато это писать. и в итоге от этой идеи я отказался.
ЗЫ: Спасибо за отклик.
Vlad Drakula
28-12-2006, 12:23
sen1983
какую библиотеку вы использовали для XSL и XML ?
Vlad Drakula
Я не использовал сторонних библиотек. Для работы с XMLHTTPRequest я частично использовал исходники к книге "Ajax в действии". В этой книге вроде и библиотека есть. Для слияния XML файла с XSL таблицей и вывода HTML кода в браузер написал не очень длинную функцию, заточенную под IE и FF. Если интересно, могу попозже выложить исходники.
Vlad Drakula
28-12-2006, 16:45
sen1983
а какой смыл было делать XSL преобразование на клиенте, по мимо экономии трафика и процессора сервера?
Vlad Drakula
Больше никакого.Разве что присутствует более менее четкое представление MVC... Четко видно, где данные, где разметка, и где код, который данными управляет. Но это больше для разработчика.
Вообще основной задачей было вынесение максимально возможного объема функциональности на сторону клиента. На данный момент на сервере даже сессии нет. все, что нужно, хранится в объектах JavaScript классов. Сервер не генерит ни одной страницы, а только работает с БД.
Но стоит отметить, что JavaScript делает XSL преобразования не так уж быстро. Видна задержка в полсекунды а то и в секунду.
Vlad Drakula
29-12-2006, 14:01
sen1983
собственно вы решили писать тонкий клиент на AJAX
тогда предлагаю перенести дискуссию сюда: http://forum.oszone.net/thread-46763.html
вот создал два файла:
planets.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="planets.xsl"?>
<PLANETS>
<PLANET>
<NAME>Mercury</NAME>
<MASS UNITS="(Earth = 1)">.0553</MASS>
<DAY UNITS="days">58.65</DAY>
<RADIUS UNITS="miles">1516</RADIUS>
<DENSITY UNITS="(Earth = 1)">.983</DENSITY>
<DISTANCE UNITS="million miles">43.4</DISTANCE><!--At perihelion-->
</PLANET>
<PLANET>
<NAME>Venus</NAME>
<MASS UNITS="(Earth = 1)">.815</MASS>
<DAY UNITS="days">116.75</DAY>
<RADIUS UNITS="miles">3716</RADIUS>
<DENSITY UNITS="(Earth = 1)">.943</DENSITY>
<DISTANCE UNITS="million miles">66.8</DISTANCE><!--At perihelion-->
</PLANET>
<PLANET>
<NAME>Earth</NAME>
<MASS UNITS="(Earth = 1)">1</MASS>
<DAY UNITS="days">1</DAY>
<RADIUS UNITS="miles">2107</RADIUS>
<DENSITY UNITS="(Earth = 1)">1</DENSITY>
<DISTANCE UNITS="million miles">128.4</DISTANCE><!--At perihelion-->
</PLANET>
</PLANETS>
planets.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>The Planets Table</TITLE>
</HEAD>
<BODY>
<H1>The Planets Table</H1>
<TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<xsl:apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="PLANETS">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="PLANET">
<TR>
<TD><xsl:value-of select="NAME"/></TD>
<TD><xsl:value-of select="MASS"/></TD>
<TD><xsl:value-of select="RADIUS"/></TD>
<TD><xsl:value-of select="DAY"/></TD>
</TR>
</xsl:template>
</xsl:stylesheet>
при открытии первого ie6 все нормально - видна табличка как надо, а при открытии ff пишет вот такое:
<parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">Ошибка загрузки таблицы стилей: Ошибка разбора таблицы стилей XSLT.</parsererror>
при открытии Оперой, такое:
XSLT processing failed!
в чем ошибка?
и для чего нужно UNITS="(Earth = 1)" ?:)
Vlad Drakula
05-03-2007, 12:50
E-mail
для чего нужно UNITS="(Earth = 1)"
сами создали и не знаете что?
(Earth = 1) - задает единици измерения
<DENSITY UNITS="(Earth = 1)">.983</DENSITY> - означает что протность равна .983 от плотности земли
Vlad Drakula а ошибки изза чего?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.