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

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

*

Axiomateria

  • ****
  • 319
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
Здравствуйте!
В объекте каталога (гостиница) подключен справочник со множественным выбором "Ближайшее метро", где элементы соответственно станции метрополитена.
Вопрос: не могу решить вывод нескольких выбранных станций с перечислением их через запятую и в конце с точкой что б.

Пробовал применить шаблон  из файла object-view.xsl (цитирую не полностью)
   <xsl:template match="property" mode="div">
      <xsl:apply-templates select="document(concat('utype://', ../../../@type-id, '.', ../@name))/udata/group/field[@name = ./@name]/tip" mode="tip" />
      <xsl:value-of select="title" />
      <xsl:text>: </xsl:text>
      <span umi:field-name="{@name}"><xsl:apply-templates select="." /></span>
      <xsl:text>; </xsl:text>
   </xsl:template>
   
   <xsl:template match="property[last()]" mode="div">
      <xsl:apply-templates select="document(concat('utype://', ../../../@type-id, '.', ../@name))/udata/group/field[@name = ./@name]/tip" mode="tip" />
      <xsl:value-of select="title" />
      <xsl:text>: </xsl:text>
      <span umi:field-name="{@name}"><xsl:apply-templates select="." /></span>
      <xsl:text>. </xsl:text>
   </xsl:template>

НО как-то не задалось.
 

*

NOIRMAN

  • *****
  • 101
  • +16/-1
    • Просмотр профиля
Не уверен точно, но может надо position()=last() ?

*

Axiomateria

  • ****
  • 319
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
Не уверен точно, но может надо position()=last() ?
то есть в эту строчку <xsl:template match="property[last()]" mode="div">
надо вставить  position()=last()
?

*

Aisamiery

  • **
  • 83
  • +7/-4
    • Просмотр профиля
Не уверен точно, но может надо position()=last() ?
то есть в эту строчку <xsl:template match="property[last()]" mode="div">
надо вставить  position()=last()
?

да

*

Aisamiery

  • **
  • 83
  • +7/-4
    • Просмотр профиля
Ой то есть смотри

Это для всех элементов
<xsl:template match="//property[@name = 'то что нужно' ]">
    элемент, (запятая)
</xsl:template>

Это для последнего
<xsl:template match="//property[@name = 'то что нужно' ] and position() = last()">
    элемент. (точка)
</xsl:template>

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Ой то есть смотри

Это для всех элементов
<xsl:template match="//property[@name = 'то что нужно' ]">
    элемент, (запятая)
</xsl:template>

Это для последнего
<xsl:template match="//property[@name = 'то что нужно' ] and position() = last()">
    элемент. (точка)
</xsl:template>

Скорее, вот так:
<xsl:template match="//property[@name = 'то что нужно' ]">
    элемент, (запятая)
</xsl:template>
<xsl:template match="//property[@name = 'то что нужно' and position() = last()]">
    элемент. (точка)
</xsl:template>

*

Axiomateria

  • ****
  • 319
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
Скорее, вот так:
<xsl:template match="//property[@name = 'то что нужно' ]">
    элемент, (запятая)
</xsl:template>
<xsl:template match="//property[@name = 'то что нужно' and position() = last()]">
    элемент. (точка)
</xsl:template>

И снова у меня непруха,..
В шаблоне у меня вот такое:   
<xsl:template match="udata" mode="hotel-object-view">	 
<xsl:apply-templates select=".//property[@name = 'nearest_metro_station_spb']/value/item/@name" mode="metro_station_list" />
</xsl:template>

<xsl:template match="//property[@name = 'nearest_metro_station_spb' ]" mode="metro_station_list">
       <xsl:value-of select="name" /><xsl:text>, </xsl:text>
</xsl:template>
<xsl:template match="//property[@name = 'nearest_metro_station_spb' and position() = last()]" mode="metro_station_list">
       <xsl:value-of select="name" /><xsl:text>.</xsl:text>
</xsl:template>
- в результате чего названия станций метро успешно выводятся, НО без знаков пунктуации....

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
шаблон который указывает где выводить запятую, а где нет работает с узлом property, а вызов apply-templates вызывает property/value/item/@name

P.S. это самые основы xslt, еще раз внимательно проработайте цепочку шаблонов

P.P.S. в шаблоне для вывода станции вы работаете с узлом name, который якобы выведет вам название станции, хотя название станции храниться у вас в property/value/item/@name.... соответственно в шаблоне который работет с узлом property для вывода названия станции надо обращаться к value/item/@name

P.P.P.S В вашем случае, apply-templates должен перебирать property/value/item и шаблоны должны быть соответственно не для property, а для item

*

