Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбрать всех предков (от корня до текущего), нужно xPath-выражение 
:(
    Опции темы
Greendrake
Дата 12.5.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: нет
Всего: 6



Задача наверно довольно распространённая, но решений пока не нашёл.

В XML-дереве у каждого узла уникальный ID в качестве атрибута - по нему выдираем этот узел. А как выдрать всех его предков до корня одним xPath-выражением, чтобы получить массив нод?   

Это сообщение отредактировал(а) Greendrake - 12.5.2006, 17:42
PM MAIL   Вверх
Beard
Дата 13.5.2006, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.7.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 9



Для этого нужно использовать ось ancestor 
PM MAIL   Вверх
Greendrake
Дата 13.5.2006, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: нет
Всего: 6



Цитата(Beard @ 13.5.2006,  00:06)
Для этого нужно использовать ось ancestor

А как именно?
Вот так например не пашет:
Код

ancestor::*[@id=ID]
 
PM MAIL   Вверх
Beard
Дата 14.5.2006, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.7.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 9



Если мы в контексте этого узла, то так:
Код

ancestor::node()[@id=ID]


если вообще все одним выражением, то, например, можно так:
Код

//*[descendant::*[@id=ID]]

- выбрать все узлы, которые являются парентами для узла с атрибутом id равным ID
 
PM MAIL   Вверх
Greendrake
Дата 14.5.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: нет
Всего: 6



Цитата(Beard @ 14.5.2006,  10:43)
если вообще все одним выражением, то, например, можно так:
Код

//*[descendant::*[@id=ID]]

- выбрать все узлы, которые являются парентами для узла с атрибутом id равным ID

Во, то - что доктор прописал, спасибо! 
PM MAIL   Вверх
georgik87
Дата 9.7.2013, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.7.2013

Репутация: нет
Всего: нет



у меня аналогичная задачка, но только приведенные примеры не работают((
например есть дерево
Код

     <AAA> 
          <BBB> 
               <CCC/> 
               <ZZZ> 
                    <DDD/> 
               </ZZZ> 
          </BBB> 
          <XXX> 
               <DDD> 
                    <EEE/> 
                    <DDD/> 
                    <CCC/> 
                    <FFF/> 
                    <FFF> 
                         <GGG/> 
                    </FFF> 
               </DDD> 
          </XXX> 
          <CCC> 
               <DDD/> 
          </CCC> 
     </AAA> 

нужно в результате получить
Код

     <AAA> 
          <BBB> 
               <CCC/> 
          </BBB> 
          <XXX> 
               <DDD> 
                    <CCC/> 
               </DDD> 
          </XXX> 
          <CCC> 
               <DDD/> 
          </CCC> 
     </AAA> 

нужно отфильтровать элементы ССС с полным путем. какое должно быть Xpath-выражение?
PM MAIL   Вверх
Beard
Дата 9.7.2013, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.7.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 9



Т.е. надо оставить все элементы, которые имеют в пути элемент ССС?
Тогда:
Код

//*[descendant-or-self::CCC or ancestor::CCC]

PM MAIL   Вверх
georgik87
Дата 9.7.2013, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.7.2013

Репутация: нет
Всего: нет



Цитата(Beard @ 9.7.2013,  13:23)
Т.е. надо оставить все элементы, которые имеют в пути элемент ССС?
Тогда:
Код

//*[descendant-or-self::CCC or ancestor::CCC]

Спасибо, а можно узнать какими вы инструментами пользуетесь для просмотра результата запроса?
PM MAIL   Вверх
Beard
Дата 9.7.2013, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.7.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 9



Цитата(georgik87 @  9.7.2013,  14:29 Найти цитируемый пост)
Спасибо, а можно узнать какими вы инструментами пользуетесь для просмотра результата запроса? 

Я давно не работаю с XML-технологиями, так что ничего специализированного посоветовать не могу, а в тех редких случаях, когда надо что-нибудь сваять, использую установленную IDE (Idea/Eclipse), либо что-нибудь вебное, типа этого редактора, либо, на худой конец, пишу код.
Посмотрите лучше здесь - возможно там что-нибудь посоветуют.
PM MAIL   Вверх
georgik87
Дата 9.7.2013, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.7.2013

Репутация: нет
Всего: нет



Цитата(Beard @ 9.7.2013,  14:51)
Я давно не работаю с XML-технологиями, так что ничего специализированного посоветовать не могу, а в тех редких случаях, когда надо что-нибудь сваять, использую установленную IDE (Idea/Eclipse), либо что-нибудь вебное, типа этого редактора, либо, на худой конец, пишу код.
Посмотрите лучше здесь - возможно там что-нибудь посоветуют.

да, я как раз там смотрел программы, особенно понравилась статья
http://www.ibm.com/developerworks/ru/libra...ools/index.html 
там много писано программ, в том числе естьи онлайн инструменты

так, вот)) я хотел чтобы вы увидели результат того выражения, он не такой как мне нужен, и я думал что может тем чем я пользуюсь глючит, но нет, он совсем не такой
или я не туда смотрю))






