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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с xslt преобразованием? 
:(
    Опции темы
seeker
Дата 30.11.2005, 08:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











есть xml, примерно такой:

Код

<div>
-<tag1/>
</div>
<div>
-<tag2/>
</div>
<div>
-<tag3/>
</div>
<othertag/>
<div>
-<tag4/>
</div>


нужно получить примерно такой:

Код

<table>
-<tr>
--<td>
---<tag1/>
--</td>
-</tr>
-<tr>
--<td>
---<tag2/>
--</td>
-</tr>
-<tr>
--<td>
---<tag3/>
--</td>
-</tr>
</table>
<othertag/>
</table>
-<tr>
--<td>
---<tag4/>
--</td>
-</tr>
</table>


пояснение:
все элементы <div/> определённого уровня идущие друг за другом нужно поместить в таблицу.
другие элементы в таблицу попасть не должны.
порядок элементов должен быть сохранён.

внимание вопрос:
можно ли написать такое xslt преобразование, и если можно, то как?
М
 
Пользуемся кнопкой "код"!


Это сообщение отредактировал(а) Ignat - 30.11.2005, 11:08
  Вверх
3,14
Дата 30.11.2005, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



XML:
Код

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>

<divs> 
  <div>
   <tag1/>
  </div>
  <div>
   <tag2/>
  </div>
  <div>
   <tag3/>
  </div>
  <othertag/>
  <div>
   <tag4/>
  </div>
</divs> 


XSL:
Код

<?xml version="1.0" encoding="utf-8"?>
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/divs">
  <table>
  <xsl:for-each select="div">
     <tr>
       <td>
           <xsl:for-each select="*">
               <xsl:copy>
                   <xsl:apply-templates select="node()|@*"/>
               </xsl:copy>
           </xsl:for-each>
       </td>
     </tr>
  </xsl:for-each>
  </table>
</xsl:template>

<xsl:template match="*|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>


</xsl:stylesheet>


Результат:
Код

<?xml version="1.0" encoding="utf-8"?>

<table>
    <tr>
        <td>
            <tag1 />
        </td>
    </tr>
    <tr>
        <td>
            <tag2 />
        </td>
    </tr>
    <tr>
        <td>
            <tag3 />
        </td>
    </tr>
    <tr>
        <td>
            <tag4 />
        </td>
    </tr>
</table>



--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
seeker
Дата 30.11.2005, 13:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ето всё конечно хорошо, но нужно чтобы получилось две таблицы, разделённые <othertag/>
  Вверх
3,14
Дата 30.11.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

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



Нет, такого по-моему средствами XSLT уже не сделаешь.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
maxim1000
Дата 30.11.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



немного неопрятно, но вроде работает...
xml:
Код

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="qqq.xsl"?>

<divs> 
  <div>
   1
  </div>
  <div>
   2
  </div>
  <div>
   3
  </div>
  <othertag/>
  <div>
   4
  </div>
</divs> 

xsl:
Код

<?xml version="1.0" encoding="utf-8"?>
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/divs">
    <xsl:for-each select="*">
      <xsl:if test="self::othertag">
        table begin<br/>
        <xsl:variable name="index" select="position()"/>
        <xsl:for-each select="../*[$index > position()]">
          <xsl:apply-templates/><br/>
        </xsl:for-each>
        table end<br/>
        next table begin<br/>
        <xsl:for-each select="../*[position() > $index]">
          <xsl:apply-templates/><br/>
        </xsl:for-each>
        next table end<br/>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

результат:
Код

table begin
1 
2 
3 
table end
next table begin
4 
next table end

P.S.
теги убрал, потому как неудобно было отлаживать... думаю, с заточкой под реальный вариант проблем возникнуть не должно
P.P.S.
если будет несколько тегов othertag - можно расширять этот вариант в сторону рекурсии...


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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