powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Объединить содержимое одинаковых элементов
11 сообщений из 11, страница 1 из 1
Объединить содержимое одинаковых элементов
    #39370989
Azur87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, добрый день! Имею такой xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<root>
  <a>
    <a1 attr="1">
      <result attr="aaa"/>
    </a1>
  </a>
  <a>
    <b1 attr="1">
      <result attr="bbb"/>
    </b1>
  </a>
</root>



На выходе нужно получить такой:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<root>
  <a>
    <a1 attr="1">
      <result attr="aaa"/>
    </a1>
    <b1 attr="1">
      <result attr="bbb"/>
    </b1>
  </a>
</root>

[/SRC]
Теоретически вложенность может быть любая, и на любом уровне могут попадаться элементы с одинаковым именем. Возможно ли провернуть подобное преобразование?
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39371684
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azur87,

Код: xml
1.
2.
3.
4.
5.
6.
7.
  <xsl:template match="/">
        <root>
          <a>
            <xsl:copy-of select="root/*/*"/>
          </a>
      </root>
    </xsl:template>
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39371727
Azur87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фридрих, я не совсем задачу правильно поставил. Элемент <a> - динамический, может иметь любое название, заранее неизвестное. То есть задача выглядит так: в аналогичной структуре найти элементы с одинаковым именем на одном уровне , и объединить в один со всем содержимым. Причем уровень вложенности условно неограничен, и на любом могут быть искомые элементы. Понятно что подобные задачи решаются рекурсивно, но не совсем понимаю как это можно на XSL оформить.
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39371833
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azur87,
ну так напиши сам XML чтоб наглядней было, потому что при такой задаче простым способом не обойтись....
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39371846
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azur87 элементы с одинаковым именем на одном уровне

Azur87и на любом могут быть искомые элементы.

вот как тебя понять то, либо на одном уровне, либо на всех уровнях....так где искать то?
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39371897
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<Root>
  <a>
    <b/>
  </a>
  <c/>
  <a>
    <b/>
  </a>
</Root>

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<Root>
  <a id="1">
    <b/>
  </a>
  <a sub_id="2">
    <b/>
  </a>
</Root>

Подлежат ли эти два XML объединению?
Из такого XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Root>
  <a>
    <b>
      <c1/>
    </b>
  </a>
  <a>
    <b>
      <c2/>
    </b>
  </a>
</Root>

Должен получится такой
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<Root>
  <a>
    <b>
      <c1/>
    </b>
    <b>
      <c2/>
    </b>
  </a>
</Root>

или такой
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<Root>
  <a>
    <b>
      <c1/>
      <c2/>
    </b>
  </a>
</Root>

А что должно получится из такого
Код: xml
1.
2.
3.
4.
<Root>
  <a>Test1</a>
  <a>Test2</a>
</Root>

?
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39371949
Azur87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, забыл упомянуть важный нюанс: подлежащие объединению элементы не содержат атрибутов. Следовательно:

Из такого XML
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<Root>
  <a>
    <b>
      <c1/>
    </b>
  </a>
  <a>
    <b>
      <c2/>
    </b>
  </a>
</Root>

Должен получится такой

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<Root>
  <a>
    <b>
      <c1/>
      <c2/>
    </b>
  </a>
</Root>



[/quot]
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39371974
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azur87забыл упомянутьВы не ответили на первый и последний вопрос
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39371990
Azur87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<Root>
  <a>
    <b/>
  </a>
  <c/>
  <a>
    <b/>
  </a>
</Root>

-такой xml должен объединится

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<Root>
  <a id="1">
    <b/>
  </a>
  <a sub_id="2">
    <b/>
  </a>
</Root>

- такой вариант не рассматриваем

Код: xml
1.
2.
3.
4.
<Root>
  <a>Test1</a>
  <a>Test2</a>
</Root>

- тут интересно. В принципе, подлежащие объединению элементы не должны содержать текстовые ноды. Примем, что такой ситуации не будет.
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39372515
Фридрих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azur87,

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
<root>
  <a>
    <a1 attr="1">
      <result attr="aaa"/>
    </a1>
  </a>
  <b>
    <b1 attr="1">
      <result attr="bbb"/>
    </b1>
  </b>
  <a>
    <a1 attr="2">
      <result attr="aaa"/>
    </a1>
  </a>
  <c>
    <b1 attr="1">
      <result attr="bbb"/>
    </b1>
  </c>
  <a>
    <a1 attr="3">
      <result attr="aaa"/>
    </a1>
  </a>
    <e>Test1</e>
  <e>Test2</e>
  <b>
    <b1 attr="2">
      <result attr="bbb"/>
    </b1>
  </b>
  <c>
    <b1 attr="2">
      <result attr="bbb"/>
    </b1>
  </c>
    <c>
    <b1 attr="3">
      <result attr="bbb"/>
    </b1>
  </c>
      <d>
    <b1 attr="3">
      <result attr="bbb"/>
    </b1>
  </d>
</root>


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:key match="root/*" name="name" use="local-name()"/>
    
   <xsl:template match="root">
      <xsl:copy>
         <xsl:apply-templates select="@*" />
         <xsl:apply-templates select="*[generate-id() = generate-id(key('name',local-name())[1])]" />
      </xsl:copy>
   </xsl:template>
   
    <xsl:template match="root/*">
      <xsl:copy>
         <xsl:apply-templates select="key('name', local-name())" mode="group" />
      </xsl:copy>
   </xsl:template>
   
 <xsl:template match="root/*" mode="group">
        <xsl:copy-of select="*"/>
   </xsl:template>
   
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
 
</xsl:stylesheet>


ты так хотел? все элементы первого уровня объединены...
...
Рейтинг: 0 / 0
Объединить содержимое одинаковых элементов
    #39372694
Azur87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Фридрих, оно, спасибо огромное!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Объединить содержимое одинаковых элементов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]