Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Объединить содержимое одинаковых элементов / 11 сообщений из 11, страница 1 из 1
20.12.2016, 13:31
    #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
21.12.2016, 11:13
    #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
21.12.2016, 11:46
    #39371727
Azur87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить содержимое одинаковых элементов
Фридрих, я не совсем задачу правильно поставил. Элемент <a> - динамический, может иметь любое название, заранее неизвестное. То есть задача выглядит так: в аналогичной структуре найти элементы с одинаковым именем на одном уровне , и объединить в один со всем содержимым. Причем уровень вложенности условно неограничен, и на любом могут быть искомые элементы. Понятно что подобные задачи решаются рекурсивно, но не совсем понимаю как это можно на XSL оформить.
...
Рейтинг: 0 / 0
21.12.2016, 13:00
    #39371833
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить содержимое одинаковых элементов
Azur87,
ну так напиши сам XML чтоб наглядней было, потому что при такой задаче простым способом не обойтись....
...
Рейтинг: 0 / 0
21.12.2016, 13:06
    #39371846
Фридрих
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить содержимое одинаковых элементов
Azur87 элементы с одинаковым именем на одном уровне

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

вот как тебя понять то, либо на одном уровне, либо на всех уровнях....так где искать то?
...
Рейтинг: 0 / 0
21.12.2016, 13:34
    #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
21.12.2016, 14:12
    #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
21.12.2016, 14:34
    #39371974
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить содержимое одинаковых элементов
Azur87забыл упомянутьВы не ответили на первый и последний вопрос
...
Рейтинг: 0 / 0
21.12.2016, 14:45
    #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
22.12.2016, 04:20
    #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
22.12.2016, 11:45
    #39372694
Azur87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объединить содержимое одинаковых элементов
Фридрих, оно, спасибо огромное!
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Объединить содержимое одинаковых элементов / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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