можещь для верности глянуть как выглядит xml с которым тебе придеться работать написав вот такой код
<textarea><xsl:copy-of select=".//property[@name = 'fotoalbom']" /></textarea>
как ты правильно написал делаем выборку всех узлов property с именем fotoalbom
<xsl:apply-templates select=".//property[@name = 'fotoalbom']" mode="slideshow" />
пишем шаблон для вывода результатов:
<xsl:template match="property[@name = 'fotoalbom']" mode="slideshow">
...какой-то html код
</xsl:template>
вот кусок шаблона для поля типа "ссылка на дерево" с именем "dopolnitelnye_fotografii", в котором выбирается фотоальбом.
там где нужно вывести фото прикрепленного фотоальбома пишем:
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', //property[@name = 'dopolnitelnye_fotografii']/value/page/@id,'/void/1000'))/udata" mode="tovar_photo_list"/>
и добавляем шаблоны для вывода фотоальбома
<!-- tovar_photo_list -->
<xsl:template match="udata[@module = 'photoalbum'][@method = 'album']" mode="tovar_photo_list"/>
<xsl:template match="udata[@module = 'photoalbum'][@method = 'album'][total]" mode="tovar_photo_list">
<xsl:apply-templates select="items/item" mode="tovar_photo_list" />
<xsl:apply-templates select="total" />
</xsl:template>
<xsl:template match="item" mode="tovar_photo_list">
<div class="media ">
<xsl:call-template name="catalog-thumbnail-popup">
<xsl:with-param name="element-id" select="@id" />
<xsl:with-param name="field-name">photo</xsl:with-param>
<xsl:with-param name="width">256</xsl:with-param>
</xsl:call-template>
</div>
</xsl:template>
представим ситуацию в которой это все происходит, пользователь зашел на страницу товара и там должен увидеть фото из прикрепленного через поле "dopolnitelnye_fotografii" фотоальбом
для того чтобы это сделать нам надо:
- получить id фотоальбома указанного в поле "dopolnitelnye_fotografii".
За это отвечает вот эта часть //property[@name = 'dopolnitelnye_fotografii']/value/page/@id
объясняю дословно что в данном запросе написано. Найти среди всех узлов property (//property), узел с атрибутом name='dopolnitelnye_fotografii'' (//property[@name = 'dopolnitelnye_fotografii']) и взять его id (//property[@name = 'dopolnitelnye_fotografii']/value/page/@id), почему такой путь до id можно понять если посмотреть на xml вариант страницы товара
- вызвать макрос вывода фотографий фотоальбома с указанным id (как его найти смотри выше) . Рассмотрим подробнее:
<xsl:apply-templates select="document(concat( - функция concat объединяет все перечисленные через запятые части (строки, переменные, значение узлов и т.п.) в единую строку
'udata://photoalbum/album/', - обращение к самому макросу
//property[@name = 'dopolnitelnye_fotografii']/value/page/@id, - первый параметр макроса, id фотоальбома
'/void/1000' - оставшихся 2 параметра для макроса photoalbum/album, имя шаблона (можно писать что угодно) и кол-во элементов выводимых на странице (1000 написал с запасом)
))/udata" mode="tovar_photo_list"/>
почти врубился пару вопросов.
Как вывести групп элементов а не один.
Например этого куска:
<group id="362" name="item_properties">
<title>Характеристики</title>
<property id="397" name="kolichestvo_komnat" type="relation">
<title>Количество комнат</title>
<value>
<item id="667" name="2" type-id="135" ownerId="10" xlink:href="uobject://667"/>
</value>
</property>
<property id="398" name="kolichestvo_spalnyh_mest" type="relation">
<title>Спальные места</title>
<value>
<item id="676" name="3" type-id="133" ownerId="10" xlink:href="uobject://676"/>
</value>
</property>
<property id="400" name="cena" type="string">
<title>Цена</title>
<value>60 - 100 $</value>
</property>
<property id="399" name="gorod" type="relation">
<title>Город</title>
<value>
<item id="685" name="Бат Ям" type-id="134" ownerId="10" xlink:href="uobject://685"/>
</value>
</property>
</group>
Потом, у меня получается достать к примеру из property cena числовое значиние, с помощью
<xsl:value-of select="document(concat('upage://', @id, '.cena'))//value" disable-output-escaping="yes" />
А как мне достать еще и название? Честно смотрел в справочнике юми, не понял.
И последний вопрос: как доставать значения из выпадающих списков. Этот запрос не работает.
Спасибо.
<xsl:value-of select="document(concat('upage://', @id, '.cena'))//title" disable-output-escaping="yes" />
<xsl:text>:</xsl:text>
<xsl:value-of select="document(concat('upage://', @id, '.cena'))//value" disable-output-escaping="yes" />
получим
Цена:60 - 100 $
<xsl:value-of select="document(concat('upage://', @id, '.kolichestvo_spalnyh_mest'))//title" disable-output-escaping="yes" />
<xsl:text>:</xsl:text>
<xsl:value-of select="document(concat('upage://', @id, '.kolichestvo_spalnyh_mest'))//value/item/@name" disable-output-escaping="yes" />
получим
Количество комнат:2
и тд.
происходит все как и писал глубокоуважаемый admin :)
document(concat('upage://', @id, '.kolichestvo_spalnyh_mest'))//value
получите значение value свойства с именем kolichestvo_spalnyh_mest (попробуйте вывести), дальше идете по "древу", внутри value элемент item, чтобы обратиться к свойствам элемента используем @ и вывадим значение @name
значение из выпадающего списка достается таким же образом, будет только выбранный элемент, если ничего не выбрано записи не будет.
вот кусок шаблона для поля типа "ссылка на дерево" с именем "dopolnitelnye_fotografii", в котором выбирается фотоальбом.
там где нужно вывести фото прикрепленного фотоальбома пишем:
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', //property[@name = 'dopolnitelnye_fotografii']/value/page/@id,'/void/1000'))/udata" mode="tovar_photo_list"/>
Сие успешно применяем, однако что делать, если требуется вывести больше чем один фотоальбом, ну скажем три штуки один за одним ?
<xsl:apply-templates select="//property[@name = 'dopolnitelnye_fotografii']/value/page" mode="tovar_photo_list"/>
<xsl:template match="page" mode="tovar_photo_list">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', @id, '/void/1000'))/udata" mode="tovar_photo_list"/>
</xsl:template>
<xsl:apply-templates select="//property[@name = 'dopolnitelnye_fotografii']/value/page" mode="tovar_photo_list"/>
<xsl:template match="page" mode="tovar_photo_list">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', @id, '/void/1000'))/udata" mode="tovar_photo_list"/>
</xsl:template>
У меня ситуация чуток иная, то есть вызов подгрузки фотографий из фотоальбомов такой:
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', //property[@name = 'photo_present']/value/page/@id,'/void/1000'))/udata" mode="pages-info-photos"/>
а шаблон обрабатывающий этот вызов такой:
<xsl:template match="result[@module = 'photoalbum' and @method = 'album']">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/',$document-page-id))/udata" />
</xsl:template>
<xsl:template match="udata[@module = 'photoalbum' and @method = 'album']" mode="pages-info-photos" />
<xsl:template match="udata[@module = 'photoalbum' and @method = 'album'][total]" mode="pages-info-photos">
<div class="photo-list">
<ul>
<xsl:apply-templates select="items/item" mode="pages-info-photos" />
<xsl:apply-templates select="total" />
</ul>
</div>
</xsl:template>
<xsl:template match="item" mode="pages-info-photos">
<xsl:apply-templates select="document(concat('upage://',@id))/udata/page" mode="pages-info-photos" />
</xsl:template>
<xsl:template match="page" mode="pages-info-photos">
<li>
<div class="photo-item">
<xsl:variable name="src" select="document(concat('upage://',@id,'.photo'))/udata//value" />
<a href="{$src}" class="fancybox-thumbs" rel="media-gallery" title="{.//property[@name='h1']/value}">
<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">250</xsl:with-param>
<xsl:with-param name="height">250</xsl:with-param>
</xsl:call-template>
<span class="photolink">
<xsl:value-of select="//property[@name = 'h1']/value" />
</span>
</a>
</div>
</li>
</xsl:template>
<xsl:apply-templates select="//property[@name = 'dopolnitelnye_fotografii']/value/page" mode="tovar_photo_list"/>
<xsl:template match="page" mode="tovar_photo_list">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', @id, '/void/1000'))/udata" mode="tovar_photo_list"/>
</xsl:template>
У меня ситуация чуток иная, то есть вызов подгрузки фотографий из фотоальбомов такой:
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', //property[@name = 'photo_present']/value/page/@id,'/void/1000'))/udata" mode="pages-info-photos"/>
а шаблон обрабатывающий этот вызов такой:
<xsl:template match="result[@module = 'photoalbum' and @method = 'album']">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/',$document-page-id))/udata" />
</xsl:template>
<xsl:template match="udata[@module = 'photoalbum' and @method = 'album']" mode="pages-info-photos" />
<xsl:template match="udata[@module = 'photoalbum' and @method = 'album'][total]" mode="pages-info-photos">
<div class="photo-list">
<ul>
<xsl:apply-templates select="items/item" mode="pages-info-photos" />
<xsl:apply-templates select="total" />
</ul>
</div>
</xsl:template>
<xsl:template match="item" mode="pages-info-photos">
<xsl:apply-templates select="document(concat('upage://',@id))/udata/page" mode="pages-info-photos" />
</xsl:template>
<xsl:template match="page" mode="pages-info-photos">
<li>
<div class="photo-item">
<xsl:variable name="src" select="document(concat('upage://',@id,'.photo'))/udata//value" />
<a href="{$src}" class="fancybox-thumbs" rel="media-gallery" title="{.//property[@name='h1']/value}">
<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">250</xsl:with-param>
<xsl:with-param name="height">250</xsl:with-param>
</xsl:call-template>
<span class="photolink">
<xsl:value-of select="//property[@name = 'h1']/value" />
</span>
</a>
</div>
</li>
</xsl:template>
Разницы никакой:
<xsl:apply-templates select="//property[@name = 'photo_present']/value/page" mode="pages-info-photos"/>
<xsl:template match="page" mode="pages-info-photos">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', @id, '/void/1000'))/udata" mode="pages-info-photos"/>
</xsl:template>
Разницы никакой:
<xsl:apply-templates select="//property[@name = 'photo_present']/value/page" mode="pages-info-photos"/>
<xsl:template match="page" mode="pages-info-photos">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', @id, '/void/1000'))/udata" mode="pages-info-photos"/>
</xsl:template>
Не то что бы я любил поспорить, но разница однако имеется, вот та самая страница, которая на данный момент выводит ваш пример кода: [здесь была ссылка]
Как мы видим в результате сейчас выводиться две "битых" фотографии...
Смотрим HTML и видим, что фотографии разные (особое внимание на element-id и alt)
[здесь был исходный html]
Первоначальная просьба: "однако что делать, если требуется вывести больше чем один фотоальбом, ну скажем три штуки один за одним ?"
Код
<xsl:apply-templates select="//property[@name = 'photo_present']/value/page" mode="pages-info-photos"/>
<xsl:template match="page" mode="pages-info-photos">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', @id, '/void/1000'))/udata" mode="pages-info-photos"/>
</xsl:template>
ее выполняет. Если есть какой-то конкурирующий шаблон с таким же mode и match, можете изменить mode. Если же проблема в структуре данных, то ничем помочь не смогу.
И повторю свой совет - стоит изучить xslt и xpath.
Первоначальная просьба: "однако что делать, если требуется вывести больше чем один фотоальбом, ну скажем три штуки один за одним ?"
Код
<xsl:apply-templates select="//property[@name = 'photo_present']/value/page" mode="pages-info-photos"/>
<xsl:template match="page" mode="pages-info-photos">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', @id, '/void/1000'))/udata" mode="pages-info-photos"/>
</xsl:template>
Вот прописал вызов и шаблон с другим значением mode:
<xsl:apply-templates select="//property[@name = 'photo_present']/value/page" mode="pages-info-photos2"/>
<xsl:template match="page" mode="pages-info-photos2">
<xsl:apply-templates select="document(concat('udata://photoalbum/album/', @id, '/void/1000'))/udata" mode="pages-info-photos2"/>
</xsl:template>
И вот такой теперь результат:
http://glavtouroperator.ru/main/gto_about.html
Как видно, задейственный match="page" обрабатывает слегка не так вывод фотографий, как ранее обрабатывался им же в приведённым выше мною шаблоне:
<xsl:template match="page" mode="pages-info-photos">
<li>
<div class="photo-item">
<xsl:variable name="src" select="document(concat('upage://',@id,'.photo'))/udata//value" />
<a href="{$src}" class="fancybox-thumbs" rel="media-gallery" title="{.//property[@name='h1']/value}">
<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">250</xsl:with-param>
<xsl:with-param name="height">250</xsl:with-param>
</xsl:call-template>
<span class="photolink">
<xsl:value-of select="//property[@name = 'h1']/value" />
</span>
</a>
</div>
</li>
</xsl:template>
Вот в этом-то вся и заковычина.