Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для benya

Старожил


Сообщения: 302
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


Все это смахивает на какое-то шаманство Где собственно отделение логики от контента??? ))))
Чем дальше тем больше понимаешь что мы просто перетаскиваем часть кода из PHP или PERL в шаблонные правила XSLT. Дизайнеру там делать нечего )
А еще к слову что XSLT не сложнее HTML отвечу на собственный вопрос по поводу группировки по трем значениям (подсказали умные люди на форуме). Тоесть создание древовидного меню с уникальными значениями:
Входной XML
Код: Выделить весь код
<menu>
<item category="Рафтинг" country="Украина" namen="Днестр"/>
<item category="Рафтинг" country="Россия" namen="Карелия"/>
<item category="Рафтинг" country="Россия" namen="Байкал"/>
<item category="Треккинг" country="Украина" namen="Днестр"/>
<item category="Рафтинг" country="Россия" namen="Карелия"/>
<item category="Рафтинг" country="Россия" namen="Карелия"/>
<item category="Спелео" country="Россия" namen="Алтай"/>
<item category="Рафтинг" country="Украина" namen="Черемош"/>
</menu>
XSLT:
Код: Выделить весь код
<xsl:key name="category" match="item" use="@category"/>
<xsl:key name="country" match="item" use="concat(@category,'-',@country)"/>
<xsl:key name="name" match="item" use="concat(@category,'-',@country,'-',@namen)"/>
<xsl:template match="menu">
  <list><xsl:text>
</xsl:text>
    <xsl:apply-templates select="item[generate-id(.) = generate-id(key('category',@category))]"/>
  </list>
</xsl:template>
  
<xsl:template match="item">
  <category name="{@category}"><xsl:text>
</xsl:text>
  
    <xsl:for-each select="key('category',@category)">
      <xsl:variable name='country' select="key('country', concat(@category,'-',@country))"/>
      
      <xsl:if test="generate-id(.) = generate-id($country)">
        <country name="{@country}"><xsl:text>
</xsl:text>
          <xsl:apply-templates select='$country' mode='country'/>
        </country><xsl:text>
</xsl:text>
      </xsl:if>
    </xsl:for-each>
    
  </category><xsl:text>
</xsl:text>
</xsl:template>

<xsl:template match='item' mode='country'>
<xsl:variable name='name' select="key('name', concat(@category,'-',@country,'-',@namen))"/>
<xsl:if test="generate-id(.) = generate-id($name)">
<item name='{@namen}'/><xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
Выход:
Код: Выделить весь код
<category name="Рафтинг и сплавы">
 <country name="Украина">
   <item name="Днестр"></item>
   <item name="Черемош"></item>
   <item name="Тиса"></item>
   <item name="Черный Черемош"></item>
   <item name="Южный Буг"></item>
   <item name="Десна"></item>
   <item name="Рось"></item>
   <item name="Северский Донец"></item>
 </country>
 <country name="Россия">
   <item name="Карелия"></item>
   <item name="Байкал"></item>
   <item name="Алтай"></item>
   <item name="Кавказ"></item>
   <item name="Урал"></item>
 </country>
</category>
...
Глаза сломать тут можно точно. Но хочу вам сказать что лучше рыться в этом, чем в бесчисленных шаблонах разнообразных шаблонизаторов.

Отправлено: 17:40, 19-02-2006 | #92