powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Выбрать и обработать только узлы с текстом
6 сообщений из 6, страница 1 из 1
Выбрать и обработать только узлы с текстом
    #38876081
av84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Подскажите, пожалуйста, кому не трудно, каким образом можно "вырезать" из документа текстовые узлы (или узлы, содержащие непосредственно текст) и "обернуть" их в пару элементов, сохраняя атрибуты родителя?

То есть, к примеру, есть такой кусок документа:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<div id="ui_combo_bodies_all_4371"><div id="cmbBody_src_combo" class="dropdown-menu ui-cmb-body  ui-cmb-body-hidden">
    <h1 margin-left="15" id="header">Заголовок</h1>
    <div class=" ui-cmb-content-container" >
        <div class="ui-cmb-pre-content">
            <div class="ui-cmb-scrollable"><div id="ccat_tree" class="ui-tree">
               <ul>
                 <li class="lvl-1">Вопрос по работе подсистемы</li>
                 <li class="lvl-1">Вопрос по методологии</li>
                 <li class="lvl-1">Ошибка в работе подсистемы</li>
                 <li class="lvl-1">Ошибка в данных</li>
                 <li class="lvl-1">Не нашли данные?</li>
              </ul></div></div>
            <div class="ui-resizable-helper"></div>
        </div>
    <p border="1">Доп. параграф</p>  
    </div>  
</div>



А нужно получить:

Код: 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.
<block>
  <string margin-left="15" id="header">
    Заголовок
  </string>
</block>

<block>
  <string class="lvl-1">
    Вопрос по работе подсистемы
  </string>
</block>

<block>
  <string class="lvl-1">
    Вопрос по методологии
  </string>
</block>

<block>
  <string class="lvl-1">
    Ошибка в работе подсистемы
  </string class="lvl-1">
</block>

<block>
  <string class="lvl-1">
    Ошибка в данных
  </string>
</block>

<block>
  <string class="lvl-1">
    Не нашли данные?
  </string>
</block>

<block>
  <string border="1">
    Доп. параграф
  </string>
</block>



Не могу найти, как это реализовать. Простое

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    <xsl:template match="p|h1|h2|h3|h4|h5|h6|h9|i|b|div|li">
        <block>
            <string>
                <xsl:for-each select="@*">
                    <xsl:copy-of select="."/>
                </xsl:for-each>
                <xsl:apply-templates/>
            </string>
        </block>  
    </xsl:template>  

.

не помогает: получается простая замена вместо выделения текстовых узлов.

Был бы очень признателен за помощь.
...
Рейтинг: 0 / 0
Выбрать и обработать только узлы с текстом
    #38876167
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
<xsl:template match="*[text()]">
...
Рейтинг: 0 / 0
Выбрать и обработать только узлы с текстом
    #38876548
av84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_ ,

спасибо. Но, наверное, я неправильно выделяю каждый узел. Прописывая

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    <xsl:template match="*[text()]" priority="1">
        <block>
            <string>
                <xsl:for-each select="./text()">
                    <xsl:copy-of select="."/>
                </xsl:for-each>
                <xsl:apply-templates/>
            </string>
        </block>  
    </xsl:template> 



получаю такой же результат:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  <block>
    <string>
<block><string>
<block><string>
    <block><string>ЗаголовокЗаголовок</string></block>
    <block><string>
        <block><string>
            <block><string>
               <block><string>
              <block><string>Вопрос по работе подсистемыВопрос по работе подсистемы</string></block>
                 <block><string>Вопрос по методологииВопрос по методологии</string></block>
                 <block><string>Ошибка в работе подсистемыОшибка в работе подсистемы</string></block>
                 <block><string>Ошибка в данныхОшибка в данных</string></block>
                 <block><string>Не нашли данные?Не нашли данные?</string></block>
              </string></block></string></block>
        </string></block>
    <block><string>Доп. параграфДоп. параграф</string></block>  
    </string></block>  
</string></block>
</string></block></string>
  </block>
...
Рейтинг: 0 / 0
Выбрать и обработать только узлы с текстом
    #38877200
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
<xsl:template match="*[normalize-space(text()) != '']">
...
Рейтинг: 0 / 0
Выбрать и обработать только узлы с текстом
    #38877204
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
av84,

Содержимое шаблона оставьте то, какое у Вас было изнаяально
...
Рейтинг: 0 / 0
Выбрать и обработать только узлы с текстом
    #38877684
av84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_ ,

спасибо вам большое. Вы мне очень помогли.

Поначалу тоже использовал normalize-space(text()), но делал выборку по нему, считая, что возможное приведение строки к булеву типу выдернет всё нужное.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Выбрать и обработать только узлы с текстом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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