Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

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

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
А теперь уделите некоторое время, чтобы разобраться и написать нам своими словами почему, то что было у вас, не работало.

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
А теперь уделите некоторое время, чтобы разобраться и написать нам своими словами почему, то что было у вас, не работало.
Отчитаюсь пока вкратце: нет уверенного пока опыта чтения xml версии страницы и следственно карявые выводы в шаблонах получаются - пока не научился видеть очевидное в xml. ВОТ кабы  инструкция была бы наглядная для таких и подобных случаев.... То есть буквально руководство типа "Если надо вывести несколько значений справочника через запятую с точкой в конце перечисления, то надо делать следующее: и далее по тексту да по порядку".
А пока вот новый всплывший косячёк на эту же тему:
Если выделить в списке множественного выбора при редактировании карточки отеля более двух станции метро, то получается буквально такое (выделено три станции)
"Ближайшая ст. Метро: Аэропорт, Ближайшая ст. Метро: Полежаевская, Сокол."

То есть я добавил в шаблон  <xsl:text>Ближайшая ст. Метро: </xsl:text>
     <xsl:template match="item" mode="metro_station_list">
       <xsl:text>Ближайшая ст. Метро: </xsl:text> <xsl:value-of select="@name" /><xsl:text>, </xsl:text>
     </xsl:template>
     <xsl:template match="item[position() = last()]" mode="metro_station_list">
       <xsl:value-of select="@name" /><xsl:text>.</xsl:text>
     </xsl:template>
С одной или двумя названиями станции всё правильно.
« Последнее редактирование: 09 Октября 2013, 11:09:20 от Axiomateria »

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
После просмотра записи с последнего вэбинара попробовал использовать такой вот вариант, где
подпись: "Ближайшая ст. Метро:" по идее должна перестать быть статичной
    
<xsl:template match="property[@name='nearest_metro_station_spb']"  mode="metro_station_list">        
            <xsl:choose>
                <xsl:when test=".//property[@name = 'nearest_metro_station_spb']/value/item">            
          Метро: <span><xsl:value-of select="@name" /><xsl:text>, </xsl:text></span>
           </xsl:when>
                <xsl:when test="item[position(.//property[@name = 'nearest_metro_station_spb']/value/item) = last()]">            
          <span><xsl:value-of select="@name" /><xsl:text>.</xsl:text></span>
           </xsl:when>
           <xsl:otherwise>
          <xsl:text>Ближайшая ст. Метро: </xsl:text> <span><xsl:text>далее, чем 5 км.</xsl:text> </span>
           </xsl:otherwise>
            </xsl:choose>
    </xsl:template>
Но не сработало.... названия станций не выводятся с этим вариантом.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
После просмотра записи с последнего вэбинара попробовал использовать такой вот вариант, где
подпись: "Ближайшая ст. Метро:" по идее должна перестать быть статичной
    
<xsl:template match="property[@name='nearest_metro_station_spb']"  mode="metro_station_list">        
            <xsl:choose>
                <xsl:when test=".//property[@name = 'nearest_metro_station_spb']/value/item">            
          Метро: <span><xsl:value-of select="@name" /><xsl:text>, </xsl:text></span>
           </xsl:when>
                <xsl:when test="item[position(.//property[@name = 'nearest_metro_station_spb']/value/item) = last()]">            
          <span><xsl:value-of select="@name" /><xsl:text>.</xsl:text></span>
           </xsl:when>
           <xsl:otherwise>
          <xsl:text>Ближайшая ст. Метро: </xsl:text> <span><xsl:text>далее, чем 5 км.</xsl:text> </span>
           </xsl:otherwise>
            </xsl:choose>
    </xsl:template>
Но не сработало.... названия станций не выводятся с этим вариантом.

если вы пишите шаблон с таким match
<xsl:template match="property[@name='nearest_metro_station_spb']"  mode="metro_station_list"> 

то внутри этого шаблона вы работает от этого match, то есть от property и для получения доступа к узлу value вам надо писать не
.//property[@name = 'nearest_metro_station_spb']/value , а просто value    

Если знать основы с чем вы работает в шаблоне с учетом того что прописанно в match этого шаблона и представлять xml c которым вы работаете, а он выглядит примерно так:
<property id="435" name="nearest_metro_station_spb" type="relation" multiple="multiple">
<title>Ближайшее метро</title>
<value>
<item id="111" name="Аэропорт" type-id="12" ownerId="44" xlink:href="uobject://111"/>
<item id="112" name="Полежаевская, Сокол" type-id="12" ownerId="44" xlink:href="uobject://112"/>
</value>
</property>
 

