Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Выбрать всех предков (от корня до текущего)


Автор: Greendrake 12.5.2006, 17:41
Задача наверно довольно распространённая, но решений пока не нашёл.

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

Автор: Beard 13.5.2006, 00:06
Для этого нужно использовать ось http://www.w3.org/TR/xpath#axes 

Автор: Greendrake 13.5.2006, 08:52
Цитата(Beard @ 13.5.2006,  00:06)
Для этого нужно использовать ось http://www.w3.org/TR/xpath#axes

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

ancestor::*[@id=ID]
 

Автор: Beard 14.5.2006, 10:43
Если мы в контексте этого узла, то так:
Код

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


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

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

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

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

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

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

Во, то - что доктор прописал, спасибо! 

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

     <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-выражение?

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

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

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

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

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

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

Я давно не работаю с XML-технологиями, так что ничего специализированного посоветовать не могу, а в тех редких случаях, когда надо что-нибудь сваять, использую установленную IDE (Idea/Eclipse), либо что-нибудь вебное, типа http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_apply, либо, на худой конец, пишу код.
Посмотрите лучше http://forum.vingrad.ru/forum/topic-51822.html - возможно там что-нибудь посоветуют.

Автор: georgik87 9.7.2013, 15:13
Цитата(Beard @ 9.7.2013,  14:51)
Я давно не работаю с XML-технологиями, так что ничего специализированного посоветовать не могу, а в тех редких случаях, когда надо что-нибудь сваять, использую установленную IDE (Idea/Eclipse), либо что-нибудь вебное, типа http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog_apply, либо, на худой конец, пишу код.
Посмотрите лучше http://forum.vingrad.ru/forum/topic-51822.html - возможно там что-нибудь посоветуют.

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

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





Автор: Beard 9.7.2013, 16:03
Цитата(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.

Автор: georgik87 9.7.2013, 20:50
Цитата(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/XPATHCONSOLE/XPathConsole_exe.rar
или в XML Copy Editor 
то результат должен быть
Код

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

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

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

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

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

/*[descendant::CCC]

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)