powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Выборка поддерева.
5 сообщений из 5, страница 1 из 1
Выборка поддерева.
    #38148295
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за возможный клон. Вопрос возник
в контексте обсуждения реализации фильтрации поддерева.

Дано.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?xml version="1.0"?>
<document>
 <node attr1="1">
   <node attr1="2">
       <node attr5="1" attr1="0"/>
       <node attr2="4"/>
       <node attr1="1"/>
   </node>
   <node/>
   <node attr2="2">
       <node attr1="3"/>
       <node attr1="1"/>
   </node>
 </node>
</document>



Можно-ли написать соотв. XPath выражение которое выберет
поддерево включающее в себе листья с определённым атрибутом
и их родителей с сохранением иерархии?

Что то типа этого (фильтруем узлы WHERE attr1='1').

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<?xml version="1.0"?>
<document>
 <node attr1="1">
   <node attr1="2">       
       <node attr1="1"/>
   </node>  
   <node attr2="2">      
       <node attr1="1"/>
   </node>
 </node>
</document>



Спасибо всем.
...
Рейтинг: 0 / 0
Выборка поддерева.
    #38148373
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton XPath выражение ... с сохранением иерархии?XPath возвращает список, о какой иерархии может идти речь?

Если нужна отфильтрованная копия, то можно так, но это не самый быстрый способ:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<xsl:template match="node">
    <node>
        <xsl:copy-of select="@*"/>
        <xsl:if test="count(.//*[@attr1='1'])>0">
            <xsl:apply-templates select="*"/>
        </xsl:if>
    </node>
</xsl:template>
...
Рейтинг: 0 / 0
Выборка поддерева.
    #38148383
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, без цикла не обойтись.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  <xsl:template match="node">
    <node>
      <xsl:copy-of select="@*"/>
      <xsl:for-each select="*">
        <xsl:if test="count(.//*[@attr1='1'])>0 or @attr1='1'">
          <xsl:apply-templates select="."/>
        </xsl:if>
      </xsl:for-each>
    </node>
  </xsl:template>
...
Рейтинг: 0 / 0
Выборка поддерева.
    #38148417
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy, на чём вы тестируете свой код? Щас в прострации
кинулся влево-вправо - всё надо чтото накодить на Java
чтобы сделать .XSLTTransform(..)

А у вас очевидно есть какое-то оконное приложение с отладкой
или с отображением результата трансформации?
...
Рейтинг: 0 / 0
Выборка поддерева.
    #38148591
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что нужно мне, я тестирую на боевом проекте, а свои ответы сюда почти никогда не тестирую (я тут все-таки забесплатно :) — если я не прав, автор вопроса сам это выяснит или поправят коллеги. Как правило достаточно указать общее направление, а огрехи логики дело житейское.

Вообще я писал себе утилитку, но она осталась глючноватой недоделкой — я обнаружил, что в Visual Studio можно указать xml-файлу "таблицу стилей" (это и есть xsl) и даже отладить трансформацию, правда отладкой я не пользовался. Попробуйте установить себе express-версию, если не отлаживать, так хоть просто трансформировать, она должна уметь.

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


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