Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
Вывод количества объектов в категории. XSLT

Автор idu.kuruРаздел Шаблоны XSLT

Ответов: 6
Просмотров: 1903
Последний ответ 18 Октябрь 2014, 17:39:24
от idu.kuru
Сортировка по алфавиту в xslt

Автор VladimirРаздел Шаблоны XSLT

Ответов: 2
Просмотров: 2395
Последний ответ 14 Январь 2012, 17:25:36
от admin
Не выводятся все теги в xslt

Автор goodprofyРаздел Шаблоны XSLT

Ответов: 2
Просмотров: 1765
Последний ответ 03 Июнь 2014, 13:52:04
от goodprofy
webforms & XSLT & модальное окно

Автор graveРаздел JS и AJAX

Ответов: 8
Просмотров: 5529
Последний ответ 13 Июнь 2011, 00:41:56
от talanter
Работа модуля Обратная связь (вставка форм в контент сайта) при XSLT

Автор ariusgroupРаздел Шаблоны XSLT

Ответов: 8
Просмотров: 3323
Последний ответ 17 Октябрь 2012, 15:29:17
от admin

0 Пользователей и 1 Гость просматривают эту тему.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Изучаю UMI, XSLT.
« : 29 Май 2012, 21:28:27 »
Здравствуйте. Помогите пожалуйста разобраться с XSLT шаблонами.
Я в целом только изучаю систему и разбираюсь, поэтому могу сильно ошибаться. Пожалуйста, поправьте если что.
На примере одного конкретного макроса я пытаюсь понять как в целом взаимодействовать с системой.
Сейчас в голове такая картина:
Для добавлении функционала какого-либо из модулей, нужно найти его описания http://help-dev.umi-cms.ru/. Найти макрос, который реализует нужный функционал. Если макрос должен выводить информацию – пишем шаблон <xsl:template match="udata[@module = 'МОДУЛЬ'][@method = 'метод']">, затем пишем шаблон для элементов item данного макроса.  Если макрос связан с вводом инфы -  точно так же <xsl:template match="udata[@module = 'МОДУЛЬ'][@method = 'метод']">, в описание шаблона создаём <form> </form>. К примеру, <form name="frm_editblogmsg" method="post" action="/blogs20/postEdit/{$post/pid}/do/" onsubmit="site.forms.data.save(this); return site.forms.data.check(this);"> отправляет новый пост.
Проясните пожалуйста 1) откуда взялась инфа  action, что делает …/do (интуитивно тут понятно, с фигурными скобками тоже ясно) 2) onsubmit – интуитивно понятно, что сохранить формы сайта, но хочется более подробно вчитать про такие конструкции.

Поставил такую задачу: тестовый демо-сайт demodizzy. Нужно добавить возможность пользователям создавать СВОИ блоги и видеть в users/settings созданные блоги. Использовать XSLT шаблоны.


1)Изучив документацию, я пришёл к выводу, что за добавление своих блогов отвечает %blogs20 editUserBlogs()%.
Первый трабл - Я не могу понять, как вставить TPL шаблон в %blogs20 editUserBlogs()% XSLT.
Выполняю в адресной строке udata/blogs20/editUserBlogs – получаю XML, где вижу список имеющихся блогов(скрин не делаю, ничего необычного). Выполняю blogs20/editUserBlogs – получаю Debug message for UC-pages http://my.jetscreenshot.com/12061/20120529-xx4u-80kb.jpg. Это говорит о том, что в шаблоне не описано как обрабатывать вызов этого модуля и метода. Добавляю в файл Default.xsl
<xsl:template match="result[@module = 'blogs20'][@method='editUserBlogs']" >
<xsl:apply-templates select="document('udata://blogs20/editUserBlogs')" />
   </xsl:template>
