Перейти к содержимому

Фотография

Обращение к веткам с общим родителем в XPath


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 hyperstan

hyperstan

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Константин Влад

Отправлено 25 февраля 2015 - 08:44

Есть ветка в которой количество наследников может меняться.
<a>
  <b>
    <c>
     <d>
        <e>eee1</e>
         <f>5</f>
     </d>
   </c>
    <c>
      <d>
         <e>eee2</e>
         <f>4</f>
      </d>
    </c>
    <c>
      <d>
         <e>eee3</e>
         <f>5</f>
      </d>
    </c>
  </b>
</a>

Всем доброго времени суток. Ознакомился с некоторыми вариантами обращения к веткам у которых общий родитель. Вопросов стало больше чем ответов. Мне посоветовали использовать descendant. Читал о descendant, из того что понял:

 

/предок[параметр]/descendant::наследник[параметр]

 

Как обратиться только к одной определённой ветке <d><f>5</f></d>?
Например вот этой:

      <d>
         <e>eee3</e>
         <f>5</f>
      </d>
Есть вопросы по синтаксису в XPath и функциям. Порекомендуйте ресурс или чтиво где это подробно описано.

Заранее благодарен.


  • 0

#2 Tishka

Tishka

    Постоянный участник

  • Members
  • PipPipPip
  • 211 сообщений
  • ФИО:Ахрамеев Антон

Отправлено 25 февраля 2015 - 09:01

Установите плагин FirePath для FF. 

Вот неплохая ссылочка по Вашему вопросу.


  • 0

#3 aksas

aksas

    Активный участник

  • Members
  • PipPip
  • 130 сообщений
  • Город:Харьков

Отправлено 25 февраля 2015 - 10:25

а для вашего примера xpath может выглядеть вот так:
//d/e[contains(text(), 'eee3')]/following-sibling::f[1]
или так
//e[contains(text(), 'eee3')]/../f
 
по xpath'ам я обычно вот тут освежаю память :)


  • 0

#4 hyperstan

hyperstan

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Константин Влад

Отправлено 25 февраля 2015 - 10:49

а для вашего примера xpath может выглядеть вот так:
//d/e[contains(text(), 'eee3')]/following-sibling::f[1]
или так
//e[contains(text(), 'eee3')]/../f
 
по xpath'ам я обычно вот тут освежаю память :)

Попробую перефразировать вопрос:

Есть ветка <a></a> из которой ответвляются 3 ветки.

<a>
      <d> карман №1
          <e>монета номиналом 10 копеек</e>
          <f>количество 5 шт</f>
      </d>
   
      <d> карман №1
           <e>монета номиналом 15 копеек</e>
           <f>количество 3 шт</f>
      </d>
    
      <d>карман №1
           <e>монета номиналом 50 копеек</e>
           <f>количество 5 шт</f>
      </d>
</a>

Как обратиться к ветке <f>количество 5 шт</f> родитель которой содержит наследника содержащего <e>монета номиналом 50 копеек</e> ?


Сообщение отредактировал hyperstan: 25 февраля 2015 - 11:02

  • 0

#5 tab15

tab15

    Активный участник

  • Members
  • PipPip
  • 128 сообщений

Отправлено 25 февраля 2015 - 11:23

//a/d/e[contains(text(),'50 копеек')]/following-sibling::f

Например так?


  • 0

#6 aksas

aksas

    Активный участник

  • Members
  • PipPip
  • 130 сообщений
  • Город:Харьков

Отправлено 25 февраля 2015 - 11:24

так, давайте по порядку. Возможно два случая - в первом ваши 50 копеек всегда 3й по порядку, тогда просто //a/d[3]/f

в вашем случае, как я понял, это не гарантируется. Тогда делаем так:

1. ищем узел содержащий монета номиналом 50 копеек

//e[contains(text(), 'монета номиналом 50 копеек')]

2. берем его родителя

//e[contains(text(), 'монета номиналом 50 копеек')]/..

3. у родителя берем узел f

//e[contains(text(), 'монета номиналом 50 копеек')]/../f

 

или

2а. берем первого родича с тэгом f:

//e[contains(text(), 'монета номиналом 50 копеек')]/following-sibling::f[1]

шаг 3 тогда не нужен.

 

Если вам нужно получить текст в узле f, то добавляете /text()


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных