Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Выбрать и обработать только узлы с текстом / 6 сообщений из 6, страница 1 из 1
10.02.2015, 16:08
    #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
10.02.2015, 16:47
    #38876167
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать и обработать только узлы с текстом
Код: xml
1.
<xsl:template match="*[text()]">
...
Рейтинг: 0 / 0
11.02.2015, 08:34
    #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
11.02.2015, 16:19
    #38877200
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать и обработать только узлы с текстом
Код: xml
1.
<xsl:template match="*[normalize-space(text()) != '']">
...
Рейтинг: 0 / 0
11.02.2015, 16:20
    #38877204
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать и обработать только узлы с текстом
av84,

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

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

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


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