Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как преобразовать древовидный html в плоский? 
:(
    Опции темы
notna
Дата 14.5.2010, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 22.3.2010

Репутация: нет
Всего: нет



Добрый день. Никак не могу решить следующую задачу. Есть кусок html:
Код

<p>
    aaaa aaaa aaa
    <b>ddd ddd ddd</b>
    bbb bbb bbb
    <img src="pic.jpg"/>
    ccc ccc ccc    
    <i>
        eee 
        <u>eee</u> 
        eee
    </i>
    fff fff fff 
</p>

Из него требуется сделать такой html:
Код

<div>
    aaaa aaaa aaa
    <b>ddd ddd ddd</b>
    bbb bbb bbb
</div>
<div>
    <img src="pic.jpg"/>
</div>
<div>
    ccc ccc ccc    
    <i>
        eee 
        <u>eee</u> 
        eee
    </i>
    fff fff fff 
</div>

Подскажите пожалуйста xsl преобразование, что-то самому не получается
PM MAIL   Вверх
diadiavova
Дата 14.5.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Даааа, повозился я с твоей задачей. Но вроде работает
Код

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <p>
      <xsl:apply-templates select="p/node()[1]"/>
    </p>
  </xsl:template>
  <xsl:template match="p/node()[1]">
    <xsl:call-template name="div">
      <xsl:with-param name="start" select="."/>
    </xsl:call-template>
  </xsl:template>
  
  
  <xsl:template name="div">
    <xsl:param name="start"/>
    <xsl:variable name="count">
      <xsl:call-template name="counter">
        <xsl:with-param name="start" select="$start"/>
      </xsl:call-template>
    </xsl:variable>
    <div>
      <xsl:copy-of select="$start"/>
      <xsl:for-each select="$start/following-sibling::node()[position() &lt; $count]">
        <xsl:copy-of select="."/>
      </xsl:for-each>
    </div>
    <xsl:variable name="next" select="$start/following-sibling::node()[count($start/preceding-sibling::node()) + $count]"/>
    <xsl:if test="$next">
      <xsl:call-template name="div">
        <xsl:with-param name="start" select="$next"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

  <xsl:template name="counter">
    <xsl:param name="start"/>
    <xsl:param name="count" select="0"/>
    <xsl:choose>
      <xsl:when test="name($start/following-sibling::node()[1]) = 'img'">
        <xsl:value-of select="1"/>
      </xsl:when>
      <xsl:when test="$start/following-sibling::node() and 
              (name($start/following-sibling::node()[1]) != 'img') and 
              (name($start) != 'img')">
        <xsl:variable name="ccc">
        <xsl:call-template name="counter">
          <xsl:with-param name="start" select="$start/following-sibling::node()[1]"/>
          <xsl:with-param name="count" select="$count"/>
        </xsl:call-template>
        </xsl:variable>
        <xsl:value-of select="$ccc + 1"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$count"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  
</xsl:stylesheet>



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0387 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.