у меня сделано так (может и не правильно, сам еще учусь, но работает)
<xsl:value-of select="document(concat('upage://', $link,'.num_house'))//value"/>
выводит номер дома
на странице надо вывести список объявлений из раздела каталога
<xsl:apply-templates select="document('udata://catalog/getObjectsList/0/53')/udata" mode = "adv"/>
потом шаблон вывода каждого объявления
<xsl:template match="udata[@module = 'catalog'][@method = 'getObjectsList']" mode = "adv">
в котором
<xsl:apply-templates select="lines/item" mode="adv"/>
<xsl:template match="item" mode="adv">
<xsl:variable name="link" select="@link"/>
............
<xsl:value-of select="document(concat('upage://', $link,'.num_house'))//value"/>
</xsl:template>
@link - ссылка на страницу объекта каталога, которую уже и обрабатываешь через upage.
Но мой подход скорее все не правильный. т.к. если таким образом выводить 10 значений из объявления, то будет 10 обращений к БД, что не есть гуд, т.к. замедляет работу. Надо как-то решить этот вопрос за одно обращение. Может admin подскажет как сделать.
всна странице надо вывести список объявлений из раздела каталога
<xsl:apply-templates select="document('udata://catalog/getObjectsList/0/53')/udata" mode = "adv"/>
потом шаблон вывода каждого объявления
<xsl:template match="udata[@module = 'catalog'][@method = 'getObjectsList']" mode = "adv">
в котором
<xsl:apply-templates select="lines/item" mode="adv"/>
<xsl:template match="item" mode="adv">
<xsl:variable name="link" select="@link"/>
............
<xsl:value-of select="document(concat('upage://', $link,'.num_house'))//value"/>
</xsl:template>
@link - ссылка на страницу объекта каталога, которую уже и обрабатываешь через upage.
Но мой подход скорее все не правильный. т.к. если таким образом выводить 10 значений из объявления, то будет 10 обращений к БД, что не есть гуд, т.к. замедляет работу. Надо как-то решить этот вопрос за одно обращение. Может admin подскажет как сделать.
вариант имеет место быть, а вообще у вас есть 3 варианта
1. при обработке каждого item в шаблоне для краткой карточки товара сделать по отдельному вызову для каждого параметра, как предложил thecoder
2. при обработке каждого item в шаблоне для краткой карточки товара получить xml с информацией о странице (один запрос) и работать уже с ней вытягивая из него дочерние узлы и атрибуты, как будто вы работаете со страницей данного товара (разница только в том что вы подставляете переменную из которой вытягиваете какие-то данные). Пример на основе thecoder примера:
<xsl:template match="item" mode="adv">
<xsl:variable name="link" select="@link"/>
<xsl:variable name="item_info" select="document(concat('upage://', $link))/udata"/>
............
<xsl:value-of select="$item_info//property[@name='num_house']/value"/>
<xsl:value-of select="$item_info//property[@name='day_score']/value/item/@name"/>
3. при вызове макросов которые возвращают списки чего-то (список категорий, список товаров, список новостей) вы можете воспользоаться параметром ?extProps который сразу вернет вам необходимые данные (см в документации (http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/makrosy_protokol_udata/#extended)). В итоге указав эти свойства в вызове:
<xsl:apply-templates select="document('udata://catalog/getObjectsList/0/53?extProps=day_score,num_house')/udata" mode = "adv"/>
вы можете спокойно их выводить в шаблоне краткой карточки, так как они уже присутствуют в вашем xml
<xsl:template match="item" mode="adv">
............
<xsl:value-of select=".//property[@name='num_house']/value"/>
<xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>
только помните что раз у вас появились доп данные то вызов в краткой карточке вида (вы используете его при выводе имени) выведет еще и внутреннюю информацию о расширенных полях, так что замените его на <xsl:value-of select="text()" />
, который выведет только текст текущего узла (то что вам и надо)
Я решил использовать третий вариант:
3. при вызове макросов которые возвращают списки чего-то (список категорий, список товаров, список новостей) вы можете воспользоаться параметром ?extProps который сразу вернет вам необходимые данные (см в документации (http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/makrosy_protokol_udata/#extended)). В итоге указав эти свойства в вызове:
<xsl:apply-templates select="document('udata://catalog/getObjectsList/0/53?extProps=day_score,num_house')/udata" mode = "adv"/>
вы можете спокойно их выводить в шаблоне краткой карточки, так как они уже присутствуют в вашем xml
<xsl:template match="item" mode="adv">
............
<xsl:value-of select=".//property[@name='num_house']/value"/>
<xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>
только помните что раз у вас появились доп данные то вызов в краткой карточке вида (вы используете его при выводе имени) выведет еще и внутреннюю информацию о расширенных полях, так что замените его на <xsl:value-of select="text()" />
, который выведет только текст текущего узла (то что вам и надо)
Однако что-то или где-то я упустил или недопонял.
Получается так: пытаюсь вывести данные из свойства поля "Кол-во дней", то есть из "day_score" значение которого у каждого объекта каталога (тура) своё так:
<xsl:apply-templates select="document('udata://catalog/getObjectsList/?extProps=day_score')/udata" mode="dayscore"/>
Обработка шаблоном этого вывода успешно совершается таким:
<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" mode="dayscore">
<xsl:apply-templates select="lines/item" mode="dayscore"/>
</xsl:template>
<xsl:template match="item" mode="dayscore">
<xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>
</xsl:template>
Однако вот в чём загвоздочка - объектов у меня несколько (то есть пока два тура) и данные по количеству дней как "2 дня", "3 дня" и т.п. должны по идее выводится в каждом объекте (туре) свои собственные.
НО получается так, что в каждом туре количество дней выводиться сразу все значения "2 дня", "3 дня" вместе для обоих туров.
Выглядит это в табличке так:
http://temp03.web-image.ru/travel_tours/prefabricated_tours_to_st_petersburg_for_individual_tourists/
С днями недели такая же несуразица...
приведите ваш шаблон который выводит краткую карточку товара (из вашего примера это шаблон
<xsl:template match="item" mode="dayscore">
<xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>
</xsl:template>
)
но что-то мне подсказывает, что вы вызываете его немного не там или не так и таким образом подхватываете лишние данные.
но что-то мне подсказывает, что вы вызываете его немного не там или не так и таким образом подхватываете лишние данные.
У меня такие же ощущения - накорявил я где-то...
Вот полностью шаблон как есть на данный момент:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "ulang://i18n/constants.dtd:file">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:umi="http://www.umi-cms.ru/TR/umi">
<xsl:template match="/result[@method = 'category' and page/@type-id=150]">
<div class="rama">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr align="center" bgcolor="#E2C4A4">
<td>Заезды</td>
<td>Кол-во дней</td>
<td>Дни недели</td>
<td>Тур</td>
</tr>
<xsl:apply-templates select="document(concat('udata://catalog/getObjectsList/', page/@id, '////2/'))/udata" mode="table-view-1" />
</table>
</div>
<div class="bord3"> </div>
<xsl:if test=".//property[@name = 'attention']/value">
<span class="warning">
<xsl:value-of select=".//property[@name = 'attention']/value" disable-output-escaping="yes" />
</span>
</xsl:if>
<xsl:if test=".//property[@name = 'descr']/value">
<div class="text2">
<xsl:value-of select=".//property[@name = 'descr']/value" disable-output-escaping="yes" />
</div>
</xsl:if>
</xsl:template>
<xsl:template match="udata[@method = 'getObjectsList']" mode="table-view-1">
<xsl:apply-templates select="document('udata://catalog/search')" />
<xsl:text>&empty-category;</xsl:text>
</xsl:template>
<xsl:template match="udata[@method = 'getObjectsList'][total]" mode="table-view-1">
<xsl:apply-templates select="lines/item">
<xsl:with-param name="cart_items" select="document('udata://emarket/cart/')/udata/items" />
</xsl:apply-templates>
<xsl:apply-templates select="total" />
</xsl:template>
<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" mode="dayscore">
<xsl:apply-templates select="lines/item" mode="dayscore"/>
</xsl:template>
<xsl:template match="item" mode="dayscore">
<xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>
</xsl:template>
<xsl:template match="udata[@module = 'catalog' and @method = 'getObjectsList']" mode="adv2">
<xsl:apply-templates select="lines/item" mode="adv2"/>
</xsl:template>
<xsl:template match="item" mode="adv2">
<xsl:value-of select=".//property[@name='first_day_tours']/value/item/@name"/> - <xsl:value-of select=".//property[@name='last_day_tours']/value/item/@name"/>
</xsl:template>
<xsl:template match="page|item">
<tr>
<td><b> 00 </b></td>
<td>
<xsl:apply-templates select="document('udata://catalog/getObjectsList/?extProps=day_score')/udata" mode="dayscore"/>
</td>
<td>
<xsl:apply-templates select="document('udata://catalog/getObjectsList/?extProps=first_day_tours,last_day_tours')/udata" mode="adv2"/>
</td>
<td>
<a href="{@link}" title="{.//property[@name='h1']/value}">
<xsl:value-of select="name" />
<xsl:if test="not(name)">
<xsl:apply-templates mode="table-view-1" />
</xsl:if>
</a>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Ошибка скорее всего тут:
<xsl:apply-templates select="document('udata://catalog/getObjectsList/?extProps=day_score')/udata" mode="dayscore"/>
getObjectsList Выводит список объектов каталога в указанном разделе.
а раздел у вас не указан.
Я тоже использую getObjectsList, но у меня так:
udata://catalog/getObjectsList/0/53
Пример:
<xsl:apply-templates select="document(concat('udata://system/convertDate/',publish_time,'/d.m.Y%20%E2%20H:i/'))/udata" />
Посмотрите подробное описание макроса в документации
Спасибо!
А у меня новый вопрос про таблички в категориях (разделов) объектов (туров):
есть туры, которые успешно выводятся с четырьмя столбиками данными, как здесь:
http://temp03.web-image.ru/travel_tours/prefabricated_tours_to_st_petersburg_for_individual_tourists/
для вывода значений "Заезды " "Кол-во дней" "Дни недели" "Тур" в шаблоне используется такой вызов:
<xsl:template match="page|item">
<tr>
<td>
<xsl:apply-templates select=".//property[@name = 'start_tour']" /> - <xsl:apply-templates select=".//property[@name = 'end_tour']" />
</td>
<td>
<xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>
</td>
<td>
<xsl:value-of select=".//property[@name='first_day_tours']/value/item/@name"/> - <xsl:value-of select=".//property[@name='last_day_tours']/value/item/@name"/>
</td>
<td>
<a href="{@link}">
<xsl:if test="not(name)">
<xsl:value-of select="text()" />
</xsl:if>
</a>
</td>
</tr>
</xsl:template>
а ещё есть таблички с турами в категориях (разделах) только с трёмя столбиками, как здесь:
http://temp03.web-image.ru/travel_tours/group_of_adults/auto_group/
и для вывода значений "Период действия" "Кол-во дней" "Тур" в шаблоне используется этот вызов:
<xsl:template match="page|item" mode="table-view-1">
<tr>
<td>
<xsl:apply-templates select=".//property[@name = 'first_month_tours']" /> - <xsl:apply-templates select=".//property[@name = 'last_month_tours']" />
</td>
<td>
<xsl:value-of select=".//property[@name='day_score']/value/item/@name"/>
</td>
<td>
<a href="{@link}">
<xsl:if test="not(name)">
<xsl:value-of select="text()" />
</xsl:if>
</a>
</td>
</tr>
</xsl:template>
Так вот почему-то система выбирает только первый вариант шаблона для всех разделов с табличками туров, почему ж так, ведь у меня все шаблоны для каждого раздела сайта внутрях подключены под свой собственный iD, как например вот так:
<xsl:template match="/result[@method = 'category' and page/@type-id=150]">
?