Это сообщение отредактировал(а) georgik87 - 9.7.2013, 15:23
PM MAIL   Вверх
Beard
Дата 9.7.2013, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.7.2005
Где: Санкт-Петербург

Репутация: 7
Всего: 9



Цитата(georgik87 @  9.7.2013,  15:13 Найти цитируемый пост)
так, вот)) я хотел чтобы вы увидели результат того выражения, он не такой как мне нужен, и я думал что может тем чем я пользуюсь глючит, но нет, он совсем не такой
или я не туда смотрю))

Так уточните, что Вам нужно?
Из примера я понял, что хочется получить все элементы, содержащие в своем пути элемент CCC, т.е.:
Код

/AAA 
/AAA/BBB 
/AAA/BBB/CCC 
/AAA/XXX 
/AAA/XXX/DDD 
/AAA/XXX/DDD/CCC
/AAA/CCC 
/AAA/CCC/DDD 

что и делает приведенный xpath.

PM MAIL   Вверх
georgik87
Дата 9.7.2013, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.7.2013

Репутация: нет
Всего: нет



Цитата(Beard @ 9.7.2013,  16:03)
Так уточните, что Вам нужно?
Из примера я понял, что хочется получить все элементы, содержащие в своем пути элемент CCC, т.е.:
Код

/AAA 
/AAA/BBB 
/AAA/BBB/CCC 
/AAA/XXX 
/AAA/XXX/DDD 
/AAA/XXX/DDD/CCC
/AAA/CCC 
/AAA/CCC/DDD 

что и делает приведенный xpath.

да, тот запрос выполнял то что вы написали, но мне нужно оставить элементы ССС со всеми предками, т.е
Код

/AAA/BBB/CCC 
/AAA/XXX/DDD/CCC
/AAA/CCC/DDD 

и если смотреть результат запроса например в 
http://codingcraft.ru/resources/XPATHCONSO...Console_exe.rar
или в XML Copy Editor 
то результат должен быть
Код

 <AAA> 
          <BBB> 
               <CCC/> 
          </BBB> 
          <XXX> 
               <DDD> 
                    <CCC/> 
               </DDD> 
          </XXX> 
          <CCC> 
               <DDD/> 
          </CCC> 
     </AAA> 


Это сообщение отредактировал(а) georgik87 - 9.7.2013, 20:51
PM MAIL   Вверх
diadiavova
Дата 9.7.2013, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(georgik87 @  9.7.2013,  21:50 Найти цитируемый пост)
то результат должен быть

Выражения XPath возвращают наборы узлов, то есть линейные коллекции. Если тебе нужно на выходе получить XML документ, то XPath тут не поможет - нужен XSLT или XQuery.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
georgik87
Дата 10.7.2013, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 8.7.2013

Репутация: нет
Всего: нет



Цитата(diadiavova @ 9.7.2013,  22:18)
Выражения XPath возвращают наборы узлов, то есть линейные коллекции. Если тебе нужно на выходе получить XML документ, то XPath тут не поможет - нужен XSLT или XQuery.

Спасибо всем)) похоже я хочу невозможно от XPath  smile 
выражение дает близкий результат
Код

/*[descendant::CCC]

может быть все-таки есть способ в контексте предков ССС исключить узлы не ССС?

Это сообщение отредактировал(а) georgik87 - 10.7.2013, 08:52
PM MAIL   Вверх
diadiavova
Дата 11.7.2013, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(georgik87 @  10.7.2013,  09:52 Найти цитируемый пост)
может быть все-таки есть способ в контексте предков ССС исключить узлы не ССС?

Перечитал фразу несколько раз, но её смысл всё равно от меня ускользнул. Я уже написал, что твоя задача решается средствами xslt или xquery. Если данная фраза означает получение того документа, о котором ты написал вначале, то эти языки и есть способы получения такого результата. Если же тебе надо получить что-то другое, непременно используя xpath, то сформулируй точно, что именно ты хочешь получить.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.3968 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.