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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование XML с объединением одинаковых тегов 
:(
    Опции темы
notna
Дата 22.3.2010, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте. Мне нужно из следущего XML:
Код

<document>
    <a>
        <b>теги b</b>
        <c>теги c</c>
        <b>теги b</b>
        <b>теги b</b>
        <c>теги c</c>
        <c>теги c</c>
        <c>теги c</c>
        <d>теги d</d>
        <c>теги c</c>
        <c>теги c</c>
    </a>
    <a>
        <c>теги c</c>
        <c>теги c</c>
        <c>теги c</c>
        <b>теги b</b>
        <b>теги b</b>
        <b>теги b</b>
        <b>теги b</b>
        <d>теги d</d>
        <d>теги d</d>
        <d>теги d</d>
    </a>
    <a>
        <d>теги d</d>
        <c>теги c</c>
        <d>теги d</d>
        <b>теги b</b>
        <b>теги b</b>
    </a>
</document>

получить такой:
Код

<document>
    <a>
        <b>теги b</b>
        <c>теги c</c>
        <b>теги b теги b</b>
        <c>теги c теги c теги c</c>
        <d>теги d</d>
        <c>теги c теги c</c>
    </a>
    <a>
        <c>теги c теги c теги c</c>
        <b>теги b теги b теги b теги b</b>
        <d>теги d теги d теги d</d>
    </a>
    <a>
        <d>теги d</d>
        <c>теги c</c>
        <d>теги d</d>
        <b>теги b теги b</b>
    </a>
</document>

не получается придумать как это сделать с помощью XSL. Подскажите пожалуйста
PM MAIL   Вверх
diadiavova
Дата 22.3.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



В смысле объединить одноимённых детей узлов a, которые идут подряд что ли?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
notna
Дата 22.3.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да, совершенно верно
PM MAIL   Вверх
diadiavova
Дата 22.3.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ну вот вроде выдаёт что надо, но проверь сам. Единственное чего я не понял - это из-за чего на месте удалённых тегов остаются пустые строки smile 
Код

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

  <xsl:template match="/">
    <document>
      <xsl:apply-templates/>
    </document>
  </xsl:template>

  <xsl:template match="a">
    <a>
      <xsl:apply-templates/>
    </a>
  </xsl:template>

  <xsl:template match="a/*">
    <xsl:choose>
      <xsl:when test="(name(following-sibling::*[1]) = name(.)) and 
                  not(name(preceding-sibling::*[1])=name(.)) ">
        <xsl:element name="{name()}">
          <xsl:call-template name="join">
            <xsl:with-param name="node" select="."/>
          </xsl:call-template>
        </xsl:element>
      </xsl:when>
      <xsl:when test="name(preceding-sibling::*[1]) = name(.)"/>
      <xsl:otherwise>
        <xsl:copy-of select="." />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>


  <xsl:template name="join">
    <xsl:param name="node"/>
    <xsl:value-of select="."/>
    <xsl:if test="name($node/following-sibling::*[1]) = name($node)">
      <xsl:text> </xsl:text>
      <xsl:call-template name="join">
        <xsl:with-param name="node" select="$node/following-sibling::*[1]"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
notna
Дата 22.3.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Работает, спасибо за помощь. Буду разбираться теперь как это работает smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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