, то я теряюсь в попытке еще как то по другому объяснить это.



По поводу предыдущей задачи, все точно также, вы прописываете "Ближайшая станция:" не в том шаблоне, почему и получаете результат "Ближайшая ст. Метро: Аэропорт, Ближайшая ст. Метро: Полежаевская, Сокол."

Привожу шаблоны с комментариями.
<xsl:template match="udata" mode="hotel-object-view">	 
<!--
тут мы выбираем все item, то есть получаем такой xml

<item id="111" name="Аэропорт" type-id="12" ownerId="44" xlink:href="uobject://111"/>
<item id="112" name="Полежаевская, Сокол" type-id="12" ownerId="44" xlink:href="uobject://112"/>

и именно пере проработкой всех item и надо выводить строчку "Ближайшее метро:"
-->

<xsl:apply-templates select=".//property[@name = 'nearest_metro_station_spb']/value/item" mode="metro_station_list" />
</xsl:template>

<xsl:template match="item" mode="metro_station_list">
    <xsl:value-of select="@name" /><xsl:text>, </xsl:text>
<!--тут мы обрабатываем все item кроме последнего и если сюда приписать слово "Ближайшее метро:", то мы получим его около кадого пункта кроме последнего, так как последний item обрабатывается шаблоном ниже
-->
</xsl:template>
<xsl:template match="item[position() = last()]" mode="metro_station_list">
    <xsl:value-of select="@name" /><xsl:text>.</xsl:text>
</xsl:template>

P.S. и до тех пор пока вы не проясните для себя вопрос как работать с <xsl:apply-templates> и <xsl:template> или не объясните мне, что именно вам мешает с ними разобраться (из объективных причин, которые можно объяснить и помочь вам) я приостановлю свои комментарии на ваши задачи касательно проблем с использованием данных конструкций.

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
если вы пишите шаблон с таким match
<xsl:template match="property[@name='nearest_metro_station_spb']"  mode="metro_station_list"> 

то внутри этого шаблона вы работает от этого match, то есть от property и для получения доступа к узлу value вам надо писать не
.//property[@name = 'nearest_metro_station_spb']/value , а просто value    

Спасибо, admin.
Действительно ошибочка моя была в одном простом моменте с item в шаблоне - это моя торопливость и невнимательность в совокупе тому причина.

Теперь всё стало на свои места в таком работающем виде:
	 <xsl:template match="item" mode="metro_station_list">
<xsl:text>Ближайшая ст. Метро:</xsl:text>  
<span><xsl:value-of select="@name" /></span>
<xsl:text>, </xsl:text>
</xsl:template>
<xsl:template match="item[position() = last()]" mode="metro_station_list">
<span><xsl:value-of select="@name" /></span>
<xsl:text>.</xsl:text>
</xsl:template>

*

Axiomateria

  • ****
  • 322
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
И вот наконец-то мне удалось вывести на 100% правильный результат в котором заголовок перечисления станций метро "Ближайшая ст. Метро" не выводиться если не выбрано ни одно значение из списка множественного выбора.
Однако мне интересно, нельзя ли оптимизировать код приведённый ниже, а то он трёхэтажный получился в итоге таком:
 
Вызов:
<xsl:template match="udata" mode="hotel-object-view">
<xsl:apply-templates select=".//property[@name = 'nearest_metro_station_spb']" mode="metro_station_list" />
</xsl:template>
Шаблон
     <xsl:template match="property" mode="metro_station_list">
         <xsl:text>Ближайшая ст. Метро:</xsl:text>
        <xsl:apply-templates select="value" mode="metro_station_list"/>    
     </xsl:template>
     <xsl:template match="property[value = '']" mode="metro_station_list"></xsl:template>  
     <xsl:template match="value" mode="metro_station_list">
        <xsl:apply-templates select="item" mode="metro_station_list"/>  
     </xsl:template>    
     <xsl:template match="item" mode="metro_station_list">
   <xsl:value-of select="@name"/>
        <xsl:if test="not(position()=last())">, </xsl:if>
   <xsl:if test="(position()=last())">.</xsl:if>
     </xsl:template>