Теперь я получаю XML в теле сайта.  http://my.jetscreenshot.com/12061/20120529-hmme-114kb.jpg
Имеющийся вопросы: 1)Почему он не преобразовывается в HTML ?
Попытка ответа: Потому что нет описания для этого, необходимо добавить обрабатывание этой раздачи, т.е. шаблонизатор для module="blogs20" method="editUserBlogs", должен быть шаблон.
disable-output-escaping="yes"  тут не причём, это экранирование тегов, если уже готовый HTML выдаётся.
Я правильно понял ?
2) Смотрю как организован просмотр блогов. Предположим, я хочу добавить новое поле для блога. Добавляю поле, тип число. Просматриваю через сайт– его нет. Дописываю к адресу поста блога .xml – вижу, что новое поле таки формируется XML документом. http://my.jetscreenshot.com/12061/20120529-avhz-114kb.jpg
В голове появляется тень мыслей 1) выводятся только конкретные статичные поля 2) нужно ковырять как и где выводятся
Начинаю смотреть по коду, как организовывается вывод поста блога.  Нахожу такую строчку –
   <xsl:value-of select="document(concat('udata://blogs20/postView/',$document-page-id))/udata/content" disable-output-escaping="yes" />
concat('udata://blogs20/postView/',$document-page-id) это грубо говоря udata://blogs20/postView/95/ если 95 ID поста блога, а что возвращает в этом случае всё выражение с дописанном в конце document(…udata/content) ?
Ткните пожалуйста в читалку, это реальный пробел в моих знаниях, а голова уже кругом.
Анализируем дальше… udata://blogs20/postView возвращает пост без нового поля, которое я сам создал.  http://my.jetscreenshot.com/12061/20120529-coat-105kb.jpg
Вопрос: Как сделать так, что бы возвращались все поля ?
Я попробовал искать, где же уже есть подобный механизм… Нашёл в emarket/personal/ в персональной информации.. Смотрю код -  ссылается на users/settings: <xsl:apply-templates select="document('udata://user/settings')" />. Нахожу код этого фрагмента:
<xsl:template match="udata[@method = 'settings']">
<form enctype="multipart/form-data" method="post" action="{$lang-prefix}/users/settings_do/" id="con_tab_profile">
         <div>
            <label>
               <span>
                  <xsl:text>&login;: </xsl:text>
               </span>
               <input type="text" name="login" class="textinputs" disabled="disabled" value="{$user-info//property[@name = 'login']/value}" />
            </label>
         </div>
…… убеждаемся, что тут всё прописано статично – вот логин вывелся, &login;, что бы на разных языках подмена была… дальше статинчные поля… а вот поле расширенная информация – не статично, т.е. добавив в типе данных новое поле – оно тут появляется.
<xsl:apply-templates select="document(concat('udata://data/getEditForm/', $user-id))" />
В data/common-edit-form.xsl находим <xsl:template match="udata[@method = 'getCreateForm' or @method = 'getEditForm']"> и смотрим каким образом выводятся эти поля, которые мы добавляем сами. В файле data/properties.xsl понимаем, что там просто вычисляются значения этих полей и выводятся. <xsl:template match="property|fields/field//value">
      <xsl:value-of select="value" />
   </xsl:template>

Неужели для того, что бы автоматом выводить новые поля блога, придётся столько раскопать и сделать ? Пусть в стоящей предомной задаче это и не нужно, но в целях углублённой экскурсии в UMI CMS лишним не будет..


*

BaceH

  • ***
  • 141
  • +21/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #1 : 29 Май 2012, 23:33:35 »
начните с простого, смените дизайн "охотниц за приведениями", поменяйте структуру, почитайте документацию.
а там глядишь и станет ясно как в шаблон вызвать функцию модуля, и как в нее передать параметры. ну и "столько раскопать" уже точно не надо будет.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #2 : 29 Май 2012, 23:57:24 »
начните с простого, смените дизайн "охотниц за приведениями", поменяйте структуру, почитайте документацию.
а там глядишь и станет ясно как в шаблон вызвать функцию модуля, и как в нее передать параметры. ну и "столько раскопать" уже точно не надо будет.

Дизайн менять научился. Структуру менять тоже... Но это всё относительно.

Что касается "столько раскопать" - буду Вам благодарен, если сообщите нужное направление, а то я чувствую, что точно не туда копаю...

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #3 : 31 Май 2012, 08:39:29 »
действительно направление поиска очень интересное, радует что люди лезут в суть, хотя и временин а это придется убить больше) Насчет написанных вопросов...

1.
Цитировать
К примеру, <form name="frm_editblogmsg" method="post" action="/blogs20/postEdit/{$post/pid}/do/" onsubmit="site.forms.data.save(this); return site.forms.data.check(this);"> отправляет новый пост.
Проясните пожалуйста 1) откуда взялась инфа  action, что делает …/do (интуитивно тут понятно, с фигурными скобками тоже ясно) 2) onsubmit – интуитивно понятно, что сохранить формы сайта, но хочется более подробно вчитать про такие конструкции.