Axiomateria

  • ****
  • 319
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
шаблон который указывает где выводить запятую, а где нет работает с узлом property, а вызов apply-templates вызывает property/value/item/@name

P.S. это самые основы xslt, еще раз внимательно проработайте цепочку шаблонов

P.P.S. в шаблоне для вывода станции вы работаете с узлом name, который якобы выведет вам название станции, хотя название станции храниться у вас в property/value/item/@name.... соответственно в шаблоне который работет с узлом property для вывода названия станции надо обращаться к value/item/@name

P.P.P.S В вашем случае, apply-templates должен перебирать property/value/item и шаблоны должны быть соответственно не для property, а для item

Я доработал шаблон до такого состояния и теперь запятые показываются после названия станции:
     <xsl:template match="//property[@name = 'nearest_metro_station_spb' ]/value/item/@name" mode="metro_station_list">
       <xsl:value-of select="." /><xsl:text>, </xsl:text>
     </xsl:template>
     <xsl:template match="//property[@name = 'nearest_metro_station_spb' and position() = last()]/value/item/@name" mode="metro_station_list">
       <xsl:value-of select="." /><xsl:text>.</xsl:text>
     </xsl:template>

Однако точки после последнего названия станции нет и вместо точки запятая...

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
попробуйте работать с item, а не @name, или для наглядности выведите в каждом шаблоне position() для  каждого элемента.

*

Axiomateria

  • ****
  • 319
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
попробуйте работать с item, а не @name, или для наглядности выведите в каждом шаблоне position() для  каждого элемента.

Вы имеете ввиду работать здесь:
<xsl:apply-templates select=".//property[@name = 'nearest_metro_station_msk']/value/item/@name" mode="metro_station_list" />
или здесь:
     <xsl:template match="//property[@name = 'nearest_metro_station_spb' ]/value/item/@name" mode="metro_station_list">
       <xsl:value-of select="." /><xsl:text>, </xsl:text>
     </xsl:template>
     <xsl:template match="//property[@name = 'nearest_metro_station_spb' and position() = last()]/value/item/@name" mode="metro_station_list">
       <xsl:value-of select="." /><xsl:text>.</xsl:text>
     </xsl:template>
?
Проблема просто в том, что система в упор не видит вот эту часть:
     <xsl:template match="//property[@name = 'nearest_metro_station_msk' and position() = last()]/value/item/@name" mode="metro_station_list">
       <xsl:value-of select="." /><xsl:text>.</xsl:text>
     </xsl:template>
« Последнее редактирование: 08 Октября 2013, 21:34:20 от Axiomateria »

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
ваш предыдущий шаблон был почти верен

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

<xsl:template match="//property[@name = 'nearest_metro_station_spb' ]" mode="metro_station_list">
       <xsl:value-of select="name" /><xsl:text>, </xsl:text>
</xsl:template>
<xsl:template match="//property[@name = 'nearest_metro_station_spb' and position() = last()]" mode="metro_station_list">
       <xsl:value-of select="name" /><xsl:text>.</xsl:text>
</xsl:template>

только в нем вам надо было поменять select при вызове и match при обработке.
<xsl:template match="udata" mode="hotel-object-view">	 
<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>
</xsl:template>
<xsl:template match="item[position() = last()]" mode="metro_station_list">
       <xsl:value-of select="name" /><xsl:text>.</xsl:text>
</xsl:template>

Проверьте, заработает ли у вас такой код и разобравшись, отпишите сюда, в чем была ваша ошибка.

*

Axiomateria

  • ****
  • 319
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
в нем вам надо поменять select при вызове и match при обработке.
<xsl:template match="udata" mode="hotel-object-view">	 
<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>
</xsl:template>
<xsl:template match="item[position() = last()]" mode="metro_station_list">
       <xsl:value-of select="name" /><xsl:text>.</xsl:text>
</xsl:template>

Проверьте, заработает ли у вас такой код и разобравшись, отпишите сюда, в чем была ваша ошибка.

Проверил - вставил на замену ваши правки и в результате теперь стали выводиться только запятые и точки, а вот названия самих станций нету...

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
согласен, не досмотрел, надо было вставить @
<xsl:template match="udata" mode="hotel-object-view">	 
<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>
</xsl:template>
<xsl:template match="item[position() = last()]" mode="metro_station_list">
       <xsl:value-of select="@name" /><xsl:text>.</xsl:text>
</xsl:template>

*

Axiomateria

  • ****
  • 319
  • +5/-0
    • Просмотр профиля
    • Разработка продающих сайтов под ключ по честным ценам
согласен, не досмотрел, надо было вставить @

Отлично! Спасибо - всё получилось!