Нужен XPath для возврата набора узлов (дедушка [нет дядей] + родитель [нет братьев и сестер] + сам - PullRequest
0 голосов
/ 02 октября 2009

Пример того, что я ищу. Вот входные данные:

<AAA>
  <BBB id='1'>
    <CCC  id='1'>
       <DDD  id='1'/>
       <DDD  id='2'/> 
    </CCC>
    <CCC id='2'>
       <DDD  id='3'/>
       <DDD  id='4'/> 
    </CCC>
  </BBB>
  <BBB id='2'>
    <CCC  id='3'>
       <DDD  id='5'/>
       <DDD  id='6'/> 
    </CCC>
    <CCC id='4'>
       <DDD  id='7'/>
       <DDD  id='8'/> 
    </CCC>
  </BBB>
</AAA>

Вот набор узлов, который я хочу выбрать (DDD с идентификатором 1, это родитель и дедушка):

  <BBB id='1'>
    <CCC  id='1'>
       <DDD  id='1'/>
    </CCC>
  </BBB>

Другими словами, прямая линия от себя к прародителю и только к этим узлам.

Ответы [ 4 ]

1 голос
/ 02 октября 2009

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

Однако вы можете выбрать запрошенные узлы: вы получите список их вместо иерархии.

Вот простой XPath, который выполнит это:

//DDD[@id = '1'] | //DDD[@id = '1']/.. | //DDD[@id = '1']/../..

Обратите внимание, что использование пути // может повлиять на производительность. Вы можете расширить // до /AAA/BBB/CCC/

Если вы хотите поэкспериментировать с этим, вы можете запустить выражения XPath для произвольного XML с помощью моего онлайн-инструмента, здесь .

Удачи!

0 голосов
/ 02 октября 2009

Теперь я думаю, что мой вопрос не имеет смысла. На самом деле, я пытаюсь решить проблему создания документов с помощью только XPath - XPath недостаточно. Спасибо всем, кто откликнулся.

0 голосов
/ 02 октября 2009

Если исходной точкой является DDD с @id = 1:

. | parent::CCC | ancestor::BBB

Возвращает набор узлов, содержащий DDD, его родителя и прародителя.

0 голосов
/ 02 октября 2009
AAA\BBB[CCC\DDD\@id = '1']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...