action проставлен в шаблон, так как создатели шаблона заранее знают куда надо отправить форму, чтобы произошло нужное действие (сохранение редактируемого блога). Для того, чтобы система знала какой блог редактируется надо передать его id, что и достигается за счет динамической подстановки значения $post/pid, а фигурные скобки нужны чтобы система поняла что сюда надо подставить значение из переменной post (которая определяется где-то выше) и взять из этой переменной узел pid.

do подставляется в action как дополнительный параметр к макросу %blogs20 postEdit()%. Если ты заглянешь в код данной функии (или макроса в терминологии umi) в файле /classes/modules/blog20/class.php , то увидишь там (найдя функцию public function postEdit) такой кусочек
if(!$postId) {
$iTmp = getRequest('param0');
if($iTmp) {
$postId = $iTmp;
} else {
$this->redirect(getServer('HTTP_REFERER'));
}
}
он подтягивает значение id текущего сообщения из param0. Param0, param1 и т.д это значения из строчки вызова макроса /модуль/метод/param0/param1

Там же ниже ты увидишь кусок кода начинающийся со строк...
if(getRequest('param1') == 'do') {
....

вот если if срабатывает , то выполняется блок отвечающий за сохранение изменений


onsubmit это событие которое срабатывает при отправке почты, как ты правильно заметил, оно нужно чтобы если при заполнении формы что-то пользователь не заполнил из обязательного или заполнил не верно и его выкинуло обратно, значения которые он заполнял не обнулились а восстановились из куков или сесси (уже не помню точно). Это просто js функции, их ты можешь посмотреть в файле /js/site/form.js, файл этот ты в подключаемых не увидишь, так как он подключается файлом /js/site/__common.js (заглянув в конец этого файла поймешь о чем я)

2.
Цитировать
Я не могу понять, как вставить TPL шаблон в %blogs20 editUserBlogs()% XSLT

tpl не надо встраивать в xslt это разные шаблоны. Надо просто создать свой xslt шаблон если он отсутствовал в demodizzy или если ты делаешь шаблон с нуля (для начала разбирательств лучше конечно разбираться с demodizzy)

Цитировать
Выполняю blogs20/editUserBlogs – получаю Debug message for UC-pages http://my.jetscreenshot.com/12061/20120529-xx4u-80kb.jpg. Это говорит о том, что в шаблоне не описано как обрабатывать вызов этого модуля и метода.
Все верно только ты позже создаешь шаблон для страницы
<xsl:template match="result[@module = 'blogs20'][@method='editUserBlogs']" >
<xsl:apply-templates select="document('udata://blogs20/editUserBlogs')" />
   </xsl:template>

то что это шаблон для страницы, можно понять из того что у тебя match начинается с result узла. Result узелвстречается только в xml страниц, а не в результатах работы макроса (через протокол udata), протоколов upage, uobject, usel. В итоге у тебя есть шаблон для страницы которая возвращает result с @module = 'blogs20' и @method='editUserBlogs', и в этом шаблоне ты делаешь вызов макроса через протокол udata.... и тут момент, а где шаблон для вывода результатов макроса udata/blogs20/editUserBlogs для них надо тоже создать шаблон... что-то вроде то что проиcходит для макроса %blogs20 postEdit()%
<xsl:template match="udata[@module = 'blogs20'][@method = 'postEdit']">
<xsl:variable name="post" select="document('udata://blogs20/postView/')/udata" />
<xsl:copy-of select="$post" />
<div class="add_form">
<form name="frm_editblogmsg" method="post" action="/blogs20/postEdit/{$post/pid}/do/" onsubmit="site.forms.data.save(this); return site.forms.data.check(this);">
<div class="form_element">
<label class="required">
<span><xsl:text>Тема:</xsl:text></span>
<input type="text" name="title" class="textinputs" value="{$post/name}"/>
</label>
</div>
<div class="form_element">
<label class="required">
<span><xsl:text>Сообщение:</xsl:text></span>
<textarea name="content"><xsl:value-of select="$post/content" disable-output-escaping="yes" /></textarea>
</label>
</div>
<div class="form_element">
<input type="submit" class="button" value="Сохранить" />
</div>
</form>
</div>
</xsl:template>

<xsl:template match="udata[@module = 'blogs20'][@method = 'postEdit'][error]">
<xsl:apply-templates select="error" />
</xsl:template>


3.
Цитировать
disable-output-escaping="yes"  тут не причём, это экранирование тегов, если уже готовый HTML выдаётся
Да, все верно

4.
Цитировать
Начинаю смотреть по коду, как организовывается вывод поста блога.  Нахожу такую строчку –
   <xsl:value-of select="document(concat('udata://blogs20/postView/',$document-page-id))/udata/content" disable-output-escaping="yes" />
concat('udata://blogs20/postView/',$document-page-id) это грубо говоря udata://blogs20/postView/95/ если 95 ID поста блога, а что возвращает в этом случае всё выражение с дописанном в конце document(…udata/content) ?

<xsl:value-of select="document(concat('udata://blogs20/postView/',$document-page-id))/udata/content" disable-output-escaping="yes" /> делает следующее... получает через concat подстановку динамически формируемой переменной $document-page-id содержащей id текущей страницы (допустим она равна 95) и получаем строчку udata://blogs20/postView/95. Данyая строчка попав в атрибут document (вот так она выглядит - document('udata://blogs20/postView/95')  ) вернет результат обращения к макросу %blogs20 postView(95)%. Далее к полученному xml (можешь просмотреть его отдельно чтобы понять что дальше происходит или заглянуть в документацию http://help-dev.umi-cms.ru/blogs20.postView.html#xsltDesc) применяют обычную выборку... вернее сказать берут из этого xml узел /udata/content, то есть содержимое поля content и так как поле контент содержит html теги чтобы их не экранировало добавляют disable-output-escaping="yes" атрибут

Для того чтобы вывести любое поле какой-то страницы, ты всегда можешь обратиться через протокол upage к нужной тебе странице (upage://95 например) и получишь все поля что есть в этой странице. Далее дело техники, просто вытяни его.... Если тебе надо конкретное поле "Новое поле", то в том шаблоне где у тебя стоит <xsl:value-of select="document(concat('udata://blogs20/postView/',$document-page-id))/udata/content" disable-output-escaping="yes" />
пишешь такой вызов <xsl:value-of select="document(concat('upage://',$document-page-id))/udata//property[@name='test']/value" />


P.S. Задача вывода значения произвольного поля из страницы или объекта, это тот басиз который обязательно понадобиться при разработке шаблонов на xslt. Если еще не читали, советую глянуть книгу Данила Кострова (http://www.umi-cms.ru/support/docs/xslt-umi-devbook/) там есть весь необходимый базис касающийся xslt

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #4 : 03 Июнь 2012, 11:00:04 »
Спасибо за ответ.
Я написал пост сразу после полученного сообщения и видимо забыл нажать отправить. Сейчас зашёл и сильно удивился, что поста нет.
К моменту получения поста уже успел продвинуться и сделать некоторые успехи, а Ваш пост направил в нужное русло ещё больше.
Книгу я конечно скачал прежде чем начать ковыряться и прочитал не один раз, просто порой тяжело понять на имеющихся примерах как и что..

Сейчас вот ломаю голову с таким моментом:
На 1-ую страницу сайта нужно выводить один div, на остальные - другой.
На 1-ую страницу вывожу без проблем - <xsl:if test="result[page/@is-default='1']"> ......тырыпыры..... </xsl:if>
А как описать остальные страницы - понять не могу, т.к. у них отсутствует is-default. Можно ли как-то в XSLT проверять наличие параметров ?

Вообще правильный ли подход - использование внутри <xsl:template match="/" mode="layout"> конструкций xsl:if ? Мне что-то интуитивно кажется, что это не правильно - нужно описывать в отдельных файлах/шаблонах, для наглядности..
Есть ощущение, что это логичнее сделать через <xsl:call-template name="my_block" />
« Последнее редактирование: 03 Июнь 2012, 11:07:00 от Rodogor »

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #5 : 03 Июнь 2012, 11:32:29 »
суть такая... конечно если у вас есть различия между главной и внутренними то надо что-то менять

один вариант менять внутри шаблона выборочные кустrи, или через конструкции xsl:if и xsl:choose, или через создание отдельного шаблона

например первый случай будет выглядеть так
<xsl:template match="/" mode="layout">
<html>
....
<xsl:choose>
<xsl:when test="result/page/@is-default='1'">
блок который выводиться на главной
</xsl:when>
<xsl:otherwise>
блок который выводиться на всех остальных
</xsl:otherwise>
</xsl:choose>
....
</html>
</xsl:template>

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

если же у вас куча отличий то стоит уже посмотреть в сторону отдельного шаблона, тогда делаете такой финт

<xsl:template match="/" mode="layout">
<xsl:choose>
<xsl:when test="result/page/@is-default='1'">
<xsl:apply-templates select="." mode="layout_main_page" />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." mode="layout_other_page" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template match="/" mode="layout_main_page">
<html>
...
</html>
</xsl:template>

<xsl:template match="/" mode="layout_other_page">
<html>
...
</html>
</xsl:template>

если же у вас отличия страниц выводятся в области контента, например на странице контактов надо помимо текста страницы контактов еще и вывести карту проезда, то тогда шаблон общий один, мы его не трогаем, а  идем в то место где выводяться страницы контента, то есть /xslTpls/modules/content/common.xsl

и пониже шаблона описывающего шаблон для страниц типа content
<xsl:template match="result[@module = 'content']">
<div id="page_{$document-page-id}" umi:element-id="{$document-page-id}" umi:field-name="content" umi:empty="&empty-page-content;">
<xsl:value-of select=".//property[@name = 'content']/value" disable-output-escaping="yes" />
</div>
</xsl:template>

добавляем уточняющий шаблон для страницы контакты (например ориентируясь на то что её id =33)
<xsl:template match="result[@module = 'content' and @pageId=33]">
<div id="page_{$document-page-id}" umi:element-id="{$document-page-id}" umi:field-name="content" umi:empty="&empty-page-content;">
<xsl:value-of select=".//property[@name = 'content']/value" disable-output-escaping="yes" />
                
</div>
                <img src="/images/map.jpg" /> здесь выводим карту проезда, или что там еще надо вывести
</xsl:template>

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #6 : 03 Июнь 2012, 12:31:13 »
Благодарю за столь быстрый ответ. С Вашей помощью мысли окончательно правильно сформировываются в нужное русло.

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #7 : 05 Июнь 2012, 01:22:23 »
А не подскажите такой момент:
Структура каталога: Автомобили-Марка-Модель.
В "модель" нужно получить ссылку на "Марка".
Необходимо использовать Upage?
Я пока начал подбираться так -
<xsl:value-of select="document(concat('upage://',page/@parentId))"/>
Это я получаю родителя. У родителя
Цитировать
<page id="5" parentId="1" link="/avtomobili/toyota1/" is-active="1" object-id="317" type-id="71" type-guid="catalog-category" update-time="1338539083" alt-name="toyota1">
link="/avtomobili/toyota1/ это то что мне нужно. Как подобраться - не могу понять... Чисто интуитивно понимаю, что нужно полученный результат рассматривать как udata и оттуда вытянуть /page/@link.. Но что-то не выходит

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #8 : 05 Июнь 2012, 02:31:10 »
странно что не выходит, ведь все верно описал, в итоге у тебя будет такой код
<xsl:value-of select="document(concat('upage://',page/@parentId))/udata/page/@link" />

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #9 : 05 Июнь 2012, 09:30:47 »
Благодарю за ответ. Прошу прощения, действительно верно написано. Походу засиделся вчера.

Утро вечера мудренее.

Думаю, не мне одному понадобиться.. Что бы поиском люди нашли эти вопросы - накидаю теги:
как вывести ссылку на родительскую страницу

Собственно я сформировал так:
<a href="{document(concat('upage://',page/@parentId))/udata/page/@link}"  class="a_link"><xsl:value-of select="document(concat('upage://',page/@parentId))/udata/page/name"/></a>
Цели я добился, но не слишком ли извращённый способ ? Или это нормально ?
« Последнее редактирование: 05 Июнь 2012, 10:23:46 от Rodogor »

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #10 : 06 Июнь 2012, 17:44:21 »
Каталог, к нему прикреплён фотоальбом.  Мне нужно при просмотре объекта каталога вывести фото (jquery карусель). Получаю url таким способом

select="document(concat('upage://',./@id))/udata/page/properties/group[@name='photo_props']/property[@name='photo']/value/@path"/>


Есть плотное ощущение, что нужно копать в сторону %photoalbum photo()% и т.п., но в описании %photoalbum photo()%  сказано, что нужно использовать upage или udata... Т.е. обратиться localhost/udata/photoalbum/photo/14 нельзя. Хотя ответ есть, выглядит вот так:
Цитировать
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="photoalbum" method="photo" generation-time="0.015039">
<id>14</id>
<name>Toyota</name>
</udata>

*

BaceH

  • ***
  • 141
  • +21/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #11 : 07 Июнь 2012, 04:54:20 »
select="document(concat('upage://',./@id))//property[@name='photo']/value"/>
property[@name='photo'] - property с именем photo одно, полный путь указывать не обязательно.

%photoalbum photo()% описывает отображение фотографии, при жквери этого не нужно. Последний шаблон описывающий миниатюру из album.xsl
	<xsl:template match="page" mode="photo_list">

<xsl:variable name="image_full" select="document(concat('upage://',@id))//property[@name='photo']/value" />
<a href="{$image_full}" >
<xsl:call-template name="catalog-thumbnail">
<xsl:with-param name="element-id" select="@id" />
<xsl:with-param name="field-name">photo</xsl:with-param>
<xsl:with-param name="empty">&empty-photo;</xsl:with-param>
<xsl:with-param name="width">95</xsl:with-param>
<xsl:with-param name="height">64</xsl:with-param>
</xsl:call-template>
</a>


</xsl:template>
$image_full - получаем путь к оригиналу(это если оригинал не нужно подганять под размеры)
получаем
<a href="$image_full"><img src="$image_thum" ></a>

вот такой простой у меня слайдер:)

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #12 : 07 Июнь 2012, 12:17:24 »
Я ещё не особо хорошо умею работать с переменными, походу самое время изучить.
Благодарю за совет.

Мой слайдер получился так:

<xsl:template match="udata" mode="object-view">
..........
<div id="slides">
<div class="slides_container">
<xsl:apply-templates select=".//group[@name='foto']/property/value" mode="foto"/>
</div>

</div>
</xsl:template>


<xsl:template match="value/page" mode="foto">

<img src="{document(concat('upage://',./@id))/udata/page/properties/group[@name='photo_props']/property[@name='photo']/value}" width="570" height="270"/>
</xsl:template>
Осталось решить вопрос с разрешением изображений и будет норм. :)

У меня ещё не сформировалось окончательно понимание XSLT и порой есть ощущение, что я пишу всякий бред.

У меня есть ощущение, что я неправильно применяю шаблоны, когда мне надо вывести более одного элемента, как в этом случае. Или всё же это правильно ? Изучая демо-шаблоны я натыкался на несколько способов.

   <xsl:apply-templates select=".//group[@name='foto']/property/value" mode="foto"/> - применить шаблон к части XML документа где такие proup/@name и т.п.
Далее нужно описать как обрабатывать.
<xsl:template match="value/page" mode="foto"> я написал value/page т.к. меня интересует только @id, которое в самом-самом конце дерева. Можно было написать value и пусть к @id указывать как ./page/@id...

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #13 : 07 Июнь 2012, 14:44:40 »
выглядит верно, а насчет какой вариант писать, прелесть xslt, что одно и тоже действие можно сделать несколькими вариантами? ваш вариант вполне уместен)

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Re:Изучаю UMI, XSLT.
« Ответ #14 : 07 Июнь 2012, 21:25:30 »
Проапгрейдил карусель, теперь к объекту каталога привязывается альбом и карусель с навигацией.
Может кому поможет, кто поиском забредёт:
Карусель http://slidesjs.com/


	<xsl:template match="udata" mode="object-view">
....................
<div id="products_example">
<div id="products">
<div class="slides_container">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/(',.//group[@name='foto']/property/value/page/@link,')'))/udata/items" mode="foto"/>

</div>
<ul class="pagination">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/(',.//group[@name='foto']/property/value/page/@link,')'))/udata/items" mode="foto_pagination"/>

</ul>
</div>
</xsl:template>



<xsl:template match="item" mode="foto">
<a href="#" target="_blank"><img src="{document(concat('upage://',./@id))/udata/page/properties/group[@name='photo_props']/property[@name='photo']/value}" width="570" /></a>
</xsl:template>

<xsl:template match="item" mode="foto_pagination">
<li><a href="#"><img src="{document(concat('upage://',./@id))/udata/page/properties/group[@name='photo_props']/property[@name='photo']/value}" width="55" /></a></li>
</xsl:template>